所以我正在开发一个人力资源部门需要的基于网络的补充系统来存储和搜索前员工的记录。我反对这个要求,但最终它被传下来,系统必须同时启用完整 SSN 搜索和完整 SSN 检索。抛开我的抗议不谈,采取一些措施来保护这些数据实际上将比他们现在用它做的事情有很大的改进(你不想知道)。
我一直在做很多研究,我想我已经提出了一个合理的计划——但就像所有与加密/安全相关的事情一样,它非常复杂,而且很容易出错。我的粗略计划如下:
- 在应用程序第一次运行时,使用 RijndaelManaged 生成一个大的随机盐和一个 128 位 AES 密钥
- 将这两个都写到明文文件中以进行紧急恢复。此文件将离线存储在安全的物理位置。该应用程序将检查文件是否存在,如果它仍然存在,则会发出警告。
- 将盐和钥匙安全地存放在某处。这是我没有很好答案的部分。我正计划使用 DPAPI——但我不知道它到底有多安全。将其保留为纯文本并限制文件系统访问其存储的目录会更好吗?
- 将记录写入数据库时,将 SSN 与上面的大盐值散列以生成可搜索的字段(但在没有获得盐和暴力破解所有可能的 SSN 的情况下无法恢复),并且 AES 使用 a 加密原始 SSN 值new IV(存储在旁边)以生成可检索(使用密钥/iv)但不可搜索的字段(因为两次加密相同的 SSN 会产生不同的输出)。
- 搜索时,只需用相同的盐对搜索值进行哈希处理,然后在数据库中查找
- 检索时,使用 AES 密钥/iv 从数据库中解密值
除了需要一种以相对安全的方式存储密钥的方法(上面的第 3 点)之外,它似乎足够可靠。
对我们不起作用的事情:
- “不要这样做”不是一个选项。这需要完成,如果我们不这样做,他们会 a) 生我们的气,b) 只需通过电子邮件将所有数字传递到纯文本文档中。
这将仅在我们的网络内部,因此我们至少在此处实施的任何内容之上都有这一层保护。并且对应用程序本身的访问将由活动目录控制。
感谢您的阅读,以及任何建议。
更新 #1:我从评论中意识到,为 SSN 检索字段保留私有 IV 是没有意义的。我更新了计划,为每条记录正确生成一个新的 IV,并将其与加密值一起存储。
更新#2:我正在从我不能做的事情列表中删除硬件。我做了一些研究,似乎这些东西比我想象的更容易获得。使用其中一种 USB 安全令牌是否会为密钥存储增加有意义的安全性?