0

我正在使用 AES 来加密和解密我的密码。我要实现的是,我需要以 cookie 的形式将加密密码存储在客户端,然后当客户端再次登录到我的网站时,我需要从客户端获取加密密码并解密它会根据客户端提供的未加密密码进行检查。我面临的问题是,在加密时,我使用 java 中的 BASE64.encodeString() 将加密密码的字节数组转换为字符串,以便将其传递给客户端。但是,当我从客户端(即从 cookie 中)获得相同的字符串并尝试对其进行解密时,它给了我填充错误,即 javax.crypto.illegalBlockSizeException :使用填充密码解密时,输入长度必须是 16 的倍数。

为什么会这样?

加密代码:

  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);

错误是因为我将加密字符串传递给 js 以存储在 cookie 中。??JS 会摆弄 base64 编码的字符串吗?

4

2 回答 2

1

强烈建议不要使用密码来存储/传输密码。

哈希函数是一个更安全的想法。Cipher 和 Hash 之间的区别在于 Cipher 是可逆的,而 Hash 是一种方式(Plaintext -> Hashtext)。以 a) 明文或 b) 加密的形式将用户密码存储在服务器上是安全方面的一大禁忌。

另一方面,哈希不能反转;(至少理论上)

使用MessageDigest该类可以轻松完成简单的哈希

获取哈希可以非常简单:

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

然后,客户端可以散列明文密码以发送到服务器。然后,服务器可以比较哈希值以进行身份​​验证并将会话令牌返回给用户,用户可以在会话的其余部分使用该令牌,而无需在各处传输密码。

于 2013-03-28T06:50:41.107 回答
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);
于 2013-03-28T06:21:36.880 回答