質問

現在、MD5は部分的に安全でないと言われています。これを考慮して、パスワード保護に使用するメカニズムを知りたいです。

この質問、は& #8220;ダブルハッシュ”一度ハッシュするよりも安全性の低いパスワードですか? 方法個々のファイルにパスワード保護を実装しますか?はsaltの使用を提案します。

PHPを使用しています。安全で高速なパスワード暗号化システムが必要です。パスワードを100万回ハッシュする方が安全かもしれませんが、遅くなります。速度と安全性のバランスをうまくとる方法は?また、文字数が一定の結果が望ましいです。

  1. ハッシュメカニズムはPHPで利用可能でなければなりません
  2. 安全でなければなりません
  3. 塩を使用できます(この場合、すべての塩は同等に優れていますか?優れた塩を生成する方法はありますか?)

また、2つのフィールドをデータベースに保存する必要があります(たとえば、MD5を使用するフィールドとSHAを使用するフィールド)。それはそれをより安全にするか、それとも安全にしませんか?

十分に明確ではなかった場合、使用するハッシュ関数と、安全で高速なパスワード保護メカニズムを得るために適切なソルトを選択する方法を知りたいです。

私の質問を十分にカバーしていない関連質問:

PHPのSHAとMD5の違い
単純なパスワード暗号化
キー、asp.netのパスワードを保存する安全な方法
ソルトパスワードをTomcat 5.5に実装する方法

役に立ちましたか?

解決

  

免責事項:この回答は2008年に作成されました。

     

それ以来、PHPは password_hash および password_verify および彼らの紹介、彼らは推奨されるパスワードハッシュ&確認方法。

     

答えの理論はまだ良い読み物です。

TL; DR

禁止事項

  • ユーザーがパスワードに入力できる文字を制限しないでください。これを行うのはバカだけです。
  • パスワードの長さを制限しないでください。ユーザーがその中にsupercalifragilisticexpialidociousを含む文を必要とする場合、その使用を妨げないでください。
  • ユーザーのパスワードをプレーンテキストで保存しないでください。
  • パスワードを紛失した場合を除き、ユーザーにパスワードをメールで送信しないでください。一時的なパスワードを送信します。
  • 決して、いかなる方法でもパスワードを記録しないでください。
  • SHA1 またはMD5またはSHA256! 現代のクラッカーは、600億および1,800億ハッシュを超えることができます/ 2番目(それぞれ)。
  • bcryptとの生の出力、16進出力を使用するかbase64_encodeします。 (これは、不正な \ 0 が含まれている可能性のある入力に適用され、セキュリティを著しく低下させる可能性があります。)

すべきこと

  • 可能な場合はscryptを使用します。できない場合はbcrypt。
  • SHA2ハッシュでbcryptまたはscryptを使用できない場合は、PBKDF2を使用します。
  • データベースが侵害されたときに全員のパスワードをリセットします。
  • 妥当な最小8〜10文字の長さを実装し、さらに少なくとも1つの大文字、1つの小文字、数字、および記号が必要です。これにより、パスワードのエントロピーが改善され、ひび割れが難しくなります。 (いくつかの議論については、「何が良いパスワードを作るのか?」セクションを参照してください。)

なぜパスワードをハッシュするのですか?

パスワードをハッシュする目的は単純です。データベースを危険にさらすことにより、ユーザーアカウントへの悪意のあるアクセスを防止します。そのため、パスワードハッシュの目的は、プレーンテキストのパスワードを計算するのに時間やお金をかけすぎて、ハッカーやクラッカーを阻止することです。そして、時間/コストはあなたの武器庫で最高の抑止力です。

ユーザーアカウントに適切で堅牢なハッシュが必要なもう1つの理由は、システム内のすべてのパスワードを変更するのに十分な時間を与えることです。データベースが危険にさらされている場合、データベース内のすべてのパスワードを変更しない限り、少なくともシステムをロックダウンするのに十分な時間が必要になります。

Whitehat SecurityのCTO、Jeremiah Grossman、記載彼のブログで最近パスワードを回復した後、パスワード保護をブルートフォースで破る必要がありました:

  

