【问题标题】:Is it possible to lower the encryption level to avoid the error: Unable to initialize due to invalid secret key是否可以降低加密级别以避免错误:由于密钥无效而无法初始化
【发布时间】:2014-11-29 22:17:24
【问题描述】:
import org.junit.Test;
import org.springframework.security.crypto.encrypt.Encryptors;
import org.springframework.security.crypto.encrypt.TextEncryptor;

public class EncryptorTest {

  @Test
  public void testEncryption() {
    TextEncryptor te = Encryptors.text("password", "abcdef");
    te.encrypt("Hello World!");
  }

}

我收到此错误:

java.lang.IllegalArgumentException: Unable to initialize due to invalid secret key

看来我必须下载一些策略文件 JCE 扩展才能使其工作:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

我想在部署过程中避免这种额外的依赖,老实说,我不需要 256 位加密。

是否可以将级别降低到无需下载此 JCE 扩展即可工作的东西?

【问题讨论】:

  • 似乎没有这个选项;查看 API 它是 256 位或高速公路。我不是这类包装器的忠实拥护者,您可以相对容易地模仿 API。

标签: java spring encryption


【解决方案1】:

没有值 256 被硬编码到源代码中:

PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), Hex.decode(salt), 1024, 256);

这可以在第 54 行的AesBytesEncryptor 中找到,至少到版本 3.2.5。

请注意,Spring 使用 Apache 许可证,因此没有什么能阻止您创建自己的使用 128 作为常量的实现。

【讨论】:

  • 这是我可以复制粘贴然后将 256 更改为 128 的主类吗?
  • 是的,这似乎是一个不错的选择 - 改变了答案。需要注意的一件重要事情:包装类没有添加完整性或身份验证(例如 HMAC),并且您不应该在传输协议中使用 CBC 操作模式(即应用填充预言的地方)。在密文 IV 上添加 HMAC 将显着提高安全性。
  • 一个问题,当用户进行身份验证时,我是使用相同的盐值对用户密码进行哈希处理,然后与数据库中的哈希值进行比较,还是解密数据库中的密码并将其与尝试?
  • 通常你只是比较散列,但如果执行得当,解密将等同于同样的事情。如果您想将密码用于不同的目的,您可以使用解密或 - 甚至更好 - 额外的密钥派生,但通常只是简单地比较哈希。
  • 有趣的是,即使我使用相同的盐值,哈希结果也是不同的。所以我必须解密数据库中用户的密码哈希,并将其与纯文本密码尝试进行比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多