4

単純なWebアプリケーションを作成していて、ハッシュ化されたパスワードをデータベースに保存したいと考えています。認証トークンのハッシュ関数も必要です(ユーザー名と日付を連結し、ハッシュとともにトークンとしてクライアントに送信します)。

MessageDigestJavaクラスがこれに役立つことがわかりました。ここに1つのリンクがあります。基本的な考え方は次のようになります。

public String digestString (String stringToHash) throws NoSuchAlgorithmException {
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");        
    byte[] stringBytes = stringToHash.getBytes();
    byte[] stringDigest = sha256.digest(stringBytes);
    return new String(stringDigest);
}

私が得られないのは: このコードでは、どうすればハッシュキーを設定できますか?検証プロセスで同じキーが使用されることを確認する必要があります。キーを設定しない場合、どうすればよいですか?

ところで:ハッシュ化する前に、ハッシュ化されたテキストにソルト(この場合は256バイト)を追加する必要があることはわかっています。

4

1 に答える 1

7

ハッシュはキーを使用しません。これは一方向のアルゴリズムです。ダイジェストするものを与えると、ハッシュが返されます。それが保証するのは、元の入力または同じハッシュにつながる他の入力を見つけるのが非常に難しいということです。

あなたのアルゴリズムには2つの基本的な問題があります(塩漬けの欠如に加えて):

  • String.getBytes()を使用します。これは、デフォルトのプラットフォームエンコーディングに依存しているため、プラットフォームごとに異なります。UTF-8などのエンコーディングを指定する必要があります。
  • new String(byte [])を使用しますが、これには上記と同じ問題+追加の問題があります。バイトのすべてのシーケンスが有効な文字ではありません。純粋なバイナリバイト配列を文字列に変換するには、base64エンコーディングアルゴリズムを使用します。ApacheCommonsコードには1つあります。
于 2012-01-04T18:36:33.547 に答える