PHP 5.5「パスワードハッシュAPI」

そのため、PHP 5.5.0の最終リリースがリリースされました。 新機能についての簡単な説明は、公式ウェブサイトの投稿または「ロシア語に翻訳」にあります。

「PHPのコルーチンと非ブロッキング関数の操作」「最終的にPHP 5.5に登場する可能性がある」など、PHP 5.5.0の新機能に関する記事がすでにハブにありました
この記事では、PHP 5.5.0 「パスワードハッシュAPI 」の新機能の1つについて説明します。被保険者にエラーを提供し、ハッシュによるパスワードの有効性を生成および検証するための高レベル関数を使いやすくします。 新しいAPIの主な違いは、信頼性の高いハッシュを生成し、開発者からソルトを手動で指定してハッシュアルゴリズムを選択する操作を隠すことです(デフォルトでは、Bcryptが使用されます)。 ハッシュの作成は「$ hash = password_hash($ password、PASSWORD_DEFAULT);」の実行に限定され、呼び出しの検証は「password_verify($ password、$ hash)」です。 新しいAPIが導入された理由は、ソルトの生成に対する多くの開発者の不注意な態度と、検索に対して堅牢ではないハッシュアルゴリズムの幅広い選択にありました。

定数、関数、およびそれらを使用するコードが考慮されます。

定義済みの定数
以下にリストされている定数は、PHPコアの一部として常に利用可能です。

PASSWORD_BCRYPT (整数)= 1
PASSWORD_BCRYPTは、 CRYPT_BLOWFISHアルゴリズムを使用して新しいパスワードハッシュを作成するために使用されます。

PASSWORD_DEFAULT (整数)= PASSWORD_BCRYPT
アルゴリズムが指定されていない場合、デフォルトのハッシュアルゴリズムが使用されます。 新しい、より効率的な(たとえば、Scrypt)ハッシュアルゴリズムがサポートされると、PHPの新しいバージョンで変更される可能性があります。

パスワードハッシュ関数




array password_get_info (string $ hash)-このハッシュに関する情報を返します。

3つの要素(キー)を持つ連想配列を返します。
-アルゴリズム( algo )、 パスワードアルゴリズム定数に対応します
-アルゴリズムの名前( algoName )。人間が読み取れるアルゴリズムの名前を持ちます。
-password_hash()を呼び出すときに提供される機能を含む、オプション( options )の連想配列。




string password_hash (string $ password、integer $ algo [、array $ options])-新しいパスワードハッシュを作成します。

暗号化されたパスワードを返します。エラーの場合はFALSEを返します。




boolean password_needs_rehash (string $ hash、string $ algo [、string $ options])-提供されたハッシュが与えられたアルゴリズムとオプションと一致するかどうかをチェックします。 そうでない場合、ハッシュを変更する必要があると見なされます。

指定されたアルゴリズムとオプションに一致するようにハッシュを変更する必要がある場合はTRUE、そうでない場合はFALSEを返します。




boolean password_verify (string $ password、string $ hash)-パスワードが指定されたハッシュと一致するかどうかを確認します。 このハッシュは、password_hash()または通常のcrypt()ハッシュを使用して作成できます。

パスワードとハッシュが一致する場合はTRUE、そうでない場合はFALSEを返します。




コードと出力

<?php $options = [ 'cost' => 7, 'salt' => 'BCryptRequires22Chrcts', ]; $hash['hash'][] = password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options); //"$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq" $hash['hash'][] = password_hash("rasmuslerdorf", PASSWORD_DEFAULT); //"$2y$10$hHi0De9WN.HL6.Fz1ElvbOMIU5NA0tetwdJzNziKJvHFXFqOxsybi" $hash['info'][] = password_get_info($hash['hash'][0]); //array("algo" => 1 , "algoName" => "bcrypt" , "options" => array("cost" => 7 )) $hash['info'][] = password_get_info($hash['hash'][1]); //array("algo" => 1 , "algoName" => "bcrypt" , "options" => array("cost" => 10 )) $hash['rehash'][] = password_needs_rehash($hash['hash'][0],PASSWORD_BCRYPT,$options); //false $hash['rehash'][] = password_needs_rehash($hash['hash'][0],PASSWORD_DEFAULT); //true $hash['rehash'][] = password_needs_rehash($hash['hash'][1],PASSWORD_DEFAULT); //false $hash['pas_verify'][] = password_verify('rasmuslerdorf', $hash['hash'][0]); //true $hash['pas_verify'][] = password_verify('rasmuslerdorf', $hash['hash'][1]); //true $hash['pas_verify'][] = password_verify('rasmuslerdorff', $hash['hash'][0]); //false $hash['pas_verify'][] = password_verify('rasmuslerdorff', $hash['hash'][1]); //false var_dump($hash); 

