tkuchikiの日記

Linux やプログラミングについて書きます。

perl, php, python の標準モジュールで /etc/shadow の hash を生成する方法

※追記
/etc/shadow の hash を生成するコマンドを作りました - tkuchikiの日記
で環境依存しない方法を紹介しています。

useradd や chef の user resource で password を設定するときに必要になる、
/etc/shadow の hash を生成する方法です。

/etc/shadow については、

などのページを読むと理解が深まると思います。

hash 生成方法

perl, php, python での生成方法は以下のとおりです。

perl
$ perl -E 'say crypt("PASSWORD", "\$6\$". crypt(rand, rand 100))'
php
$ php -r 'echo crypt("PASSWORD","$6$".sha1(uniqid(mt_rand(),true))), PHP_EOL;'

# sha512 版
$ php -r 'echo crypt("PASSWORD","$6$".hash("sha512", uniqid(mt_rand(),true))), PHP_EOL;'

※追記

history にパスワードが残るという意見をいただいたので、github から script を取ってきて実行する方法を用意しました。

$ curl -s https://raw.githubusercontent.com/tkuchiki/encrypt-password/master/encrypt.sh | sh
Enter password:
$6$eVuwo0XKesWWkbv3$/L.Sw8RJuk69aamprVSN.id2tCWJ0OiSmRJ12JNyahAdPopx7aHOWDvZ/PYustFFQ6Eu7vp22FYLqvXTUIo9I0

$ curl -s https://raw.githubusercontent.com/tkuchiki/encrypt-password/master/confirm.sh | sh
Enter password:
Enter same password again:
$6$eVuwo0XKesWWkbv3$/L.Sw8RJuk69aamprVSN.id2tCWJ0OiSmRJ12JNyahAdPopx7aHOWDvZ/PYustFFQ6Eu7vp22FYLqvXTUIo9I0
python
$ python -c 'import crypt, random, hashlib; random.seed(); print crypt.crypt("PASSWORD", "$6$" + hashlib.sha1(str(random.random())).hexdigest())';

注意点

salt のランダム値の生成が雑で、セキュアではないかもしれません(特に perl)。

また、perlpython の方法は、Mac OSX 上で実行しても正しい結果が得られませんので Linux 上で実行してください。
これは、Mac OSX の crypt は sha512 に対応していないためのようです。
したがって、sha512 に対応したモジュールを入れれば Mac OSX でも生成できます。
perl, python それぞれの生成方法は以下のページが参考になります。

python


php の場合は、php 5.3.2 から crypt が sha512 に対応しているので、
標準モジュールだけで生成できます。

参考:PHP: crypt - Manual

最近の Mac OSX にはデフォルトで php 5.3.2 以上が入っていると思いますので、
Mac ユーザには php の方法がおすすめです。

追記

id:Songmu さんから、いただいたブコメ(http://b.hatena.ne.jp/Songmu/20150122#bookmark-239785341) を参考に mkunixcrypt と unix-crypt の例を載せます。
コメントありがとうございました。

mkunixcrypt

unix-crypt を入れて、mkunixcrypt をそのまま実行するだけです。

$ gem install unix-crypt
$ mkunixcrypt
Enter password:
Verify password:
$6$..........................................

-p をつければ、一発で生成できますが、insecure と言われます。

$ mkunixcrypt -p PASSWORD
warning: providing a password on the command line is insecure
$6$..........................................
unix_crypt

ワンライナーで実行すると以下のようになりました。

$ ruby -runix_crypt -rsecurerandom -e "p UnixCrypt::SHA512.build('PASSWORD', SecureRandom.base64(12))"

まとめ

perl, php, python の標準モジュールで /etc/shadow の hash を生成する方法を紹介しました。
Linux ユーザはどの方法でも良く、Mac OSX ユーザは php を使うのがおすすめです。

最後に、参考にさせていただいたページの筆者の方々に御礼申し上げます。