項目中有好幾個地方用到了哈希算法,更確切地說,是SHA算法的應用場景。MD5也是常用的哈希算法,但已經被證明不再安全,SHA-1也是如此,不安全的原因主要是彩虹表,或是碰撞計算,這里不詳細描述。一般推薦使用SHA-256或者SHA-512,至少在當前是安全的。
哈希表在代碼中也普遍使用,是一種用於關鍵字查詢的數組或順序列表,這里就不說了。
1. 校驗安裝文件的完整性
在軟件部署的時候,計算軟件包當前的哈希值是否與預設值相等,防止軟件包被篡改或被替換。Linux提供了基於sha算法的命令,用於計算文件的哈希值
sha256sum fileName
2. 存儲和校驗用戶口令
用戶口令不能用明文存儲,更進一步,如果系統不知道用戶口令明文,那就更好了,而哈希算法就可以做到既不知道用戶明文,又可以校驗用戶口令。詳見《基於哈希算法的web賬戶口令存儲方法》,http://www.cnblogs.com/todsong/archive/2012/04/22/2465178.html
3. 校驗重復提交的消息
用戶可能因為誤操作重復提交數據,而這些數據會對系統產生影響,若要拒絕這些消息,最好的方法就是在每次提交時,計算消息的哈希值,當發現疑似重復提交的時候,做消息哈希值的對比。這是一個CPU密集型的操作,如果系統的CPU負載比較低,可以考慮使用。至於如何在代碼中使用哈希算法,這里就不描述了,Java、C++都有現成的算法庫可用。
4. 作為數據庫樂觀鎖的條件
數據庫中,最常用的樂觀鎖方法是在表中增加額外的一列,用於記錄一行數據的版本值,通常是一個計數或是時間戳。但是,一張已經存在大量數據的表需要增加額外的版本列,似乎不太可行,也不太方便,此時可以通過哈希計算出虛擬的版本列,用於樂觀鎖定控制。Oracle數據庫提供了哈希算法的存儲過程,輸入某幾個列數據的字符連接,輸出該條記錄的哈希值,通過比較該值判斷數據是否被修改。下面是摘自《Oracle 9i&10g 編程藝術》的例子
begin for x in ( select deptno, dname, loc from dept where deptno = 10 ) loop dbms_output.put_line( 'Dname: ' || x.dname ); dbms_output.put_line( 'Loc: ' || x.loc ); dbms_output.put_line( 'Hash: ' || dbms_crypto.hash ( utl_raw.cast_to_raw(x.deptno||'/'||x.dname||'/'||x.loc), dbms_crypto.hash_sh1 ) ); end loop; end; /
上面存儲過程執行的結果是
Dname: ACCOUNTING Loc: NEW YORK Hash: C44F7052661CE945D385D5C3F911E70FA99407A6 PL/SQL procedure successfully completed.
5. 作為數據庫表分區的分區條件
如果難以按照某一個列對數據庫表做分區,表中的數據又沒有太多的業務邏輯,那么通過哈希函數強行分區是個不錯的選擇。詳見《Oracle分區表,哈希分區的新建與增加》,http://www.cnblogs.com/todsong/archive/2012/08/26/2657158.html
