【问题标题】:Why hashing is required if i am using my own secret key? [closed]如果我使用自己的密钥,为什么需要散列? [关闭]
【发布时间】:2014-02-24 11:46:21
【问题描述】:

如果我使用自己的密钥,为什么需要散列?我发现到处都是如下图所示

        key = myKey.getBytes("UTF-8");
        sha = MessageDigest.getInstance("SHA-1");
        key = sha.digest(key);
        key = Arrays.copyOf(key, 16);
        secretKey = new SecretKeySpec(key, "AES");

有人可以解释一下这里散列的好处是什么吗?

【问题讨论】:

  • 这只是一种从较大的密钥中获取 16 字节密钥的可靠且安全的方式。
  • key 不能是正确选择的密钥,因为您使用 UTF-8 对其进行编码。

标签: java encryption aes encryption-symmetric


【解决方案1】:

因为在您的情况下,AES 需要一个 128 位密钥,因此构建它需要 16 个字节。如何获得这 16 个字节?最常见的方法是散列您的用户密码并获取散列的前 16 个字节。这样做将确保 AES 算法将始终接收正确的 16 字节密钥。

借助散列算法,即使是“123456”或“god”等短密码也会被转换为固定长度的 20 字节散列

【讨论】:

  • 在我的情况下,我使用 unix 生成 128 位密钥并使用以下命令将其写入文件 dd if=/dev/urandom of=/data/myfolder/key/aeskey .txt bs=16 计数=1。我可以直接从文件中读取密钥进行加密/解密吗?或者我需要在读取后进行哈希处理。
  • 在您的情况下,没有理由这样做。散列不会使您的密钥更强或更弱(就熵而言)。这只是一种单向转换。 /dev/urandom 是一个很好的熵源,只要底层 PRNG 良好,您就可以直接将其结果提供给 AES。
  • 非常感谢您的帮助!!
  • 不客气! +1 为您使用 /dev/urandom 而不是经典的 rand(time(0));
猜你喜欢
  • 2014-02-18
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2010-09-10
相关资源
最近更新 更多