2010-09-29 72 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時代,讓我避免時區問題(時區信息並非在所有數據庫的數據庫日期移植)時多頭。