シェルスクリプトの平文パスワードをセキュアにする方法(別解)
シェルスクリプトの平文パスワードをセキュアにする方法、大変面白い。
余白の書きなぐり - シェルスクリプトの平文パスワードをセキュアにする方法
http://auewe.hatenablog.com/entry/2014/04/14/213319
余白の書きなぐり - シェルスクリプトの平文パスワードをセキュアにする方法(続き)
http://auewe.hatenablog.com/entry/2015/08/03/234325
を拝見して大変感銘を受けました。
昔、似たようなことをしてたので晒してみる。
いや、Linuxのログイン認証の機能を、そのままシェルスクリプトで実現しただけなんだけど。
当時たしか、Webインタフェースから、コマンド実行させるCGIを作ったんだけど、認証をどうするか考えて、こんな感じにしてた。
まず、これだと平文だよね。
#!/bin/sh PASSWORD="hoge"
平文のまま記録したくないのでハッシュにしてみる。
当時はMD5にしてたんだけど、このご時世なら sha512 がいいでしょう。
$ echo -n "hoge"|md5sum ea703e7aa1efda0064eaa507d9e8ab7e - $ echo -n "hoge"|sha512sum dbb50237ad3fa5b818b8eeca9ca25a047e0f29517db2b25f4a8db5f717ff90bf0b7e94ef4f5c4e313dfb06e48fbd9a2e40795906a75c470cdb619cf9c2d4f6d9 -
md5sumやsha512sumは、一般的なLinuxディストリビューションにはインストールされているので、普通に使えます。
これを比較するだけ
#!/bin/sh PASSWORD="dbb50237ad3fa5b818b8eeca9ca25a047e0f29517db2b25f4a8db5f717ff90bf0b7e94ef4f5c4e313dfb06e48fbd9a2e40795906a75c470cdb619cf9c2d4f6d9" USER_INPUT_HASH=`echo -n "${1}"|sha512sum|awk '{print $1}'` if [ "${PASSWORD}" == "${USER_INPUT_HASH}" ] then echo "認証OK" else echo "認証NG" exit 1 fi
さらにここを参照して、パスワード部分を別のテキストファイルに分離すると、よりセキュアに!!!1
(Linuxは昔、/etc/passwordにハッシュされたパスワードが書かれてたんだけど、/etc/shadowに分離した…という同じ歴史を辿ってて草)
同じパスワードなら、同じハッシュ値になって類推できちゃうんじゃないかって?辞書攻撃に弱い?
よろしい、ではソルトを加えましょう!
準備
0から99までのランダムな値をソルトとして指定し、ハッシュを得る。
(ソルトの値の範囲は、もっともっと大きくしてもいいと思う。)
$ echo -n "$(( $RANDOM % 99 ))hoge"|sha512sum 3ea3e82f7a6ebf35765d098e53a5bea1eba590ee2c04e9dec6c6fdcf57eecfd2d5c3921108e02cb84a33519cefac4a2d627fd2cd085dbab8d9bcddb75457f2aa -
認証ソースのサンプル
#!/bin/sh PASSWORD="3ea3e82f7a6ebf35765d098e53a5bea1eba590ee2c04e9dec6c6fdcf57eecfd2d5c3921108e02cb84a33519cefac4a2d627fd2cd085dbab8d9bcddb75457f2aa" for SALT in `seq 0 99` do USER_INPUT_HASH=`echo -n "${SALT}${1}"|sha512sum|awk '{print $1}'` if [ "${PASSWORD}" == "${USER_INPUT_HASH}" ] then echo "認証OK" break fi if [ "${SALT}" == "99" ] then echo "認証NG" sleep 10 # sleepするのは、ブルートフォース対策 exit 1 fi done exit 0
結果
$ ./sample.sh fuga 認証NG $ ./sample.sh hoge 認証OK
コメント