【问题标题】:Crypto.JS with AES Default Key Expansion - Decrypt in JavaCrypto.JS 与 AES 默认密钥扩展 - 在 Java 中解密
【发布时间】:2018-07-20 08:22:26
【问题描述】:

大家好,客户端应用程序正在使用 cryptoJs Library 进行 AES 加密

通过以下方式: CryptoJS.AES.encrypt("Message", "SampleKey123456") 来自文档:

对于密钥,当您传递一个字符串时,它会被视为密码并用于派生实际密钥和 IV。

Java 服务器使用的是 JDK8 + JCE

问题:

  • IV 是否会添加到加密字符串(前 16 个字节)?我猜不是,因为它说:derive an actual key and IV
  • 如何在 Java 中使用相同的密钥扩展或者它是哪种算法?我有密码短语 "SampleKey123456" 作为纯文本,如果它是实际密钥而不是密码短语,我会使用 new SecretKeySpec(keyPlain.getBytes(), "AES")
  • 另一个想法是使用标准的密钥扩展/派生函数,如 pbkdf,可以很容易地在 cryptoJs 和 Java 中使用。

【问题讨论】:

  • cryptojs 的密钥推导seems to be 一个笑话(1 轮 md5)。绝对使用 pbkdf2 或 scrypt。
  • 我知道,很遗憾,客户端应用程序不在我的责任范围内。

标签: javascript java encryption aes cryptojs


【解决方案1】:

如果有人对 spring-security-crypto 兼容版本感兴趣: http://jsfiddle.net/robertwiesner/14Lhapv0/ 它使用带有密码和盐的 PBKDF2

var password = $("[name='password']").val();
var salt = CryptoJS.enc.Utf8.parse($("[name='salt']").val());
var key = CryptoJS.PBKDF2(password, salt, {
keySize: 256 / 32,
iterations: 1024
});

在春季:return Encryptors.standard(cryptoPassword, new String(Hex.encode(Utf8.encode(cryptoKeySalt)))); 其中 cryptoPassword 和 cryptoKeySalt 是常规字符串属性。

很快就会在 GitHub 上发布一个完整的示例。

【讨论】:

    猜你喜欢
    • 2020-04-28
    • 2015-09-23
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2012-02-21
    • 2018-07-13
    相关资源
    最近更新 更多