Has*_*yed 12 c++ hash cryptography crypto++ secret-key
背景
我正在设计一个系统,该系统能够为静态Web内容的用户开发动态认证方案.其动机是预先生成大量复杂的生成但敏感的Web内容,然后通过基于cookie(嵌入可逆加密信息)的身份验证进行静态服务,由Web服务器强制执行.使用AEAD模式加密原语.
问题
我需要生成一段时间有效的IVEC和密钥,比如一周(当前有效对).并且过去的IVEC /密钥也有效期为2周(历史上有效),并且使用历史有效秘密加密的任何数据将仅使用当前有效的IVEC/KEY重新加密.
我需要的是一个确定性的CSPRNG,即随机数和密码短语的种子,它可以以索引方式产生64位或128位数字块.如果我使用一周以来 - "1970年1月1日"作为我假设的CSPRNG的索引元素之一,我应该能够构建一个随着时间的推移自动更改密钥的系统.
我正在考虑的方法
现在我没有在cryptopp中看到这样的功能,或者我现在已经足够了解术语,并且由于cryptopp是最先进的加密库,我没有信心我会找到另一个.所以,如果我找不到实现,我应该自己动手.是否会从连接数据中生成静态字符串结构然后对其进行散列(如下所示)?
RIPEMD160(RandomPreGeneratedFixedNonce:密码短语:UInt64SinceEpoch:128BitBlockIndexNumber);
注意:块编号将被分配并具有常规结构,因此例如对于128位摘要,块0的前64位将用于ivec,而所有元素1用于128位密钥.
这是一种合理的方法( - .,加密安全)吗?
- 编辑:发表接受评论 -
经过一些反思后,我决定将我最初认为密码和nonce/salt的内容合并为一个16字节(加密强)密钥,并使用PKCS#5中概述的技术来导出多个基于时间的密钥.不需要盐,因为不使用密码短语.
有趣的问题。
首先,您的初始向量不必是加密强随机量,但它们应该是每条消息唯一的。IV 实际上只是一种盐值,可确保使用相同密钥加密的类似消息在加密后看起来不会相似。您可以使用任何快速伪随机生成器来生成 IV,然后将它(最好是加密的)与加密数据一起发送。
当然,钥匙应该尽可能地坚固。
您对包含随机数、密码和有效性数据的文本字符串进行哈希处理的提议在我看来非常合理——这与其他使用密码来生成密钥的系统的做法大体一致。您应该散列更多次——而不仅仅是一次——以使密钥生成在计算上变得昂贵(这对于任何试图暴力破解密钥的人来说都是一个比对你来说更大的问题)。
您可能还想查看 PKCS#5(例如http://www.faqs.org/rfcs/rfc2898.html)中规定的密钥生成方案,该方案在 cryptopp 中作为 PasswordBasedKeyDerivationFunction 实现。这种机制已经被广泛使用并且众所周知是合理安全的(请注意,PKCS#5 建议对密码短语数据进行至少 1000 次散列)。您可以将有效期和索引数据附加到密码短语中,并按原样使用 PasswordBasedKeyDerivationFunction。
您没有说明您建议使用哪种加密算法来加密数据,但我建议您应该选择一些广泛使用且已知安全的算法……特别是我建议您使用 AES。我还建议使用 SHA 摘要函数之一(可能作为 PasswordBasedKeyDerivationFunction 的输入)。SHA-2 是最新的,但 SHA-1 足以用于密钥生成目的。
您也没有说明要生成的密钥长度,但您应该知道密钥中的熵量取决于您使用的密码的长度,除非密码很长,否则远小于理想情况下所需的密钥长度。
该方案中最薄弱的环节是密码本身,这总是会限制您可以实现的安全级别。只要您对数据进行加盐(正如您所做的那样)并使密钥生成成本高昂以减缓暴力攻击,您应该没问题。