- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
背景
我正在设计一个系统,该系统可以为静态 Web 内容的用户开发动态身份验证方案。其动机是预先生成大量复杂但敏感的 Web 内容,然后使用基于 cookie(嵌入可逆加密信息)的身份验证静态地提供它,由 Web 服务器单独强制执行。使用 AEAD 模式加密原语。
问题
我需要生成在一段时间内有效的 IVEC 和 key ,比如一周(当前有效对)。并且过去的 IVEC/ key 也有效期为 2 周(历史有效),并且使用历史有效 secret 加密的任何数据都将使用当前有效的 IVEC/KEY 重新加密。
我需要的是一个确定性的 CSPRNG,它包含随机数和密码短语,并且可以以索引方式生成 64 位或 128 位数字 block 。如果我使用“自 1970 年 1 月 1 日以来的几周”作为我假设的 CSPRNG 的索引元素之一,我应该能够构建一个系统,随着时间的推移自动更改 key 。
我正在考虑的方法
现在我在 cryptopp 中看不到这样的功能,或者我现在已经足够了解术语,而且由于 cryptopp 是目前最先进的加密库,我没有信心找到另一个。所以,如果我找不到那里的实现,我应该推出自己的。从连接的数据中生成一个静态字符串结构,然后对其进行散列(如下所示)可以解决问题吗?
RIPEMD160(RandomPreGeneratedFixedNonce:PassPhrase:UInt64SinceEpoch:128BitBlockIndexNumber);
注意: block 编号将被分配并具有规则结构,因此例如对于 128 位摘要, block 0 的前 64 位将用于 ivec,所有元素 1 用于 128 位 key 。
这是一种合理的方法(--即加密安全)吗?
-- 编辑:发表接受评论--
经过一番思考,我决定将我最初认为的密码短语和 nonce/salt 合并为一个 16 字节(加密强) key ,并使用 PKCS #5 中概述的技术导出多个基于时间的键。不需要盐,因为不使用密码。
最佳答案
有趣的问题。
首先,您的初始 vector 不必是加密性强的随机量,但它们应该对每条消息都是唯一的。 IV 实际上只是一种盐值,可确保使用相同 key 加密的类似消息在加密后不会看起来相似。您可以使用任何快速的伪随机生成器来生成 IV,然后将其与加密数据一起发送(最好是加密的)。
当然, key 应该尽可能地坚固。
在我看来,您对包含随机数、密码和有效性数据的文本字符串进行哈希处理的提议非常合理——这与其他使用密码生成 key 的系统所做的大致一致。您应该多次散列——而不仅仅是一次——以使 key 生成在计算上变得昂贵(对于任何试图暴力破解 key 的人来说,这将是一个比对你来说更大的问题)。
您可能还想查看 PKCS#5 中规定的 key 生成方案(例如 http://www.faqs.org/rfcs/rfc2898.html ),该方案在 cryptopp 中作为 PasswordBasedKeyDerivationFunction 实现。这种机制已经被广泛使用并且被认为是相当安全的(请注意,PKCS#5 建议对密码短语数据进行至少 1000 次散列)。您可以将您的有效期和索引数据附加到密码短语中,并按原样使用 PasswordBasedKeyDerivationFunction。
您没有说您建议使用哪种加密算法来加密数据,但我建议您应该选择一些广泛使用且已知安全的算法......特别是我建议您使用AES。我还建议使用 SHA 摘要函数之一(可能作为 PasswordBasedKeyDerivationFunction 的输入)。 SHA-2 是最新的,但 SHA-1 足以生成 key 。
您也没有说明您希望生成的 key 长度,但您应该注意, key 中的熵量取决于您使用的密码的长度,除非密码是 very long 这将远小于理想所需的 key 长度。
此方案中最薄弱的环节是密码本身,而这总是会限制您可以达到的安全级别。只要您对数据进行加盐(就像您正在做的那样)并使 key 生成成本高昂以减缓暴力攻击,您应该没问题。
关于c++ - 确定性地生成加密安全 key 和 IVEC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4303607/
背景 我正在设计一个系统,该系统可以为静态 Web 内容的用户开发动态身份验证方案。其动机是预先生成大量复杂但敏感的 Web 内容,然后使用基于 cookie(嵌入可逆加密信息)的身份验证静态地提供它
我很无聊,写了一个围绕 openSSL 的包装器来用更少的工作进行 AES 加密。如果我这样做: http://pastebin.com/V1eqz4jp (ivec = 0) 一切正常,但默认的iv
我有一个包含多个 GLSL 程序 (OpenGL 3.3) 的场景。这些程序使用不同的着色器,它们很相似,但(将)有一些差异。我有一个统一的ivec4 char1,所有版本的名称都相同,它对所有程序具
我是一名优秀的程序员,十分优秀!