興味深いことに、この悪夢を生き抜く中で、パスワードのクラッキング、ストレージ、複雑さについて知らなかったことがたくさんありました。 パスワードの複雑さよりもパスワードの保存がこれほど重要である理由を理解するようになりました。パスワードの保存方法がわからない場合、本当に頼ることができるのは複雑さだけです。これは、パスワードと暗号の専門家にとって一般的な知識かもしれませんが、平均的なInfoSecまたはWebセキュリティの専門家にとっては、非常に疑います。

(エンファシス鉱山)

とにかく良いパスワードを作るのは何ですか?

エントロピー。 (Randallの視点を完全に購読しているわけではありません。)

要するに、エントロピーとは、パスワード内の変動の大きさです。パスワードが小文字のローマ字のみの場合、それはわずか26文字です。それはそれほど大きな違いではありません。 36文字の英数字のパスワードの方が適しています。ただし、記号を使用して大文字と小文字を区別できるのは約96文字です。それは単なる手紙よりもはるかに良いです。 1つの問題は、パスワードを覚えやすくするために、エントロピーを減らすパターンを挿入することです。おっと!

パスワードエントロピーは簡単に近似されます。 ASCII文字の全範囲(およそ96の入力可能な文字)を使用すると、1文字あたり6.6のエントロピーが得られますが、パスワードの8文字では、将来のセキュリティのために低すぎます(エントロピーの52.679ビット)。しかし、良いニュースは次のとおりです。長いパスワード、およびUnicode文字を含むパスワードは、パスワードのエントロピーを実際に増加させ、解読を困難にします。

でパスワードエントロピーの詳細な説明があります。 Crypto StackExchange サイト。優れたGoogle検索でも多くの結果が得られます。

@popnoodlesと話したコメントで、X個の文字、数字、記号などを含む長さXのパスワードポリシーを強制すると、パスワードスキームを作成することでエントロピーを実際に減らすことができると指摘しましたより予測可能。私は同意しますよ。 Randomessは、可能な限り真にランダムであり、常に最も安全であるが記憶に残るソリューションです。

私が知る限り、世界最高のパスワードを作成することはCatch-22です。記憶できない、予測しやすい、短すぎる、Unicode文字が多すぎる(Windows /モバイルデバイスで入力するのが難しい)、長すぎるなど。目的に合ったパスワードではないため、それらを保護する必要があります。フォートノックスにいた。

ベストプラクティス

Bcryptおよび scrypt が現在のベストプラクティスです。 Scrypt はやがてbcryptよりも優れたものになりますが、Linuxでは標準として採用されていません。 / Unixまたはwebserversによるものであり、アルゴリズムの詳細なレビューはまだ投稿されていません。それでも、アルゴリズムの将来は有望に見えます。 Rubyを使用している場合、 scrypt gem が役立ちます。Node.jsには、独自の scrypt パッケージ。 PHPでScryptを使用するには、 Scrypt 拡張機能または Libsodium 拡張機能(両方ともPECLで利用可能)。

bcryptの使用方法を理解したい場合は、暗号化関数のドキュメントを読むことを強くお勧めします。または良い ラッパー、または PHPASS を使用してより古い実装を実現します。 15から18でなければ、少なくとも12ラウンドのbcryptをお勧めします。

bcryptがblowfishのキースケジュールのみを使用し、可変コストメカニズムを使用していることを知ったとき、bcryptの使用について考えを変えました。後者では、blowfishのすでに高価なキースケジュールを増やすことで、パスワードをブルートフォースするコストを増やすことができます。

平均プラクティス

この状況はもうほとんど想像できません。

他のヒント

はるかに短く安全な回答-独自のパスワードメカニズムをまったく記述しない、実証済みのメカニズムを使用します。

ほとんどのプログラマーは、脆弱性を導入せずに暗号関連のコードを安全に記述する専門知識を持っていません。

クイックセルフテスト:パスワードストレッチとは何ですか?答えがわからない場合は、 password_hash()を使用する必要があります。これは、CPUの高速化と GPUおよびFPGA 1秒あたり10億の推測(GPUを使用)。

