有効なソルトを生成するには、どのアルゴリズムがこのソルトを使用するかを知る必要があります。多くの場合、関数base64_encode()
を使用してバイナリ ソルトから標準文字を取得できます。次のアルファベットの文字列が生成されます。
base64 encoding alphabeth: +/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Silex が BCrypt ハッシュ アルゴリズムにソルトを使用する場合、次のアルファベットのソルトが期待されます。「.」に注意してください。「+」の代わりに:
BCrypt hash alphabet: ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
どの文字が許可されているかをテストするか、どのアルゴリズムが使用されるかを調べるのが最善だと思います。そうしないと、遅かれ早かれ無効なソルトが生成されます。関数を使用して BCrypt ソルトを生成する例は、次のmcrypt_create_iv()
ようになります。
/**
* Generates a random salt for using with the BCrypt algorithm.
* @param int $length Number of characters the string should have.
* @return string A random salt.
*/
function sto_generateRandomSalt($length = 22)
{
if (!defined('MCRYPT_DEV_URANDOM')) die('The MCRYPT_DEV_URANDOM source is required (PHP 5.3).');
// Generate random bytes, using the operating system's random source.
// Since PHP 5.3 this also uses the random source on a Windows server.
// Unlike /dev/random, the /dev/urandom does not block the server, if
// there is not enough entropy available.
$randomBinaryString = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
// BCrypt expects nearly the same alphabet as base64_encode returns,
// but instead of the '+' characters it accepts '.' characters.
// BCrypt alphabet: ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
$randomEncodedString = str_replace('+', '.', base64_encode($randomBinaryString));
return substr($randomEncodedString, 0, $length);
}