【发布时间】:2015-04-28 18:41:31
【问题描述】:
我正在以这种方式使用 Spring 4 Encryptors 类处理加密:
String salt = KeyGenerators.string().generateKey();
TextEncryptor textEncryptor = Encryptors.text("MY_SECRET_KEY", salt);
textEncryptor.encrypt(json);
在客户端 javascript 中,我尝试使用 CryptoJS 进行解密
var uncrypted = CryptoJS.AES.decrypt(serverEncrypted, "MY_SECRET_KEY");
$("#encrypted-data").val(uncrypted);
我猜我需要还原十六进制编码部分,但我不明白需要做什么。
我尝试在解密之前进行解析,但没有任何好处。
CryptoJS.enc.Hex.parse(serverEncrypted)
spring 文档说 text 方法将使用“标准”加密方法中的十六进制值进行加密,这是使用 PKCS #5 的 PBKDF2 的 256 位 AES
[搜索进度]
这是 Spring 创建密钥的方式:
PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, 1024, 256);
SecretKey secretKey = newSecretKey("PBKDF2WithHmacSHA1", keySpec);
SecretKeySpec secretKey = new SecretKeySpec(secretKey.getEncoded(), "AES");
还有加密:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv));
iv 是一个 8 字节的安全随机数组,被添加到加密数据之前。
【问题讨论】:
-
注意所有的JS字符串都是unicode...
-
那么这意味着什么?
-
这意味着加密非unicode字符串的结果将不同于以非unicode格式编码相同字符串的结果。我注意到在使用非 js 后端和 js 前端时,这是一个很大的兼容性问题。也许你的java字符串已经是Unicode,在这种情况下我浪费了你的灰质......
-
我应该使用不同的编码方法吗?
-
你需要尝试几个,直到你找到一个在每一端产生相同输出的。我曾经为 AES 找到了 php+js 的匹配项,但我没有寻找 java。我确信外面的东西可以做到这一点,如果你可以强制使用 unicode 或转换为一组 char 代码,那么你所拥有的可能会工作。
标签: java javascript spring encryption cryptojs