たとえば、 5台のデスクトップPCにインストールされた25個のGPUを使用して、6時間で8文字のWindowsパスワードをすべて解読します。これは総当たり攻撃です。つまり、特殊文字を含む8文字ごとのWindowsパスワードの列挙とチェックであり、辞書攻撃ではありません。それは2012年でしたが、2018年の時点では、使用するGPUの数を減らすか、25個のGPUを使用してより速くクラックすることができました。

通常のCPUで実行され、非常に高速なWindowsパスワードに対するレインボーテーブル攻撃も多数あります。これはすべて、Windowsのパスワードが still ソルトもストレッチも行わないため、 Windows 10でも-マイクロソフトと同じ間違いをしないでください!

関連項目:

  • 優れた回答 password_hash()または phpass が最善の方法である理由。
  • 良いブログ記事は、bcrypt、scrypt、PBKDF2などの主要なアルゴリズムに推奨される「作業要素」(反復回数)を提供します。

システムは少なくとも使用中のハッシュアルゴリズムの中で最も弱いので、2つの異なる方法でハッシュされたパスワードを保存しません。

PHP 5.5以降、PHPにはパスワードをハッシュおよび検証するためのシンプルで安全な関数 password_hash()および password_verify()

$password = 'anna';
$hash = password_hash($password, PASSWORD_DEFAULT);
$expensiveHash = password_hash($password, PASSWORD_DEFAULT, array('cost' => 20));

password_verify('anna', $hash); //Returns true
password_verify('anna', $expensiveHash); //Also returns true
password_verify('elsa', $hash); //Returns false

password_hash()を使用すると、ランダムなソルトが生成され、出力されたハッシュに(使用されるコストとアルゴリズムとともに) password_verify()次に、そのハッシュを読み取り、使用されるソルトと暗号化方法を決定し、提供されたプレーンテキストパスワードに対して検証します。

PASSWORD_DEFAULT を指定すると、インストールされているバージョンのPHPのデフォルトのハッシュアルゴリズムを使用するようにPHPに指示します。正確にどのアルゴリズムが将来のバージョンで時間の経過とともに変化することを意図しているので、常に最も強力な利用可能なアルゴリズムの1つになります。

コストの増加(デフォルトは10)により、ハッシュのブルートフォースが難しくなりますが、ハッシュの生成とそれらに対するパスワードの検証は、サーバーのCPUにとってより多くの作業になります。

デフォルトのハッシュアルゴリズムは変更される可能性がありますが、使用されるアルゴリズムはハッシュに格納され、 password_verify()がそれを取得するため、古いハッシュは引き続き正常に検証されます。 >

質問には回答しましたが、ハッシュに使用するソルトはランダムであり、最初の回答で提案された電子メールアドレスとは異なります。

詳細な説明は、 http:/で入手できます。 /www.pivotalsecurity.com/blog/password-hashing-salt-should-it-be-random/

  

