背景
我正在设计一个系统,可以为静态 Web 内容的用户开发动态身份验证方案。其动机是预先生成大量复杂但敏感的 Web 内容,然后使用基于 cookie(嵌入可逆加密信息)的身份验证静态地提供它,由 Web 服务器单独强制执行。使用 AEAD 模式加密原语。
问题
我需要生成在一段时间内有效的 IVEC 和密钥,比如一周(当前有效对)。并且过去的 IVEC/密钥也有效期为 2 周(历史有效),并且使用历史有效机密加密的任何数据都将使用当前有效的 IVEC/KEY 重新加密。
我需要的是一个确定性的 CSPRNG,它包含随机数和密码短语的种子,并且可以以索引方式生成 64 位或 128 位数字块。如果我使用“自 1970 年 1 月 1 日以来的几周”作为我假设的 CSPRNG 的索引元素之一,我应该能够构建一个系统,随着时间的推移自动更改密钥。
我正在考虑的方法
现在我在 cryptopp 中看不到这样的功能,或者我现在已经足够了解术语了,而且由于 cryptopp 是目前最先进的加密库,我没有信心找到另一个。所以,如果我找不到那里的实现,我应该推出自己的。从连接的数据中生成一个静态字符串结构,然后对其进行散列(如下所示)可以解决问题吗?
RIPEMD160(RandomPreGeneratedFixedNonce:PassPhrase:UInt64SinceEpoch:128BitBlockIndexNumber);
注意:块编号将被分配并具有规则的结构,例如对于 128 位摘要,块 0 的前 64 位将用于 ivec,而元素 1 的所有元素将用于 128 位密钥。
这是一种合理的方法(--即加密安全)吗?
-- 编辑:发表接受评论 --
经过一番思考,我决定将我最初认为的密码短语和 nonce/salt 合并为一个 16 字节(加密强)密钥,并使用 PKCS #5 中概述的技术来派生多个基于时间的密钥。不需要盐,因为不使用密码。