web-dev-qa-db-ja.com

mysqlと同じ方法でパスワードを暗号化する

ユーザーを作成しましたが、パスワードを忘れました

 mysql> 'right'で識別されるユーザー 'blayo' @ '%'を作成します; 

どのLinuxコマンドラインツールで実行できますかmysql 5.5と同じ方法でパスワードを暗号化しますか?

 mysql> mysql.userからパスワード、ユーザーを選択
 ------------------------------ ------------ + ------- + 
 * 920018161824B14A1067A69626595E68CB8284CB | blayo | 

...正しいものを使用していることを確認します

 $ツール権限
 * 920018161824B14A1067A69626595E68CB8284CB 
16
Philippe Blayo

さて、ささいな(おそらくcheating)方法は実行することです:

mysql -NBe "select password('right')"

これは、mysqlのバージョンが使用するパスワードハッシュ方式を使用してパスワードを生成します。 [[〜#〜] edit [〜#〜]:-NBを追加しました。これにより、列名とASCIIテーブルアートが削除されます。]

13
jsbillings

いくつかのワンライナー:

MySQLser)-pを追加する必要がある場合があります):

mysql -NBe "select password('right')"

---(Python

python -c 'from hashlib import sha1; print "*" + sha1(sha1("right").digest()).hexdigest().upper()'

Perl

Perl -MDigest::SHA1=sha1_hex -MDigest::SHA1=sha1 -le 'print "*". uc sha1_hex(sha1("right"))'

[〜#〜] php [〜#〜]

php -r 'echo "*" . strtoupper(sha1(sha1("right", TRUE))). "\n";'

ルビー

Ruby -e 'require "digest/sha1"; puts "*" + Digest::SHA1.hexdigest(Digest::SHA1.digest("right")).upcase'

すべての出力:

* 920018161824B14A1067A69626595E68CB8284CB

12
alexjhart

MySQLはコマンドラインとログでパスワードを難読化しないので、私の心はまだ打撃を受けています。 @Gillesの回答にコメントするのではなく、それが回答を追加する唯一の理由です。

したがって、もちろん、あなたはcould管理者としてMySQLにログインし、@ patrixが示唆するように、blayoユーザーの新しいパスワードを設定するだけです。

ただし、これを行う標準的な方法は、MySQLのpassword()関数を使用することです。これは、プレーンテキストのパスワードを引数として受け取ります(真剣に?)。

これを行う場合は、MySQLユーザーのパスワードのプレーンテキストバージョンをbash履歴とMySQLログに残しておくと、後でこれらのログファイルにアクセスできた人が簡単に取得できます。

画面やログにエコーしないでパスワードを要求する小さなユーティリティを用意して、結果のMySQL互換ハッシュを提供するほうがいいのではないでしょうか。

したがって、@ Gillesの回答を少しだけ変更して、次のようなPythonを使用する小さなシェルスクリプトはどうでしょうか。これを簡単に変更して、MySQLデータベースに対してSQLステートメントを実行し、パスワードを一度に設定できます。しかし、それほど遠くに行かなくても、結果のハッシュをコピーしてSQLステートメントに貼り付け、usersテーブルを更新するだけです。

#!/bin/bash

mysqlpwd=$(/usr/bin/python -c 'from hashlib import sha1; import getpass; print "*" + sha1(sha1(getpass.getpass("New MySQL Password:")).digest()).hexdigest()')

echo $mysqlpwd
6
Craig

シェルを使用してもう1つ:

_echo -n 'right' | sha1sum | xxd -r -p |\
sha1sum | tr '[a-z]' '[A-Z]' | awk '{printf "*%s", $1}'
_

説明:

  1. _echo -n_改行なしで印刷
  2. _sha1sum_最初のSHA1
  3. _xxd -r -p_ハッシュをunhex
  4. _sha1sum_秒SHA1
  5. _tr '[a-z]' '[A-Z]'_大文字に変換
  6. _awk '{print "*" $1}'_先頭を追加*

詳細:

2.と3.の間で、オプションの_awk '{printf "%s", $1}'_ステップを改行およびハイフンの削除用に挿入できます。しかし、xxdはとにかくそれらを無視します(dave_thompson_085に感謝)。

さらに、ステップ5と6は、{print "*" toupper($1)}に置き換えることで一度に実行できます(dave_thompson_085に感謝)。

5
Murmel

ハッシュはsha1(sha1(password)) です。 salt (これは重大なセキュリティ上の欠陥です)がないため、 ハッシュをテーブルで検索 できます。

POSIXツールとsha1sum from GNU coreutilsまたはBusyBox、sha1(sha1(password))は、sha1sumコマンドは、ダイジェストを16進数で出力します。バイナリに変換する標準のツールはありません。

awk "$(printf %s 'right' | sha1sum |
       sed -e 's/ .*//' -e 's/../, 0x&/g' \
           -e 's/^/BEGIN {printf "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c"/' \
           -e 's/$/; exit}/')" | sha1sum

Pythonの標準ライブラリには標準ダイジェストがあるため、シンプルな1行です。

printf %s 'right' |
python -c 'from hashlib import sha1; import sys; print sha1(sha1(sys.stdin.read()).digest()).hexdigest()'

または、ワンライナー内のパスワードで:

python -c 'from hashlib import sha1; print sha1(sha1("right").digest()).hexdigest()'

シェルを使用する別の

echo -n 'right' | openssl sha1 -binary | openssl sha1 -hex | \
    awk '{print "*"toupper($0)}'

...出力:

*920018161824B14A1067A69626595E68CB8284CB
1
Chris Martin

ユーザーをクレートしてパスワードを忘れた場合は、これを行う必要があり、簡単です。

これは私が一度に100億のことをしているときにも数十回起こりました。パスワードを回復する最良の方法は次のとおりです。

最初にMySQLサーバーを完全に停止しました

mysqld_safe --skip-grant-tables&を発行

次に、パスワードを発行せずにrootとしてログインしました。mysql-u mysql-userだけです(mysqld_safeの後にログインできます)。

次に、mysql> userテーブルに移動し、ユーザーのパスワードを更新します

次に戻ってmysqlを再起動します

それが機能するかどうかを確認し、私たちに知らせてください。

1
unixmiah

MySQL 4.1+はダブルSHA1を使用します

> SELECT PASSWORD("right")
*920018161824B14A1067A69626595E68CB8284CB

> SELECT SHA1(UNHEX(SHA1("right")))
920018161824B14A1067A69626595E68CB8284CB

sh-3.2# php -r 'echo "*" . sha1(sha1("right", TRUE)). "\n";'
*920018161824b14a1067a69626595e68cb8284cb

このアルゴリズムは、他の言語に簡単に移植できます。違いは、「select password」のパスワードハッシュは常に「*」文字で始まることです。

0
Diogo Nechtan