web-dev-qa-db-ja.com

ランダムなハッシュ/文字列を作成する最良の方法は何ですか?

セッションを保存する目的でハッシュを生成する最良の方法は何ですか?軽量でポータブルなソリューションを探しています。

44
Eric Gates

PHPの組み込みハッシュ関数 _sha1_ および _md5_ 両方ではなく、1つを選択してください。

両方を使用すると、sha1(md5($pass))が解決策になると考えるかもしれません。両方を使用してもパスワードの安全性は向上せず、データが冗長になり、あまり意味がありません。

PHP Security Consortium:Password Hashing をご覧ください。彼らは、弱点とハッシングによるセキュリティの改善に関する良い記事を提供します。

Nonceは「n使用されたアンバーonce」。許可されていないアクセスを防ぐために要求で使用され、secretキーを送信します。コードを使用するたびにキーを確認してください。

FullThrottle DevelopmentのPHP NONCEライブラリ で詳細を確認できます

10
bin2hex(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM));
  1. mcrypt_create_iv は、ランダムなバイトシーケンスを提供します。
  2. bin2hex は、ASCII text

出力例:

d2c63a605ae27c13e43e26fe2c97a36c4556846dd3ef

「ベスト」は相対的な用語であることを忘れないでください。セキュリティ、一意性、速度の間でトレードオフがあります。上記の例は、99%のケースに適していますが、特に機密性の高いデータを扱う場合は、 MCRYPT_DEV_URANDOMとMCRYPT_DEV_RANDOMの違い について読むことができます。

最後に、 RandomLib 「さまざまな強度の乱数と文字列を生成するため」があります。

これまでのところ、ランダム文字列を生成しようとしていると仮定していることに注意してください、これはとは異なります値からhashを導出します。後者については、 password_hash を参照してください。

65
Gajus

random_bytes() はPHP 7.0の時点で利用可能です(または 5.2から5.6のポリフィル )を使用:

$hash = bin2hex(random_bytes(16));
echo serialize($hash);

出力:

s:32: "c8b2ca837488ff779753f374545b603c";

19
0b10011

たぶんuniqid()が必要ですか?

niqid —一意のIDを生成する

9
z-boss

Php 5.3.0以降では openssl_random_pseudo_bytes を使用して、バイトの擬似ランダム文字列を生成できます。この関数を使用して、これらのメソッドのいずれかを使用して何らかの方法で文字列に変換できます。

$bytes = openssl_random_pseudo_bytes(32);
$hash = base64_encode($bytes);

または

$bytes = openssl_random_pseudo_bytes(32);
$hash = bin2hex($bytes);

最初のものは、数字、小文字、大文字、およびいくつかの特殊文字(=、+、/)を含む最短の文字列を生成します。 2番目の選択肢は16進数(0-9、a-f)を生成します

7
Simon Backx

使用可能な場合はrandom_bytes()を使用してください!

$length = 32;

if (function_exists("random_bytes")) {
    $bytes = random_bytes(ceil($lenght / 2));
    $token = substr(bin2hex($bytes), 0, $lenght)
}

php.netで確認してください

1
Zoltán Süle

個人的にApacheの mod_unique_id を使用して、セッションを保存するためのランダムな一意の番号を生成します。本当に使いやすいです(Apacheを使用している場合)。

ナンスについては、こちらをご覧ください http://en.wikipedia.org/wiki/Cryptographic_nonce PHPライブラリへのリンクもあります。

0
t00ny