我目前工作的公司的人力资源部门要求我提供一个系统,用于在我们公司的数据库中存储员工社会安全号码.这样做的原因是简化了工资单的完成,因为我们使用内部软件来处理员工时间表,但必须与我们实际工资单系统的第三方软件集成.这是一家规模相对较小的公司(20-30名员工),我们只会存储当前员工的SSN(因此违规只会产生有限的影响),但我仍然愿意依靠安全保障.
我想知道是否有任何约定存储与社会安全号码一样敏感的信息.我不是很擅长加密,我知道有几种加密技术我可以诉诸,但我想知道是否有一种特别适合这种情况的方法.AES是我最好的选择吗?
至于当前的软件,我们运行MySQL,我们的Web界面是用PHP编写的,并在IIS服务器上运行.
我见过的用于存储敏感数据的最佳方法是公钥加密,并将私钥存储在数据库以外的某个位置(例如,通过仅供HR和CEO负责的应用程序):
然后我们开始存储人们的信用卡......但是在网站上我们会立即用公钥加密它们....
在后端,我们有私钥,使用正确的密码,我们可以临时解密[私钥],然后使用[私钥]解密信用卡,并为卡充电.
我没有看到它在任何地方提到过,但这些信息是否必须在线?如果没有,那么您只需将此信息存储在未连接到互联网的计算机上的数据库中,就可以获得一个主要的攻击途径.或者,如果你可以将它存储在局域网的某个地方(因此人力资源可以访问它,或者其他任何东西),而不是生产服务器,那么这仍然是朝着正确方向迈出的一步.
你提到你是一家规模相对较小的公司,但考虑到离线存储这种敏感信息的好处,看起来对某些廉价硬件的投资似乎并不太难以说服决策者.除非在不久的将来大规模招聘狂欢,否则您不需要服务器级计算机来以任何方式存储约30名员工的个人信息.
无论你在哪里存储它,我仍然会考虑某种加密方式.AES 256是目前大多数应用程序中的安全标准,并得到广泛支持.它听起来不像是任何类型的负载下的应用程序,所以同样,从它的声音中获得更大的密钥大小和廉价硬件是没有害处的.
就实现而言,如果你对MySQL感到满意 - 坚持下去,他们就拥有了你想要的工具:http://dev.mysql.com/doc/refman/5.0/en/加密functions.html
最后,安全性完全取决于层次,没有一种解决方案可以成为银弹,但是你可以通过增加一些非常简单的常识性安全措施来做很多事情.
编辑:在阅读Graeme所说的内容后,我觉得我应该补充说,大多数安全漏洞都是内部工作 - 确保在磁盘级别,数据库和线路上保护您的数据.
我的推荐:将您的MySQL数据存储在加密磁盘上,以便在笔记本电脑错位等情况下,无法检索数据.
当然,如果数据库应用程序本身受到损害,则没有什么可以帮助,因为应用程序本身使用SSN.也许这是一个你可以纠正的设计缺陷.我倾向于考虑一个小的,有限的应用程序,它将SSN映射到(非SSN)密钥,然后使用该新密钥作为数据库中的"用户ID"而不是SSN.我会不惜一切代价避免SSN本身的扩散.
不要将SSN用作主键或以其他方式扩散其值.使用员工ID号或生成的其他唯一ID.这将减少问题的复杂性.
如果可能的话,将SSN保存在完全不同的数据库实例中,并且不允许外部应用程序的日常功能访问它.
隔离SSN后,您可以使用任何建议的方法来加密数据.加密物理表并加密存储字段将使某人窃取物理数据库文件或使用基本SQL访问查看SSN变得更加困难.
主要关注的是通过数据库机制限制对SSN表的访问,限制操作系统访问,并物理保护机器.通过DB,可以使用最受限制的权限.如果可能的话,不允许网络,在线或其他"共享"帐户访问该表.在OS访问时,限制登录和目录访问众所周知的用户列表.打开任何和所有审核.就物理安全性而言,机器应处于锁定/安全位置.
遵循NSA关于存储SSN的计算机安全性指南以及可以访问该计算机的任何计算机.
由于您只是一家小公司,因此如果发生违规行为,您无需过多担心邮寄物品和资金/保险以进行身份监控.拥有大量员工和/或客户的组织在满足违规通知的法律要求方面面临重大挑战.在短时间内找到2600万个信封并不容易.