使用JPA将哈希存储为字节数组

Bar*_*lom 6 database hash hibernate jpa blob

我的User实体类包含密码哈希字段,它是一个具有固定长度的字节数组(32,因为它是SHA-256哈希).

@Entity
public class User {
    @Column(nullable=false)
    private byte[] passwordHash;
    ...
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我没有用任何特殊的东西注释它,只是一个NOT NULL.

这有效,但它会表现吗?我的架构是由Hibernate生成的,但我不确切知道它生成了什么(我目前正在使用内存中的HSQL数据库).

我很担心,因为它不知道它是一个固定长度的数组(注释的length字段Column只适用于字符串),它会将这个哈希存储在BLOB字段中,该字段作为指针添加到记录中(如果我正确理解数据库是如何工作的.

这是真的,我怎么能改变这个?我应该只使用base64或hex将哈希值编码为字符串,接受它的小的性能/正确性影响吗?

Pas*_*ent 5

我担心,因为它不知道它是一个固定长度的数组(Column注释仅适用于字符串的长度字段),(...)

如果指定列的长度,Hibernate会使用这些信息来确定SQL列类型生成(TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB)虽然.

我需要的是BINARY(32)

你试过这个吗?

@Column(columnDefinition="BINARY(32) NOT NULL")
private byte[] passwordHash;
Run Code Online (Sandbox Code Playgroud)


小智 1

tinyblob 是一个很好的乐趣(mysql 类型参考),但我所有的应用程序都可以很好地使用字符串。如果您确实关心毫秒,请在分析器中尝试这两个版本,看看哪个版本效果最好。我首选的分析器是 netbeans 中包含的分析器。