0

我一直在研究产生盐的最佳方法。一般建议似乎是使用 mcrype_create_iv 或 openssl_random_pseudo_bytes 来生成。吨

他的问题是由于涉及的字符,我无法使用检索到的值。我使用 RedBean 作为 ORM 和 Silex 作为框架。我无法使用 RedBean 设置和检索生成的值,而且我知道 Silex 也有限制,因为一旦盐不能包含括号“{}”,我就会收到错误消息。

生成使用标准字符集的盐的最佳方法是什么。我想我可能能够对结果进行 md5 处理,但随后会产生更小的字符集。

4

1 回答 1

0

要生成有效的盐,必须知道哪种算法将使用该盐。通常您可以使用该函数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);
}
于 2013-03-08T08:45:35.850 回答