最近、パスワードハッシュがランダムでソルトされているかどうかについて議論しました   ビットは推測可能または既知でソルトされたものより安全です   塩。見てみましょう:パスワードを保存するシステムが次のように侵害された場合   ランダムソルトを保存するシステムと同様に、攻撃者は   ハッシュとソルトにアクセスできるため、ソルトがランダムかどうか   関係ありません。攻撃者は事前に計算された   レインボーテーブルを使用してハッシュを解読します。ここからが面白い部分です。   事前に計算されたテーブルを生成するのはそれほど簡単ではありません。例を見てみましょう   WPAセキュリティモデルの。 WPAパスワードは実際には送信されません   ワイヤレスアクセスポイント。代わりに、SSIDでハッシュされます(   ネットワーク名-Linksys、Dlinkなど)。方法の非常に良い説明   これはここにあります。ハッシュからパスワードを取得するには、次のようにします   パスワードとソルト(ネットワーク名)を知っている必要があります。教会   Wifiには既に上位1000個のSSIDを持つ事前計算済みのハッシュテーブルがあり、   約100万のパスワード。すべてのテーブルのサイズは約40 GBです。   あなたが彼らのサイトで読むことができるように、誰かが3日間15のFGPAアレイを使用しました   これらのテーブルを生成します。被害者がSSIDを次のように使用していると仮定します   “ a387csf3″およびパスワードとして“ 123456″が解読されます   テーブル?いや! .. できない。パスワードが弱い場合でも、テーブル   SSID a387csf3のハッシュはありません。これが持つ美しさです   ランダムソルト。事前計算済みで成功するクラッカーを阻止します   テーブル。断固としたハッカーを止めることはできますか?おそらくない。しかし、使用して   ランダム塩は、追加の防御層を提供します。私たちがいる間   このトピックでは、ランダム保存の追加の利点について説明します   別のシステム上の塩。シナリオ#1:パスワードハッシュが保存される   システムXではハッシュに使用されるソルト値はシステムYに保存されます。   これらのソルト値は推測可能または既知(例:ユーザー名)シナリオ#2:   パスワードハッシュはシステムXに保存され、ソルト値は   ハッシュはシステムYに保存されます。これらのソルト値はランダムです。万一に備えて   あなたが推測することができるように、システムXが侵害されている、巨大な   別のシステムでランダムソルトを使用する利点(シナリオ#2)。   攻撃者はクラックするために追加値を推測する必要があります   ハッシュ。 32ビットのソルトを使用する場合、2 ^ 32 = 4,294,967,296(約4.2   10億)推測されるパスワードごとに反復が必要になる場合があります。

PHP 5.5には、パスワードハッシュAPI が含まれており、 crypt()のラッパー。このAPIは、パスワードハッシュのハッシュ、検証、および再ハッシュのタスクを大幅に簡素化します。著者は、互換性パックもリリースしました(単一のpassword.phpファイルの形式で、単に require to use)、PHP 5.3.7以降を使用していて、今すぐこれを使用したい人のために。

現在のところBCRYPTのみをサポートしていますが、他のパスワードハッシュテクニックを含むように簡単に拡張することを目指しています、フレームワークは自動的に、検証時に正しいテクニック/コストを使用します。また、「セキュア」の生成も処理します。独自に明示的に定義しない場合はsalt。

APIは4つの関数を公開します:

  • password_get_info()-指定されたハッシュに関する情報を返します
  • password_hash()-パスワードハッシュを作成
  • password_needs_rehash()-指定されたハッシュが指定されたオプションと一致するかどうかを確認します。ハッシュが現在のテクニック/コストスキームに準拠しているかどうかを確認するのに役立ちます。必要に応じて再ハッシュできます
  • password_verify()-パスワードがハッシュと一致することを検証する

これらの関数は、現時点では同義のPASSWORD_BCRYPTおよびPASSWORD_DEFAULTパスワード定数を受け入れますが、PASSWORD_DEFAULTは、より強力なハッシュアルゴリズムがサポートされると、新しいPHPリリースで変更される可能性があるという違いがあります。ログイン時にPASSWORD_DEFAULTとpassword_needs_rehash()を使用する(および必要に応じて再ハッシュする)ことで、ほとんど手間をかけずに、ブルートフォース攻撃に対してハッシュが適度に弾力的になることが保証されます。

編集:ロバートKの回答でこれが簡単に言及されていることに気付きました。この答えは、セキュリティの知識がない人にどのように機能し、使いやすさが提供されるかについてもう少し情報を提供すると思うので、ここに残します。

Phpass を使用しています。これは、ほぼすべてのPHPで非常に簡単に実装できる単純な1ファイルのPHPクラスです。プロジェクト。 H も参照してください。

デフォルトでは、Phpassに実装されている最も強力な利用可能な暗号化を使用しました。これは bcrypt であり、MD5まで他の暗号化にフォールバックして、Wordpressなどのフレームワークとの下位互換性を提供します。

返されたハッシュはそのままデータベースに保存できます。ハッシュを生成するための使用例は次のとおりです。

$t_hasher = new PasswordHash(8, FALSE);
$hash = $t_hasher->HashPassword($password);

パスワードを確認するには、次を使用できます。

