正如您在评论中的问题所建议的那样。这是一种与您当前正在构建的模式略有不同的模式。
首先,如果您对某些内容进行加密,请使用公认的和众所周知的工具进行加密。现在的经典是AES。这是原始密码,对 16 字节块执行加密。它只需要一个长度为 128、192 或 256 位的密钥。
实际上,底层密码支持的长度比这更多,但是该算法已经在这 3 种长度上进行了大量测试,因此您可能会坚持使用它们。
现在,您必须确定如何在特定情况下使用密码。加密方式的选择非常重要。加密模式是使用给定密码的一种特殊方式。最基本的是ECB(电子密码本)。它只包括使用给定密钥一个接一个地应用密码块。你应该像避免瘟疫一样避免它!
当你有加密模式时,你还没有完成。然后你必须找到我们可以称之为关键时间表的东西。也就是说,给定一个唯一密钥,例如密码或密码短语,您必须派生所需的密码密钥以提供给底层密码系统(分组密码 + 加密模式)。
我将从一个基于 AES-128(AES 与 128 位密钥一起使用)的简单模式开始。
关键时间表
从密码短语派生密钥的一个好方法是使用散列函数。您只需对密码短语和(可选)附加数据进行哈希处理即可获得实用密钥。这是我基于HMAC构造的建议:
输入: 7 到 80 个字符的密码K,指定目标用户的字符串s (如伪)和哈希函数H。
输出:一个加密密钥K s
您使用以下过程得出K s
K s = HMAC-H ( s , K )
根据H的摘要长度,您可能必须将其截断以仅获得 128 位。(众所周知的散列函数通常具有超过 128 位的输出)。例如,您可以使用H = SHA-1 或H = MD5。
密码系统
我不知道您存储的数据可以保存多长时间,但我认为它不会太大。我建议使用CBC(密码块链接)模式。这种模式需要著名的 128 位密钥和一个额外的 128 位向量,称为初始化向量(简称IV)。您绝不能使用相同的 (key, IV) 对两次!(规则1])
现在,这是你可以做的,假设:
- 每个用户有一个数据文件
- 您接受 IO 操作的一点开销
您将以 512 字节为基础(即 32 个 16 字节的块)对数据进行加密。IV模式很简单:您首先在 16 字节上编码 0,然后每次添加新的 512 字节块时递增它。
一个简单的例子:
用户克苏鲁想和他的朋友保持联系,分享他的邪恶阴谋。他的密码是厄运。
- 他的数据文件将使用K Cthulhu加密,其中K = doom,因此K Cthulhu = HMAC-H (Cthulhu, doom)
- 该文件分为 512 字节的块。数据块编号i的IV是i在 16 字节上的常见整数二进制表示。
我知道 Cthulhu 可以有很多邪恶的朋友,但我可以合理地假设 16 字节整数不会溢出,因此强制执行规则 [1]。
在这里,你应该有一个基本的密码系统,它还不错,但仍然可以改进:
- 使用带有MAC(消息验证码)方案的经过验证的加密。请注意,某些执行模式包括此,例如CCM
- 加强密钥计划:您选择的哈希函数可能会受到彩虹表攻击。为了使攻击者的事情变得复杂,请在此过程中引入随机盐。
- 更改“每个用户一个文件”的模式,因为它仍然会泄漏一些信息,例如“嘿,您将在此处找到的内容与同一用户有关”。
第一个很容易介绍(只需使用CCM而不是CBC,您就差不多完成了)。然而,最后一点更难解决。您必须做的事情可能类似于在文件系统中所做的事情。