2011-07-28 13 views
2

私は開発目的のためにプレーンテキストでパスワードを保管していましたが、代わりにハッシュの格納を開始したいが、GlassFishがハッシュされたパスワードに対して正しく認証されていないSecurityExceptionの後で:GlassFish SHA-256ダイジェスト認証

まず、GlassFish 3.1を実行していて、自分のJDBC領域のダイジェストをSHA-256に設定しています。

Userクラスは、次の注釈付きパスワードフィールドがあります。

@Basic(fetch = FetchType.LAZY) 
@Column(length = 45, nullable = false) 
private String password; 

次のヘルパーメソッドは、パスワードをハッシュ化する責任がある:

private byte[] digest(String input) { 
    byte[] output = null; 
    try { 
     MessageDigest md = MessageDigest.getInstance("SHA-256"); 
     output = md.digest(input.getBytes("UTF-8")); 
    } catch (NoSuchAlgorithmException ex) { 
     Logger.getLogger(RegistrationController.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (UnsupportedEncodingException ex) { 
     Logger.getLogger(RegistrationController.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return output; 
} 

次のように私は、ユーザーにパスワードを設定します。

u.setPassword(Base64.encode(digest(password)).toString()); 

私はBase64エンコードされませんこれは文書化されていないようですが、この質問:Glassfish Security - jdbcRealm: How to configure login with SHA-256 digestはそうする必要があることを示唆しています。

GlassFishは文字列(VARCHAR)またはバイト[](BLOB)をデータベースのパスワードフィールドとして想定していますが、正しくパスワードをハッシュしていますか?正しいですか?追加でBase64でパスワードハッシュをエンコードするには?

ありがとうございます!

答えて

2

GlassFishはデータベースのパスワードフィールドとして文字列(VARCHAR)またはバイト[](BLOB)を想定していますか?

それは、JDBCでのJavaタイプjava.lang.Stringにマップする列を期待し、それらは通常、CHARだろうJDBCレルムの実装はパスワードハッシュを取得するためにResultSet.getStringメソッド呼び出しの呼び出しを発行して、VARCHARなどのLOBは動作しません。

正しくパスワードをハッシュしていますか?また、パスワードハッシュをBase64でさらにエンコードするのは正しいですか?

サポートされているオプションは、Base64のみです。 16進符号化も実行できます。ただし、これらのいずれかを実行し、実行時に同じ処理を実行するようにJDBC Realmを設定する必要があります。エンコードパラメータがない場合、Glassfishはダイジェストに関連付けられたバイトシーケンスを、レルム用に設定されたcharsetの文字のシーケンスに変換します。

私は、この問題は、式input.getBytes("UTF-8")でUTF-8エンコーディングと関係があると思われます。 digestメソッドで提供される結果のBase64エンコーディングが実際にデータベースに格納されているパスワードハッシュと一致するかどうかを検証することは価値があります。

はまた、jdbcrealm.invaliduserreasonている失敗のために提供の理由を考慮すると、私はまた、次のいずれかの条件に該当かもしれないと思われるでしょう:

  • エンコーディングパラメータはJDBCレルムに指定されていません。好ましくはbase64またはhexのいずれかである必要があります(大文字と小文字は関係ありません)。そうでなければ、ダイジェストバイト配列が文字配列に変換されるシナリオになります。ユーザーが提供するパスワードが常に特定のエンコーディングであることを保証できない限り、意見は少し薄れそうです)。
  • データベースのユーザーのパスワードハッシュは存在しません。私の以前の答えはthe SQL query executedです。あなた自身でクエリを実行したいかもしれません。 Derbyが発行したステートメントをデータベースとして使用している場合は、derby.propertiesという名前のファイルをDerbyデータベースのロケーションに配置し、プロパティーにはderby.language.logStatementText=trueという名前を付けることができます。データベースをシャットダウンすると、derby.logファイルには、アプリケーション・サーバーから発行されたすべての照会が取り込まれます。
  • Glassfishによって準備されたSQLステートメントが正しくありません。
  • データベースへの接続を確立できませんでした。
+0

多くのおかげで再び!実際には、私はJDBC領域でエンコーディングパラメータを指定できませんでしたが、これは現在正しく動作しています。 – Laurens

+0

@Laurens、まあ、私はかなりの数週間前に同じ獣と戦ったので、あなたはそのすべてのトラブルを経験しないという利点があります。いずれにしても、そのプロジェクトのソースは数日で利用できるようになるので、私の答えを読むのではなく、実際の実装を見ることができます。 –

+0

それは楽しみにして、それを楽しみにしています! – Laurens

関連する問題