我一直在研究生成盐的最佳方法。一般建议似乎是使用mcrype_create_iv或openssl_random_pseudo_bytes来生成。 Ť
他的问题是因为涉及到的字符而无法使用检索到的值。我使用RedBean作为ORM和Silex作为框架。我在使用RedBean设置和检索生成的值时遇到问题,我知道Silex也有一些限制,因为一旦盐不能包含“{}”,我就会收到错误。
生成使用标准字符集的salt的最佳方法是什么。我想我可能能够md5结果,但那会导致一个更小的字符集。
答案 0 :(得分:0)
要生成有效的salt,必须知道哪种算法将使用此salt。通常,您可以使用函数base64_encode()
从二进制盐中检索标准字符,它将生成一个包含以下字母的字符串:
base64 encoding alphabeth: +/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
如果Silex将盐用于BCrypt哈希算法,它将使用下面的字母表中的盐,注意“。”而不是“+”:
BCrypt hash alphabet: ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
我认为最好测试允许使用哪些字符,或找出将使用哪种算法,否则您迟早会生成无效的盐。使用函数mcrypt_create_iv()
生成BCrypt盐的示例可能如下所示:
/**
* 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);
}