質問
簡単に推測できるシーケンシャルIDがあります。このIDに関連するデータを表示したい場合は、以前に与えたトークンでアクセスを証明する必要があります。
token = md5(secret_key + md5(id))
この仕事にはMD5で十分ですか?
解決
技術的には、十分なソルティングを確保するために、連結する前にidをmd5する必要さえありません。
ただし、パフォーマンスに重大な懸念がある場合(埋め込みプログラミングなど)を除き、一般的にsha-256またはsha-512を使用することをお勧めします。
他のヒント
それは本当に保護しようとしているものに依存しますが、おそらくそうではありません。より強力なハッシュ関数を使用するしない理由はありません。
これが認証に使用されると仮定すると、 HMAC を使用します。たとえば、 FIPS PUB 198 を参照してください。これにより、たとえば、MD5ではなく安全なハッシュ関数を使用し、説明どおりに結果を切り捨て、安全なトークンを取得できます。
MD5を使用しないでください。壊れています。すべての人々のVeriSignがまだMD5を使用しているとは信じられません。 MD5ハッシュ比較の破壊に使用するために、MD5のハッシュ衝突を決定するために利用可能なテストスイートがあります。
最低限、SHA-1を使用します。 SHA-5の使用をお勧めします。
IDを簡単に推測できる場合、秘密鍵が非常に長い場合を除き、これは実際にはあまり安全ではありません。
私のPCは、約1日で6文字のsecret_keyに対してMD5に基づいたsecret_key値をブルートフォースできます。より高速/より多くのコンピューターにアクセスできるユーザーは、その時間を大幅に短縮できます。ブレークまでの時間は、キーに数字が追加されるごとに10倍に増加します。 IDは簡単に推測できるため、計算されたMD5値であるため、secret_keyを取得するために元に戻すのが難しくなりません。
代替ソリューションを使用するか、(受け入れられない場合)md5生成ルーチンにデータを追加することをお勧めします。 secret_keyが一定で、1つのハッシュをリバースエンジニアリングできる場合、他のIDに対して正しいキーを生成できます。
データと現在の時間(保護しているレコードに関連付けられている場合)を保存したランダムなソルトなどをmd5世代に組み込むと、攻撃の難易度が劇的に高まります。
参照: