シェルスクリプトの平文パスワードをセキュアにする方法(別解)

シェルスクリプトの平文パスワードをセキュアにする方法、大変面白い。
Added by kanata about 3 years ago

余白の書きなぐり - シェルスクリプトの平文パスワードをセキュアにする方法
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

Comments

Add picture from clipboard (Maximum size: 100 MB)