2013-03-28 106 views
0

我使用AES來加密和解密我的密碼。我試圖實現的是,我需要以cookie的形式在客戶端存儲加密的密碼,然後當客戶端再次登錄到我的網站時,我需要從客戶端獲得加密的密碼並進行解密它會根據客戶端提供的未加密密碼進行檢查。我面臨的問題是,在加密時,我使用BASE64.encodeString()在java中將加密密碼的字節數組轉換爲字符串,以便它可以傳遞給客戶端。但是當我從客戶端(即cookie)獲取相同的字符串並嘗試解密它時,它會給我填充錯誤,即javax.crypto.illegalBlockSizeException:使用填充密碼解密時,輸入長度必須是16的倍數。base64編碼js問題

爲什麼會發生?

代碼加密:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec); 
      byte[] plainBytes = Data.getBytes(UNICODE_FORMAT); 
      byte[] encrypted = cipher.doFinal(plainBytes); 
      String encryption = Base64.encodeBase64String(encrypted); 
      return encryption; 

代碼解密:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec); 
     byte[] decryptval = Base64.decodeBase64(encryptedData); 
     byte[] decrypted = cipher.doFinal(decryptval); 
     return new String(decrypted); 

快到錯誤,因爲我傳遞的加密字符串存儲在cookie中的JS ??。 JS使用base64編碼的字符串嗎?

+0

如果黑客讀取base64字符串並連接到您的應用程序假裝是真正的用戶會怎麼樣? – DiogoSantana 2013-03-28 06:24:28

+0

我爲每次運行的加密算法分配一個不同的標記..還有一個系列標識符是檢查是否存在違反安全性的問題。 – 2013-03-28 06:38:07

回答

0

嘗試使用下面的方法字節轉換爲字符串,同時加密 -

public static String bytesToString(byte[] bytes) { 
    HexBinaryAdapter adapter = new HexBinaryAdapter(); 
    String s = adapter.marshal(bytes); 
    return s; 
} 

所以不是 -

String encryption = Base64.encodeBase64String(encrypted); 

使用

String encryption = bytesToString(encrypted); 

同樣,解密使用這種方法時 -

public static byte[] hexToBytes(String hexString) { 
    HexBinaryAdapter adapter = new HexBinaryAdapter(); 
    byte[] bytes = adapter.unmarshal(hexString); 
    return bytes; 
} 

那就是 -

byte[] decryptval = hexToBytes(encryptedData); 
+0

它給出了一個非法的ArgumentExeption:hexBinary需要是偶數的長度..我檢查了傳遞給js並從它收到的價值是相同的。 – 2013-03-28 06:53:26

+0

什麼是加密密鑰的長度 - 應該是16. – 2013-03-28 06:57:50

+0

我正在使用密鑰生成器生成密鑰作爲字節數組..如果我打印該字節數組它是11個字符的長度。同樣我也使用SecretKeySpec,它在初始化密碼時使用,就像我在加密代碼中看到的那樣,我需要我的密鑰以字節數組的形式出現。 – 2013-03-28 07:05:45

1

反對使用加密來存儲強烈提醒/傳輸密碼。

散列函數是一個更安全的想法。密碼和哈希之間的區別在於密碼是可逆的,而哈希是單向的(明文 - >哈希文本)。以a)明文或b)加密的方式將用戶密碼存儲在服務器上對於安全而言是一個很大的禁忌。

另一方面,哈希不能顛倒;

Message Digest md = MessageDigest.getInstance("MD5"); 
md.digest(input.getBytes()); 

的客戶端就可以哈希明文密碼:(至少在理論上)

一個簡單的哈希可以很容易地使用MessageDigest

獲得一個哈希可以很簡單的完成發送到服務器。然後,服務器可以比較散列來驗證並返回一個會話令牌給用戶,他們可以用於會話的其餘部分,而不必在整個地方傳輸密碼。

+0

當你只想檢查密碼的有效性時,哈希值是很好的。但在某些情況下,您可能需要解密存儲的密碼 - 例如,如果您要在文件中存儲數據庫密碼(加密)並想解密並將其用於連接。 – 2013-03-28 07:16:00