2011-06-06 79 views
5

我有一個問題,也許是一個愚蠢的問題,我希望將數據存儲在數據庫後,我與SHA1算法散列。但是,在未來的時間,數據庫中的大小會增加,因爲SHA1中的大小單詞很大。如何減小SHA1的大小?

我們可以減小SHA1算法的大小,大小可能只有一半。我爲我的愚蠢問題和我的糟糕英語感到抱歉。謝謝。 :D

我正在使用JAVA。

+0

你需要什麼散列?需要哪種散列函數和輸出大小取決於你想要用它做什麼。 – CodesInChaos 2011-06-06 10:33:16

回答

10

每個散列20個字節(假設二進制存儲)真的太多了嗎?如果您當前使用十六進制編碼切換到二進制文件,則每個哈希節省20個字節與十六進制相比,Base64節省大約10個字節。

如果您只是截斷加密散列,它仍然是一個很好的加密散列,但輸出大小減小。您需要的輸出尺寸取決於您的應用程序。

針對隨機更改的完整性檢查可以使用更短的32-64位散列,並且不需要加密散列函數。

如果您需要唯一性,您的散列應該有>>2*log_2(entries)位(請參閱birthday paradox)。在大約120位它是類似於一個GUID/UUID(有一個基於sha1的GUID生成模式)

如果你想要加密強度,我會避免低於128位。

4

否;根據定義,SHA-1散列的大小爲160位。我強烈懷疑散列的大小將成爲一個問題;我想你的數據庫中還有其他數據?很可能,您會發現其他部分數據對數據庫大小的貢獻更大。你希望這些散列有多少行?

但是,將散列存儲爲字符串(這將需要至少40個字節,取決於字符串編碼)並將其存儲爲二進制數據(這將需要20個字節)之間的大小差異。

可以切換到其他算法,如其他人已經注意到的,但從安全角度來看,這可能不是一個好的選擇 - 哈希算法的輸出長度越短,其越弱。

+1

Base64仍然是一個人類可讀的字符串,但確實需要少於40個字節。 – CodesInChaos 2011-06-06 10:34:38

+0

@CodeInChaos:True;這也是一種選擇。 – 2011-06-06 10:35:52

+0

我想存儲交易信息中的密鑰,所以也許你的建議是好的編碼..感謝.. – fahmi 2011-06-06 10:40:29

5

如果你減少它不再是SHA1 :)。你必須考慮一個不同的算法