私はLinuxとPHPで暗号化と復号化を学んでいます。したがって、opensslとこれがパスワードハッシュを生成する方法について3つの質問があります。
1-linuxコマンドを使用してパスワードを生成したとします。
openssl passwd
最初の観察は、ハッシュが作成されるたびに異なることです!なぜそんなことですか?塩のせいですか?これが私の最初の質問です。
2- 2番目の質問は、このパスワードをテストすることです。このパスワードの正確性をテストし、それが正しいかどうかに関するバイナリの答えを取得したいとします。 opensslを使用してこれを行うにはどうすればよいですか?私の質問が理解できない場合、何がopenssl passwd
役に立ちますか?
3 - ハッシュを使用してパスワードを暗号化し、openssl passwd
毎回ランダムなソルトを追加する場合、opensslはどのようにパスワード(または他のプログラム)を復号化しますか?
ありがとうございます。
答え1
openssl はアルゴリズムとソルトを使用してパスワードを暗号化します。塩を提供しない場合は、ランダムに選択されます。
塩は結果のハッシュに与えられます。
例えば
openssl passwd -1 foo
$1$pyuddMjp$3.deTnHdrVVVLoh5zkQ0B.
どこ
- 1はプロトコルです(ここではmd5です)。
- pyuddMjpは塩です
あなたがpasswd(例えば、foo)を知っているかどうかを確認するには、saltでpasswdオプションを使用して結果のハッシュを比較する必要があります。
x=バー
openssl passwd -1 -salt pyuddMjp $x $1$pyuddMjp$kNkQHWoF8WVh7Oxvae5YX1
x=fooの場合
openssl passwd -1 -salt pyuddMjp $x $1$pyuddMjp$3.deTnHdrVVVLoh5zkQ0B。
答え2
まず、opensslコマンドは通常パスワードを暗号化するために使用されません。以下からopensslについて読むことができます。http://en.wikipedia.org/wiki/OpenSSL
Unixシステムでは、パスワードは一方向ハッシュを使用して暗号化されているため、元のパスワードを回復するために復号化することはできません。
暗号化の一形態では、ソルトは通常所定の文字列であるか、最初の数文字などのプレーンテキストバージョンで生成され、それを使用してハッシュを再生成してそれらを比較します。
PHPに言及しているので確認してください。PHP暗号化詳しくは、機能をご覧ください。
答え3
許可された回答に基づいて構築します。パスワードハッシュが元々設定されたパスワードと一致することを確認したいと思います。アイデア設定。
まず、コマンドライン履歴にパスワードを表示したくありません。
# cat > pass.txt
mypasswd1
<ctrl>+d
# cat > badpass.txt
faulty
<ctrl>+d
次にMD5ハッシュを生成します。
# RET=$(openssl passwd -1 -in pass.txt)
# echo $RET
$1$nhyuaE7S$ld2wuucUlRUQE8iAnJhjF/
"salt"は、$で区切られた3番目のフィールドです(先行/nullフィールドを含む)。 「塩」を保存
# SALT=$(echo $RET | cut -d\$ -f 3)
# echo $SALT
nhyuaE7S
したがって、パスワードが実際にMD5ハッシュと一致することを確認するために、変数に格納された$RET
ハッシュを「test」の最初の行と比較します。
# echo "$RET" ; openssl passwd -1 -salt "$SALT" $(cat pass.txt) "$RET"
$1$nhyuaE7S$ld2wuucUlRUQE8iAnJhjF/
$1$nhyuaE7S$ld2wuucUlRUQE8iAnJhjF/
$1$nhyuaE7S$3pGvIF7UwuvhJjXzR4Yb.0
一致しているようです。diff
確認してみましょう。
# diff <(echo "$RET") <(openssl passwd -1 -salt "$SALT" $(cat pass.txt) "$RET" | head -1)
# echo $?
0
これまでは大丈夫です。しかし、「間違った」パスワードも確認し、一致するパスワードがないか見てみましょう。
# echo "$RET" ; openssl passwd -1 -salt "$SALT" $(cat badpass.txt) "$RET"
$1$nhyuaE7S$ld2wuucUlRUQE8iAnJhjF/
$1$nhyuaE7S$t6MTdY2QafzUtBMMVzf5B.
$1$nhyuaE7S$3pGvIF7UwuvhJjXzR4Yb.0
# diff <(echo "$RET") <(openssl passwd -1 -salt "$SALT" $(cat badpass.txt) "$RET" | head -1) >/dev/null
# echo $?
1
これで、保存されたMD5ハッシュ(設定ファイルなど)がパスワードと一致するかどうかを実際に「証明」するテストがあります。考えるそうだね
私の仮定が間違っているか間違っている場合は、コメントで教えてください。