說一下最近在開發過程中遇到加密相關的問題,先引用一段md5的解釋。
message digest algorithm md5(中文名為訊息摘要演算法第五版)為計算機安全領域廣泛使用的一種雜湊函式,用以提供訊息的完整性保護。該演算法的檔案號為rfc 1321(r.rivest,mit laboratory for computer science and rsa data security inc. april 1992)。需求:每次請求對請求體進行md5值計算,服務端做驗證並響應(雖然此功能並沒什麼用,但是需求提出來了,就是要做)。
開發:因為這些常用的工具類之前都寫好了,用的時候沒有多想就直接copy過來了,請求是併發的,剛剛開始的時候,併發請求較少(1-2)個,沒有出現什麼問題,後來請求3-4個同時發的時候,服務端偶爾丟擲md5值驗證錯誤的資訊,後來翻看了md5工具類之後才發現,原來這個類寫的方式並不支援併發,messagedigest被宣告為成員變數,多執行緒環境下會共享同乙個messagedigest物件,為什麼共享它在併發情況會出問題呢?
檢視messagedigest原始碼
/**
* updates the digest using the specified array of bytes.
**@param input the array of bytes.
*/public
void
update(byte input)
可以看到這裡呼叫了engineupdate方法,此方法進行乙個更新操作。
updates the digest using
the specified array of
bytes, starting at
the specified offset.
然後state屬性的狀態就被改變了,表明當前計算正在處理過程中。
state預設屬性
private
int state = initial;
然後需要呼叫messagedigest.digest()方法計算雜湊值
/**
* completes the hash computation by performing final operations
* such as padding. the digest is reset after this call is made.
**@return the array of bytes for the resulting hash value.
*/public
byte digest()
到這裡已經完成了md5值的計算,state屬性恢復初始狀態,如果想要重用messagedigest物件,還需要呼叫messagedigest.reset()方法進行重置,以免這次計算資料會對下一次的計算造成影響,從而導致計算結果錯誤。
而我所遇到的問題就是,在messagedigest在多執行緒的環境下,thread-1的計算還沒有完成的情況下,thread-2又開始使用該messagedigest物件進行下一次的計算,thread-2修改了messagedigest的狀態,thread-1使用被修改過後的messagedigest進行計算,從而導致了計算結果錯誤。
MessageDigest 使用說明
messagedigest 類為應用程式提供資訊摘要演算法的功能,如 md5 或 sha 演算法。資訊摘要是安全的單向雜湊函式,它接收任意大小的資料,並輸出固定長度的雜湊值。messagedigest 物件開始被初始化。該物件通過使用 update 方法處理資料。任何時候都可以呼叫 reset 方法...
MessageDigest的功能及用法
messagedigest 類為應用程式提供資訊摘要演算法的功能,如md5 and sha.資訊摘要是安全的單向雜湊函式,它接收任意大小的資料,並輸出固定長度的雜湊值。messagedigest 物件開始被初始化。該物件通過使用 update 方法處理資料。任何時候都可以呼叫 reset 方法重置摘...
MessageDigest實現MD5加密演算法
字串的md5加密演算法 文字的md5加密工具類 public class md5 public class md5 返回形式為數字和字串 private static string bytetoarraystring byte bbyte int id1 iret 16 int id2 iret 1...