2010-09-29 73 views
5

User实体类包含密码散列字段,这是一个字节数组具有固定长度(32,因为它是一个SHA-256哈希值)。存储一个散列作为字节数组JPA

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

正如你所看到的,我没有用任何特殊的注解,只是一个NOT NULL。

这个工程,但它会执行?我的模式是由Hibernate生成的,但我不知道它产生了什么(我目前正在使用内存中的HSQL数据库)。

我担心的是,由于它不知道它是一个固定长度的数组(length注释字段仅适用于字符串),因此它会将此散列存储在BLOB字段中,该字段将添加到记录为指针(如果我正确理解数据库的工作原理)。

这是真的,我该如何改变这种情况?我是否应该将散列作为一个字符串进行编码,并使用base64或hex进行编码,从而接受这种小的性能/正确性影响?

+0

为什么不用实际的目标数据库尝试它,看看它产生了什么? – skaffman 2010-09-29 12:46:33

+0

@skaffman:我已经改变了数据库,MySQL和它生成一个TINYBLOB列 – 2010-09-29 13:04:24

+0

我需要的是BINARY(32) – 2010-09-29 13:15:43

回答

1

TINYBLOB是一个很好的杰勋(mysql types reference),但我所有的应用程序很好地工作的字符串。 如果你真的关心毫秒,可以在探查器中试用这两个版本,并查看最佳效果。我的首选分析器是netbeans中的一个。

0

据我所知,一个SHA-256散列总是只能打印字符(如果不是,则将其编码为base64),所以解决的办法是你可以将它存储为字符串,然后使用Columnlength字段注解。

那么你已经有了固定的长度和性能的毋庸置疑。

+0

不,我已经看到了输出,它实际上主要由不可打印字符组成(或者根本不是字符数据)。我当然可以用base64或者hex进行编码,但是如果我可以用纯二进制格式存储它,那会很好。 – 2010-10-10 22:22:26

5

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

如果你指定列的长度,Hibernate会用这个信息来确定要生成的SQL列类型(TINYBLOBBLOB,MEDIUMBLOB,,LONGBLOB)。

我需要的是BINARY(32)

你试试这个?

@Column(columnDefinition="BINARY(32) NOT NULL") 
private byte[] passwordHash; 
0

它可能不是有效率的,但我建议你使用字符串作为存储类型,并根据需要与getter和setter方法翻译。这为不同数据库之间的JPA提供了最大的可移植性。

我用日期/时间类似的技术通过存储表示自UTC时代,让我避免时区问题(时区信息并非在所有数据库的数据库日期移植)时多头。

相关问题