2012-01-04 12 views
4

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

私はMessageDigest Javaクラスがこれを手助けできることを発見しました。 Here is one link。 基本的な考え方は、このように書きます:

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); 
} 

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

BTW:ハッシュ化する前に、ハッシュされたテキストにソルト(この場合は256バイト)を追加する必要があります。

+0

ハッシュ「キー」とはどういう意味ですか? HMACのようなものであれば、それは前のステップで行われなければならず、その出力からのバイトは 'MessageDigest'メソッドに渡されます。 MessageDigestは、内容に関係なくバイト配列をハッシュします。 – Peter

+0

@Peter:実際には、javaはMacクラスを持ち、OracleプロバイダはHMACを実装しています。たとえば、 'Mac hmac = Mac.getInstance( 'HmacSHA1');'が動作します。 –

答えて

7

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

あなたのアルゴリズムは、(塩漬けの欠如以外の)二つの基本的な問題がある:それは、デフォルトプラットフォームのエンコーディングに頼っするString.getBytes()を使用していますので、プラットフォームごとに異なり

  • 。 UTF-8などのエンコーディングを指定する必要があります。
  • 新しい文字列(byte [])を使用します。これは上記と同じ問題+追加の問題です。すべてのバイト列は有効な文字ではありません。純粋にバイナリのバイト配列をStringに変換するには、base64エンコーディングアルゴリズムを使用します。 Apacheのコモンズコードには1つあります。
+0

ありがとうございました。私はちょうどこのプロセスがパスワードのためだけに良いことに気づいた。私は認証トークンのために隠されているキーを使用しなければなりません。 –

関連する問題