$t_hasher = new PasswordHash(8, FALSE);
$check = $t_hasher->CheckPassword($password, $hash);

覚えておくべきこと

PHPのパスワード暗号化については多くのことが言われていますが、そのほとんどは非常に良いアドバイスですが、パスワード暗号化にPHPを使用するプロセスを開始する前に、以下を実装するか実装する準備ができていることを確認してください。

サーバー

ポート

PHPとDBを実行するサーバーを適切に保護しないと、暗号化がどれほど優れていても、努力する価値はありません。ほとんどのサーバーは比較的同じように機能し、ftpまたはシェルを介してリモートでアクセスできるようにポートが割り当てられています。アクティブになっているリモート接続のデフォルトポートを必ず変更してください。これを行わないことにより、実質的には、攻撃者がシステムにアクセスする際のステップを1つ少なくしました。

ユーザー名

世界で良いことはすべて、ユーザー名admin、rootなどを使用しないでください。また、Unixベースのシステムを使用している場合は、rootアカウントのログインをアクセス可能にしないでください。常にsudoのみにしてください。

パスワード

ユーザーに、ハッキングされないように適切なパスワードを作成するように指示します。同じことを行います。バックドアを大きく開いたときにフロントドアをロックするすべての作業を行うポイントは何ですか。

データベース

サーバー

理想的には、データベースとアプリケーションを別々のサーバーに配置します。これはコストのために常に可能であるとは限りませんが、攻撃者はシステムに完全にアクセスするために2つのステップを踏む必要があるため、ある程度の安全性が確保されます。

ユーザー

常にデータベースにアクセスするための独自のアカウントをアプリケーションに持たせ、必要な権限のみを与えます。

次に、サーバー上にもアプリケーション内にも保存されていない別のユーザーアカウントがあります。

常にこのルートなどを作成しないでください。

パスワード

すべての適切なパスワードと同じガイドラインに従ってください。また、同じシステム上の任意のSERVERまたはDBアカウントで同じパスワードを再利用しないでください。

PHP

パスワード

DBにパスワードを保存しないで、代わりにハッシュと一意のソルトを保存します。その理由を後で説明します。

ハッシュ

One WAY HASHING !!!!!!!、パスワードを元に戻せる方法でハッシュしないでください。ハッシュは一方向でなければなりません。つまり、パスワードを元に戻してパスワードと比較せず、代わりにハッシュします。入力されたパスワードを同じ方法で入力し、2つのハッシュを比較します。これは、攻撃者がDBにアクセスしたとしても、実際のパスワードが何であるかを知らず、その結果のハッシュだけであることを意味します。つまり、最悪のシナリオでユーザーのセキュリティが強化されます。

多くの優れたハッシュ関数( password_hash hash など)がありますが、ハッシュを適切なアルゴリズムに選択する必要があります効果的。 (bcryptとそれに似たものは、きちんとしたアルゴリズムです。)

ハッシュ速度が重要である場合、ブルートフォース攻撃に対する耐性は遅くなるほど強くなります。

ハッシュで最もよくある間違いの1つは、ハッシュがユーザーに固有ではないことです。これは主に、塩が一意に生成されないためです。

塩漬け

パスワードは、ハッシュする前に常にソルトする必要があります。 Saltingはパスワードにランダムな文字列を追加するため、類似したパスワードがDBで同じように表示されません。ただし、ソルトが各ユーザーに固有ではない場合(つまり、ハードコーディングされたソルトを使用している場合)、ソルトはほとんど価値がありません。攻撃者が1つのパスワードソルトを見つけたら、すべてのソルトを持っているからです。

ソルトを作成するときは、ソルトしているパスワードに固有であることを確認してから、完成したハッシュとソルトの両方をDBに保存します。これにより、攻撃者がアクセスする前に各ソルトとハッシュを個別に解読する必要があります。これは

Googleは、SHA256はPHPで利用可能であると言っています。

必ず塩を使用する必要があります。ランダムなバイトを使用することをお勧めします(文字と数字に制限されません)。通常、選択する時間が長いほど、安全で遅くなります。 64バイトでも問題ないはずです。

