【问题标题】:Do I have to randomize key in OpenSSL我是否必须在 OpenSSL 中随机化密钥
【发布时间】:2015-08-23 14:08:01
【问题描述】:

我想在我的软件中使用 AES_256_GCM。 OpenSSL wiki 页面给了我一个例子:wiki page.
它表明只有函数 EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv) 使用密钥。
我的密钥是密码的 SHA3_256 哈希(SHA3_256 的 Qt 实现)。
我想知道我是否必须使用 PKCS#5 来随机化密钥或函数会处理这个问题。

【问题讨论】:

标签: openssl cryptography passwords aes pkcs#5


【解决方案1】:

我的密钥是密码的 SHA3_256 哈希(SHA3_256 的 Qt 实现)。

您可能应该使用 OpenSSL 的 PKCS5_PBKDF2_HMAC_SHA1 将密码消化成密钥。见How to use PKCS5_PBKDF2_HMAC_SHA1()。


它表明只有函数EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv) 使用密钥....我想知道我是否必须使用 PKCS#5 来 随机化密钥或函数负责处理。

字符串或文件的每次加密都应该得到自己的随机 IV。 IVs 不能重复。您的另一个选择是为每个字符串或文件使用随机密钥。

加密操作的输出是{IV,CipherText} 对。


AES_256_GCM 是个不错的选择。它可以变得更好的少数方法之一是使用Integrated Encryption Scheme。您可以查看 GitHub 上的 openssl-pkey-ec-ies。 Crypto++ 和 BouncyCastle 也有椭圆曲线集成加密方案的实现,所以你有其他选择。

一定要测试互操作。它们互操作,但需要转动一些旋钮。互操作的问题在于提供它的标准太多了,而且每个标准都有些不可互操作。

为了让您了解细微差别,ECIES 要求对特定变量进行哈希处理(它是给定数据字符串的长度)。一个标准以 4 个八位字节表示变量,另一个以 8 个八位字节表示变量。这是唯一的区别,如果您不知道会导致互操作问题。

【讨论】:

  • 如果您使用密码散列,那么您可以使用随机盐生成随机密钥(和 IV,如果这是您想要的)。
  • 我建议使用 PBKDF2-HMAC-SHA-256 或 PBKDF2-HMAC-SHA-512 代替,具体取决于需要多少密钥位; OpenSSL 两者都支持。
猜你喜欢
  • 2015-02-20
  • 2012-11-15
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
相关资源
最近更新 更多