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