出力結果
 array(4) { ["hash"]=> array(2) { [0] => string(60) "$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq" [1] => string(60) "$2y$10$CYb5tz9f5IVAgqX7SkIv9ufbi6yYlMQgAHcV4ixXjYSHJZl9KwLrK" } ["info"]=> array(2) { [0]=> array(3) { ["algo"] => int(1) ["algoName" ]=> string(6) "bcrypt" ["options"] => array(1) { ["cost"] => int(7) } } [1]=> array(3) { ["algo"] => int(1) ["algoName"] => string(6) "bcrypt" ["options"] => array(1) { ["cost"] => int(10) } } } ["rehash"]=> array(3) { [0] => bool(false) [1] => bool(true) [2] => bool(false) } ["pas_verify"]=> array(4) { [0] => bool(true) [1] => bool(true) [2] => bool(false) [3] => bool(false) } } 


また、サイト3v4l.orgでは 、さまざまなバージョンのPHPでVLDオペコードと比較パフォーマンスを確認できます。 記事のコードパフォーマンスの例を次に示します。
バージョンシステム時間ユーザー時間マックス メモリ使用量
5.5.0alpha10.018秒0.267秒12,152 MiB
5.5.0alpha20.018秒0.267秒12,148 MiB
5.5.0alpha30.015秒0.271秒12,148 MiB
5.5.0alpha40.019秒0.268秒12,164 MiB
5.5.0alpha50.014秒0.270秒12,195 MiB
5.5.0alpha60.016秒0,304秒12,219 MiB
5.5.0beta10.017秒0.270秒12,270 MiB
5.5.0beta20.027秒0.294秒12,270 MiB
5.5.0beta30.022秒0.265秒12,656 MiB
5.5.0beta40.016秒0.299秒12,656 MiB

残念ながら、最終的な5.5.0リリースはまだリストにありません。

将来のアップデートの可能性
現時点では、デフォルトの暗号化アルゴリズム(これまで1つしかサポートされていません)は、プリセット定数PASSWORD_DEFAULTによって決定されます。 新しいバージョンの言語では、デフォルトの暗号化アルゴリズムを設定で設定できます。

PHPの以降のバージョンでより効果的な保護を提供するには、パスワード(BCrypt)を計算するアルゴリズムコストを増やす必要があります。これにより、技術機器の改善により、password_hash()関数が時間の経過とともに有効になります。

今後の懸念
暗号の性質上、将来の互換性は深刻な懸念事項です。 安全であるために、これらの機能は将来的に変化する要件に適応する必要があります。

参照:
パスワードハッシュAPIドキュメント
コメントのリクエスト:シンプルなパスワードハッシュAPIの追加-Anthony Ferrara
新しいPHP.netサイトのベータ版

EugeneOZによる PS:
これらの関数を使用して、コードを変更せずにネイティブ関数に切り替えることができます。
次のファイルを使用してください: github.com/ircmaxell/password_compat/blob/master/lib/password.php (PHP required> = 5.3.7)
PHPコードで関数を書いたのと同じ人によって書かれています-Anthony Ferrara

PSはHPでスペルミスと翻訳エラーを記述します

謝辞:
ありがとう
nixmalenewdya 、示されたエラーの場合。
サプリメントのEugeneOZ
@Possible Future Updatesをより理解しやすいオプションに変更するための@yourway。

Source: https://habr.com/ru/post/J184220/


All Articles