エンティティをデータベースに永続化するために Hibernate/Java を使用しています。エンティティには、 Stringであるパスワードフィールドがあります。アプリケーションにユーザーを登録するとき、SHA-1 を使用してパスワードをハッシュします (これが少し弱いことは承知しています)。これによりbyte[]が生成され、これを使用
してStringに変換し
ます。ユーザーをログインさせたいときはいつでも、データベースからハッシュ化されたパスワードを ( Stringとして) 取得し、ログイン時に入力パスワードのダイジェストと比較します。
new String(byte[] arr);
hashedPasswordFromDatabase.equals(SHA1_HASH(inputPassword));
これは私の開発システム (Windows 7、JDK 1.6.0_23 / JDK 1.7、MySQL 5.5、Tomcat 6.0.26) では完全に機能しましたが、サーバー (Linux で JDK 1.6 を実行) にデプロイすると、equalsメソッドは TRUE と評価されません。等しいパスワードの場合。新しい開発システム (Ubuntu 12.04、MySQL 5.5、JDK 1.7.0_03、Tomcat 7.0.22) をすばやくセットアップしましたが、そこでも機能しません。
Stringクラスの Java API ドキュメントに記載されている可能性のあるエンコーディングの問題を認識しており、SO のいくつかの場所にも記載されています。このフォーラムで提案されているいくつかのエンコーディング (例: Base64、Latin-1) を試しましたが、最終的にUnsupportedEncodingExceptionになりました。String 変換は避けたほうがよいと思います。では、Hibernate で生成されたエンティティ クラスがパスワードフィールドにStringではなくbyte[]を使用するようにデータベースを設計するにはどうすればよいでしょうか。