2016-04-04 9 views
1

私はPHPでキー値のpareとして使用する単純なハッシュを作成しようとしています。 PHPのベストプラクティスによれば、私はpassword_hashを使用し、次に一致することを確認するためにpassword_verifyを使用する必要があります。password_verifyはeverythigns a matchを言う

しかし、複数の値があることがわかりました(この例では、56個の一致があります)。

<?php 
echo '<pre>'; 

$apiKey = hash('sha512', uniqid()); 
$apiToken = hash('sha512', uniqid()); 
$apiTokenHash = password_hash($apiToken, PASSWORD_DEFAULT); 

echo '$apiKey = ' . $apiKey . ' length = ' . strlen($apiKey) . '<br/>'; 
echo '$apiToken = ' . $apiToken . ' length = ' . strlen($apiToken) . '<br/>'; 
echo '$apiTokenHash = ' . $apiTokenHash . ' length = ' . strlen($apiTokenHash) . '<br/>'; 

$verify = password_verify($apiToken, $apiTokenHash); 
$style = ($verify) ? "color: green;" : ''; 
echo "<p style='{$style}'>({$apiToken} === {$apiTokenHash})</p>"; 


$count = 1; 
while(strlen($apiToken) > 0) { 
    $apiToken = substr($apiToken, 0, -1); 
    $verify = password_verify($apiToken, $apiTokenHash); 
    $style = ($verify) ? "color: green;" : ''; 
    echo "<p style='{$style}'>{$count} - ({$apiToken} === {$apiTokenHash})</p>"; 
    $count++; 
} 
?> 

password_verifyが非常に多くの回答を受け入れている理由は誰にも分かります。

P.S.私は本当にあなたのためのPHPのフィドルでこれを取得しようとしましたが、私はそれについてのリンクを共有する方法を理解することはできませんので、私はそれについて苦労しないでください。

+1

ideone.comを使用してPHPの擬人化を行うことができます。それにはリンクを得るための共有ボタンがあります。 – Barmar

+0

ありがとうございます!私はPHPのフィドルが嫌いです。 – RachelC

答えて

4

password_hash()で使用されているbcryptアルゴリズムでは、72文字より長いハッシュストリングは使用できません。長い文字列は、ハッシュされる前に切り捨てられます。

+0

OMGありがとうございました!私はphp docs password_hashの全部を見て、最大の長さがあったかどうかを見て、それを見ませんでした。もちろん私はその長さを見ていたはずです。 – RachelC

+0

あまりにも悪くはありません。これはPHPのドキュメントのどこにも記載されていません! – duskwuff

+0

私はスタックと何か私はドキュメントで逃した何かを尋ねるとき、私はいつもひどいと感じることを確認していただきありがとうございます。 – RachelC

関連する問題