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


15

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

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

mysql 5.5と同じ方法でパスワード暗号化できるLinuxコマンドラインツールはどれですか?

mysql> mysql.userからPassword、Userを選択します
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | blayo |

...必ず正しいものを使用する

$ツール権
* 920018161824B14A1067A69626595E68CB8284CB

2
管理者としてログインして新しいパスワードを定義できないのはなぜblayoですか?それは、適切な組み合わせを見つけるために、数兆の可能な文字の組み合わせを実行するよりも確実に高速です。
-nohillside

同じ質問を複数のStack Exchangeサイトに投稿しないでください。DBAバージョンも回答されていますが、これは労力の無駄です。
ジル「SO-悪であるのをやめる」

回答:


13

さて、ささいな(おそらく不正行為)の方法は、実行することです。

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

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


6
そして、便利なことに、これにより、MySQLログとbashアカウント履歴ログの両方に、光沢のある新しいパスワードがクリアテキストで保存されます。
クレイグ

@Craig両方を防ぐために、直前に ''(スペース)を追加mysqlしてbash履歴から非表示にし、SET sql_log_off=ON;直前で使用SELECT ...してMySQLログから非表示にすることができます。
マーメル

1
@Murmel、更新ありがとう!もちろん、デフォルトではパスワードを記録しないようにする必要があります。セキュリティは常にデフォルト設定にする必要があります。
クレイグ

@Craigフェアが、これはすでにMySQLの(V5.7、この機能が存在する最後のバージョンと取り出してしまったことによって行われなければv8.0.11上)):1.クライアント側(影響.mysql_history)すべての一致ステートメントを無視*PASSWORD*し、2.サーバーサイドをいくつかのステートメント(を除くSELECT)。参照:MySQL 5.7マニュアル-パスワードとロギングおよびMySQL
5.7-

それは良いフィードバックです!残念ながら、さまざまな理由(自分自身を含む)で5.7よりも古いバージョンのmysqlを使用し続けている人がかなりいます。
クレイグ

12

一部のワンライナー:

MySQL(-u(user)-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


おかげで、私はあなたの答えにリンクしたserverfault.com/a/846281/236916
mwfearnley

@alexjhart新しいmysql 5.7.8パスワードハッシュアルゴリズムのアップデートを入手できますか?(たぶん、これをどのように発見したかについて少し詳しく教えてください)
ThorSummoner

6

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

したがって、もちろん、@ patrixが示唆したように、管理者としてMySQLにログインし、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

@HalosGhost; 編集は何でしたか?何も変わりませんでしたか?;-)
クレイグ14

構文の強調表示(編集の概要に記載されているように)を実施し、編集の実際のテキストで明らかにしました。
HalosGhost 14

3
ああ、そう。正直なところ、自分が何をしたのかわかりませんでした(明らかに<!-- language: lang-bsh -->行を追加しました)。ハンディ!私はそれが好きです。ありがとう!
クレイグ14

5

シェルを使用してもう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 ハッシュを16進数に戻します
  4. sha1sum 2番目の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に感謝)に置き換えることで一度に実行できます。


1
awk大文字にすることができ、不完全な(最後の)行を端末に出力するのは不便です.. | sha1sum | awk '{print "*" toupper($1)}'。NLやのハイフンについても心配する必要はありませんxxd -r -p。それらは無視されます。
dave_thompson_085

4

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

sha1sumGNU coreutilsまたはBusyBoxのPOSIXツールだけで、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の標準ライブラリには標準ダイジェストが含まれているため、シンプルなワンライナーです。

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()'

私は精神的にこの答えを愛していますが、それはまったく機能していません。Enterキーを押しても、先に進むのではなく入力を読み続けたいと思っています。また、入力は画面にエコーバックされるため、望ましくない場合があります。しかし、このようなものはどうですか?unix.stackexchange.com/a/155583/37401
クレイグ

@Craig対話型入力の読み方は、質問の範囲を超えています。スクリプトにはすでにパスワードがあると仮定しています。通常、ファイルに保存されるため、データベースのパスワードをインタラクティブに入力することはほとんどありません。インタラクティブな入力を読みたい場合は、read組み込みのシェルを使用して行を読むことができます。stty echoエコーをオフにしssty +echoて再度オンにする場合は、最初に実行します。Pythonでは、getpassモジュールを使用できます。
ジル「SO-悪であるのをやめる」

ええ、私は知っています...そして十分に公正です!私は行く先で恐ろしいセキュリティを嫌い、MySQLのセキュリティは一般的にかなり恐ろしいので、チャンスがあればどこでも少しセキュリティの洞察を注入したいというこの無作法な傾向があります。;-)
クレイグ

1

ユーザーを作成し、パスワードを忘れた場合、これはあなたがすべきことであり、それは簡単です。

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

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

発行されたmysqld_safe --skip-grant-tables&

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

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

その後、戻ってmysqlを再起動します

それが機能するかどうかを確認し、お知らせください。


これは、特定のユーザーとしてだけではなく、まったくログインできない場合のほうが多いようです。
mwfearnley

1

別のシェルを使用して

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

...出力:

*920018161824B14A1067A69626595E68CB8284CB

0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.