tkuchikiの日記

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

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

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)));'
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 の方法がおすすめです。

まとめ

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

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