MessageDigest 使用注意,併發問題

2021-07-26 02:30:55 字數 1652 閱讀 8591

說一下最近在開發過程中遇到加密相關的問題,先引用一段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...