2012-02-13 93 views
2

我正在使用SHA-512來哈希我的密碼並將它們存儲在mysql數據庫中。是否有任何要求sha-512的輸入不應包含任何特殊字符? 因爲密碼'Qwerty123.1'和'Qwerty123'。正在接受治療,但「Qwerty.11」與上述內容不一樣。問題是什麼?SHA-512特殊字符處理

,我使用的代碼是:

BASE64Decoder decoder=new BASE64Decoder(); 
byte[] b=decoder.decodeBuffer(r1);   //r1 is the string containing password 

MessageDigest md=MessageDigest.getInstance("SHA-512"); 
md.update(b); 
byte[] plaintext=md.digest(); 
BASE64Encoder encoder=new BASE64Encoder(); 
String digest1=encoder.encode(plaintext); //digest1 contains the msg digest 
+0

號,輸入到哈希函數是二進制(字節數組),所以這是一個問題的不是。通常它是客戶端(鍵盤佈局,網頁瀏覽器,程序),使用戶難以正確輸入特殊字符。 – vasquez 2012-02-13 09:46:40

回答

3

爲R1有效的base64編碼字符串?在我看來,你得到了相同的結果,因爲你試圖解碼某些不是有效的Base64數組的東西,而BASE64Decoder在某種程度上失敗了。你有沒有嘗試過這樣的:

byte[] b = r1.getBytes("UTF-8"); 
MessageDigest md=MessageDigest.getInstance("SHA-512"); 
md.update(b); 
byte[] plaintext=md.digest(); 
BASE64Encoder encoder=new BASE64Encoder(); 
String digest1=encoder.encode(plaintext); //digest1 contains the msg digest 
+0

這非常合理,特別是BASE64Decoder只是通過明文輸入。 ''不是在base64中使用的字符,所以很可能BASE64Decoder在第一個''後默默地跳過它或丟棄所有的東西。 – 2012-02-15 09:48:00

+2

btw,出於未來的需要,我會更改'r1.getBytes();'以使用明確的字符集,以便哈希值不依賴於默認的系統編碼。 – 2012-02-15 09:48:55

+0

非常真實,編輯它使用UTF-8。 – Sirs 2012-02-15 09:53:49