8

エンティティをデータベースに永続化するために 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[]を使用するようにデータベースを設計するにはどうすればよいでしょうか。

4

3 に答える 3

1

私の場合、データベース設計が悪いため、Clob の場合は Blob を使用する必要があります。解決策は、Lob アノテーションを使用してプロパティを休止状態にマップし、別のプロパティを String 型に配置することでした。

コードの他のレベルでは、get または set を呼び出すときに String プロパティを使用し、これを使用してバイト配列値を取得または設定します。

@Entity
@Table(name = "CMUN_TAGS")
@SequenceGenerator(name = "idSeqTag", sequenceName = "SEQ_CMUN_TAGS")
public class CmunTagsDO implements java.io.Serializable {
  private BigDecimal lngIdTag;
  private byte[] blobValTag;
  private String strValTag;

  @Id
  @Column(name = "LNG_ID_TAG", unique = true, nullable = false, precision = 20, scale = 0)
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idSeqTag")
  public BigDecimal getLngIdTag() {
    return this.lngIdTag;
  }

  public void setLngIdTag(BigDecimal lngIdTag) {
    this.lngIdTag = lngIdTag;
  }

  @Column(name = "BLOB_VAL_TAG", nullable = false)
  @Lob
  public byte[] getBlobValTag() {
    return this.blobValTag;
  }

  public void setBlobValTag(byte[] blobValTag) {
    this.blobValorTag = blobValorTag;
  }

  @Transient
  public String getStrValTag() {
    strValTag = new String(getBlobValTag());
    return strValTag;
  }

  public void setStrValTag(String strValTag) {
    setBlobValTag(strValTag.getBytes());
    this.strValTag = strValTag;
  }
}
于 2012-06-05T14:21:41.313 に答える