ここでこの問題に関する完璧なトピックを見つけました: https://crackstation.net/hashing-security.htm 、私はあなたにそれから利益を得てほしかったです。ここには、時間ベースの攻撃に対する防御も提供したソースコードもあります。

<?php
/*
 * Password hashing with PBKDF2.
 * Author: havoc AT defuse.ca
 * www: https://defuse.ca/php-pbkdf2.htm
 */

// These constants may be changed without breaking existing hashes.
define("PBKDF2_HASH_ALGORITHM", "sha256");
define("PBKDF2_ITERATIONS", 1000);
define("PBKDF2_SALT_BYTES", 24);
define("PBKDF2_HASH_BYTES", 24);

define("HASH_SECTIONS", 4);
define("HASH_ALGORITHM_INDEX", 0);
define("HASH_ITERATION_INDEX", 1);
define("HASH_SALT_INDEX", 2);
define("HASH_PBKDF2_INDEX", 3);

function create_hash($password)
{
    // format: algorithm:iterations:salt:hash
    $salt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTES, MCRYPT_DEV_URANDOM));
    return PBKDF2_HASH_ALGORITHM . ":" . PBKDF2_ITERATIONS . ":" .  $salt . ":" . 
        base64_encode(pbkdf2(
            PBKDF2_HASH_ALGORITHM,
            $password,
            $salt,
            PBKDF2_ITERATIONS,
            PBKDF2_HASH_BYTES,
            true
        ));
}

function validate_password($password, $good_hash)
{
    $params = explode(":", $good_hash);
    if(count($params) < HASH_SECTIONS)
       return false; 
    $pbkdf2 = base64_decode($params[HASH_PBKDF2_INDEX]);
    return slow_equals(
        $pbkdf2,
        pbkdf2(
            $params[HASH_ALGORITHM_INDEX],
            $password,
            $params[HASH_SALT_INDEX],
            (int)$params[HASH_ITERATION_INDEX],
            strlen($pbkdf2),
            true
        )
    );
}

// Compares two strings $a and $b in length-constant time.
function slow_equals($a, $b)
{
    $diff = strlen($a) ^ strlen($b);
    for($i = 0; $i < strlen($a) && $i < strlen($b); $i++)
    {
        $diff |= ord($a[$i]) ^ ord($b[$i]);
    }
    return $diff === 0; 
}

/*
 * PBKDF2 key derivation function as defined by RSA's PKCS #5: https://www.ietf.org/rfc/rfc2898.txt
 * $algorithm - The hash algorithm to use. Recommended: SHA256
 * $password - The password.
 * $salt - A salt that is unique to the password.
 * $count - Iteration count. Higher is better, but slower. Recommended: At least 1000.
 * $key_length - The length of the derived key in bytes.
 * $raw_output - If true, the key is returned in raw binary format. Hex encoded otherwise.
 * Returns: A $key_length-byte key derived from the password and salt.
 *
 * Test vectors can be found here: https://www.ietf.org/rfc/rfc6070.txt
 *
 * This implementation of PBKDF2 was originally created by https://defuse.ca
 * With improvements by http://www.variations-of-shadow.com
 */
function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false)
{
    $algorithm = strtolower($algorithm);
    if(!in_array($algorithm, hash_algos(), true))
        die('PBKDF2 ERROR: Invalid hash algorithm.');
    if($count <= 0 || $key_length <= 0)
        die('PBKDF2 ERROR: Invalid parameters.');

    $hash_length = strlen(hash($algorithm, "", true));
    $block_count = ceil($key_length / $hash_length);

    $output = "";
    for($i = 1; $i <= $block_count; $i++) {
        // $i encoded as 4 bytes, big endian.
        $last = $salt . pack("N", $i);
        // first iteration
        $last = $xorsum = hash_hmac($algorithm, $last, $password, true);
        // perform the other $count - 1 iterations
        for ($j = 1; $j < $count; $j++) {
            $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
        }
        $output .= $xorsum;
    }

    if($raw_output)
        return substr($output, 0, $key_length);
    else
        return bin2hex(substr($output, 0, $key_length));
}
?>

