- 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/
我使用 Deflater 编写了一个备份程序SHA-1 用于存储文件和哈希值。我看到Java的Deflater使用zlib 。如果我显式设置 Deflater 的级别,无论平台和 JRE 版本如何,我
考虑以下算法: r = 2 while r >= 1: x = -1 + 2 * random.random() y = -1 + 2 * random.random() r
我正在编写一个持久保存到磁盘的映射类。我目前只允许 str键,但如果我可以使用更多类型会很好:希望最多可以是任何可散列的(即与内置 dict 相同的要求),但更合理的是我会接受字符串、unicode、
我有一个不使用随机化的脚本,当我运行它时会给出不同的答案。我希望每次运行脚本时答案都是一样的。该问题似乎只发生在某些(病态)输入数据上。 该代码段来自一种计算线性系统特定类型 Controller 的
这对我来说不是问题,没有它我也可以生活,但我只是好奇这是否可能以及如何实现。 今天我了解到,scrapy.Request 不会按照启动的顺序完成。 伪代码示例: class SomeSpider(sc
我正在运行这个 SVD来自 scipy 的求解器,代码如下: import numpy as np from scipy.sparse.linalg import svds features = np
我正在尝试使用确定性 Miller-Rabin 算法实现素数检查功能,但结果并不总是正确的:在检查前 1,000,000 个数字时,它只找到 78,495 而不是 78,498。 这是使用 [2, 7
我正在审查各种 Android 声音 API,我想知道我应该使用哪一个。我的目标是获得低延迟的音频,或者至少是关于播放延迟的确定性行为。 我们遇到了很多问题,Android 声音 API 似乎很垃圾,
过去,我处理过对时间要求严格的软件开发。这些应用程序的开发基本上是这样进行的:“让我们编写代码,测试延迟和抖动,并优化它们,直到它们在可接受的范围内。”我觉得这非常令人沮丧。这不是我所说的 适当的工程
给定: SQL Server 表名为 TEST_TABLE TEST_TABLE 中名为 TEST_FIELD 的列 VARCHAR(50) NOT NULL 第 1 行:10YR3/6 第 2 行:
我在 64 位 Windows PC 上使用 Microsoft Visual Studio Community 2015,版本 14.xxx。 程序读取一个文本文件,其中每一行都是桥牌(四名玩家,每
我需要在 PHP 中创建一个可证明公平(确定性和种子)加密安全 (CS) 随机数生成器。我们正在运行 PHP 5,而 PHP 7 现在并不是一个真正的选择。但是,我找到了 PHP 7 的新 CS 函数
我是一名优秀的程序员,十分优秀!