CakePHP2のSecurity.cipherSeed、Security.saltの値を生成するコマンド

CakePHP2を使っているとSecurity.cipherSeed、Security.saltの値を生成するコマンドがほしくなります。

blog.shiten.info » [CakePHP] Security.salt と Security.cipherSeed を生成する」にそのものがありました。もとの記事では乱数生成は別々にしていますが、手を抜くなら下記のようにできます。3桁の数字を生成して連結して30桁の数字を生成して出力。その後、その数字をSHA1でハッシュ値生成して出力。Security.cipherSeed と Security.salt の順で出力されます。

$ php -r '$num = ""; for($i=0;$i<10;++$i){$num .= rand(100,999);} echo $num . "\n"; echo sha1($num) . "\n";'

rand関数は生成する乱数の精度がよくないといわれているので代替がないか調べてみました。PHP5.3以降は openssl_random_pseudo_bytes というより強力な乱数ジェネレータがあるようなので、そちらを使うプログラムを考えてみました。randよりも良い乱数を生成するmt_randという関数もあるようです。16進数表現の乱数生成は簡単です。40文字分なら、20バイト長で生成してbin2hexで16進数表記に変換するだけです。30桁の数字はよくわからなかったので、とりあえず1バイト(0 – 255)で生成して、これを100で割った余り(0 – 99)の2桁の数字を15個用意して連結する処理としました。00から55までの数字が若干使われやすくなっています。また、0から9までの数字は00のように表示する必要があるのでsprintf関数でフォーマットしてあります。

<?php
$cstrong = FALSE;
$bytes = 0;
$salt_value = "";
for ($i=0; $i<10; $i++) {
  $bytes = openssl_random_pseudo_bytes(20, $cstrong);
  if ($cstrong===TRUE) {
    break;
  }
}
$salt_value .= bin2hex($bytes);
echo $salt_value;
echo "\n";
$salt_value = "";
for ($i=0 ; $i<15 ; $i++) {
  $bytes = openssl_random_pseudo_bytes(1, $cstrong);
  $o = ord($bytes) % 100;
  $salt_value .= sprintf('%02d', $o);
}
echo $salt_value;
echo "\n";

上記PHPプログラムをGenSalt.phpというファイルで保存したとして、次のように実行します。Security.salt と Security.cipherSeed の順で出力されます。

$ php -f GenSalt.php
48c6714d8ffead559b79c422ce7da3dc4fd4dd72
470887575193916412053854160366

Javaでパスワードを生成するプログラムも作ったことがあります。興味があったら「jgenpasswordでパスワード生成 | hiro345」をご覧ください。

同じタグの記事: CakePHP
同じタグの記事: PHP
同じカテゴリの記事: Program
関連書籍: CakePHP
関連書籍: PHP