0

私は塩を生成する最良の方法を研究してきました。一般的なアドバイスは、mcrype_create_iv または openssl_random_pseudo_bytes を使用して生成することです。T

これの問題は、文字が含まれているために取得した値を使用するのに問題があることです。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 に答える