【发布时间】:2018-01-09 18:30:48
【问题描述】:
我有 java 代码,可以为我生成 aes 加密代码,现在我正在尝试使用 crypto-js 在 javascript 上使用它,但是两个代码都提供了不同的密钥,我不知道为什么以及如何获得相同的密钥,这是我的代码
public static String encrypt(String text, byte[] iv, byte[] key)throws Exception{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
System.out.println("KEY SPECCCC: "+keySpec);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec);
byte [] results = cipher.doFinal(text.getBytes("UTF-8"));
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(results);
}
JavaScript 代码
require(["crypto-js/core", "crypto-js/aes"], function (CryptoJS, AES) {
ciphertext = CryptoJS.AES.encrypt(JSON.stringify(jsondata),
arr.toString(),arr.toString());
});
字符串转为 utf-8
var utf8 = unescape(encodeURIComponent(key));
var arr = [];
for (var i = 0; i < utf8.length; i++) {
arr.push(utf8.charCodeAt(i));
}
【问题讨论】:
-
如果您只使用对称加密,您需要在服务器和客户端使用完全相同的密钥。如果您将加密密钥从服务器发送到客户端或其他方式,您需要加密您的对称加密密钥。最简单的方法是使用 TLS。如果你使用 TLS,那么数据和密钥都是加密的,所以你不需要自己加密。这不提供任何安全性,只是有点混淆。您应该阅读:nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/…
-
您的代码不完整。您能否展示如何在 Java 和 JS 中解码您的密钥和 IV 以及实际值?
-
IV 必须是不可预测的(阅读:随机)。不要使用静态 IV 或与密钥相同的值,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定之前发送相同消息前缀的时间。 IV 不是秘密,因此您可以将其与密文一起发送。通常,它只是简单地添加到密文中,并在解密之前被切掉。
标签: javascript java encryption aes cryptojs