最終的に、ダブルハッシュは数学的には何のメリットもありません。ただし、実際には、レインボーテーブルベースの攻撃を防ぐのに役立ちます。つまり、アプリケーションまたはサーバーでのプロセッサ時間を大幅に削減するソルトを使用したハッシュよりも利点はありません。

通常、ユーザーID(または他のユーザー固有の情報)とともにSHA1とsaltを使用し、時々定数saltをさらに使用します(したがって、saltには2つの部分があります)。

SHA1もある程度危険にさらされていると考えられていますが、MD5よりもはるかに少ない程度です。ソルト(任意のソルト)を使用することにより、汎用のレインボーテーブルを使用して、ハッシュを攻撃します(ハッシュを検索することで、Googleを一種のレインボーテーブルとして使用することに成功した人もいます)。攻撃者がソルトを使用してレインボーテーブルを生成する可能性があるため、ユーザー固有のソルトを含める必要があります。そうすれば、システム全体のレコードだけでなく、システムの各レコードごとにレインボーテーブルを生成する必要があります。このタイプの塩漬けでは、MD5でも安全です。

SHA1 と塩で十分です(当然、 Fort Knox または買い物リストのログインシステム)を、近い将来に備えてください。 SHA1で十分でない場合は、 SHA256 を使用します。

ソルトのアイデアは、言うまでもなく、ハッシュの結果を不均衡にすることです。たとえば、空の文字列のMD5-hashは d41d8cd98f00b204e9800998ecf8427e であることが知られています。したがって、十分なメモリを備えた誰かがそのハッシュを見て、それが空の文字列のハッシュであることを知っている場合。しかし、文字列がソルト(たとえば、文字列&quot; MY_PERSONAL_SALT &quot;)の場合、「空の文字列」のハッシュ(つまり&quot; MY_PERSONAL_SALT &quot;)は aeac2612626724592271634fb14d3ea6 であるため、バックトレースはわかりません。私が言おうとしているのは、塩を使用するよりも、任意の塩を使用する方が良いということです。したがって、どの塩を使用するかを知ることはそれほど重要ではありません。

実際には、これだけを行うウェブサイトがあります-(md5)ハッシュ、そして、その特定のハッシュを生成する既知の平文を吐き出します。プレーンなmd5ハッシュを格納するデータベースにアクセスできる場合、そのようなサービスに管理者のハッシュを入力してログインするのは簡単です。しかし、パスワードがソルト化されている場合、そのようなサービスは無効。

また、ダブルハッシュは結果空間を縮小するため、一般的に悪い方法と見なされます。一般的なハッシュはすべて固定長です。したがって、この固定長の有限値のみを持つことができ、結果の変動は少なくなります。これは、別の形式の塩漬けと見なされる可能性がありますが、お勧めしません。

OK フィットネスでは塩が必要です 塩はユニークでなければなりません それを生成しましょう

   /**
     * Generating string
     * @param $size
     * @return string
     */
    function Uniwur_string($size){
        $text = md5(uniqid(rand(), TRUE));
        RETURN substr($text, 0, $size);
    }

また、ハッシュが必要です 私はsha512を使用しています それは最高で、PHPにあります

   /**
     * Hashing string
     * @param $string
     * @return string
     */
    function hash($string){
        return hash('sha512', $string);
    }

これで、この関数を使用して安全なパスワードを生成できます

// generating unique password
$password = Uniwur_string(20); // or you can add manual password
// generating 32 character salt
$salt = Uniwur_string(32);
// now we can manipulate this informations

// hashin salt for safe
$hash_salt = hash($salt);
// hashing password
$hash_psw = hash($password.$hash_salt);

今、データベースに$ hash_psw変数値と$ salt変数を保存する必要があります

そして承認には同じ手順を使用します...

これは、クライアントのパスワードを保護する最良の方法です...

P.s。最後の2つのステップでは、独自のアルゴリズムを使用できます... ただし、将来このハッシュされたパスワードを生成できることを確認してください ユーザーを認証する必要がある場合...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top