前段时间我加入了新项目。它正在开发很长一段时间。 让我感到惊讶的是,所有用户的密码都以非加密形式存储。
我向管理层解释了这方面的巨大安全漏洞 - 看起来他们同意这一点,并希望使项目更安全。团队成员也同意。
我们系统中有大约20,000名用户。
实际上,使这项工作非常紧张 - 将非加密密码迁移到加密形式。如果出现问题,可能会导致项目灾难。
如何降低这种压力? 备份? 单元测试(整合测试)?
答案 0 :(得分:5)
好吧,请小心备份,因为它将包含未加密的用户密码: - )
假设密码存储在数据库中,一个简单的解决方案就是这样:
1)对整个表格数据进行安全备份
2)创建新列(PasswordEncrypted或类似名称)
3)使用UPDATE查询使用未加密密码的MD5更新每一行的新列,同时使用32字节或更大的盐。几乎每个数据库系统都具有MD5功能,因此您甚至不必离开SQL提示
4)保留明文列,并相应地更新您的应用程序/脚本以使用加密密码。
5)重命名明文旧密码列,暂时将其取消播放并测试您的应用程序 - 如果有任何问题,请返回步骤4并修复您的错误。
6)当一切正常时,请删除明文密码栏
7)鼓励用户选择一个新密码,因为您已经具备一定程度的安全性,以减轻之前可能成功的任何攻击的影响。
答案 1 :(得分:2)
这是什么类型的项目?一个Web应用程序,桌面应用程序?
如果你正在走下重构之路,那么密码是否需要以可加密的方式存储?一般情况下,最好使用SHA之类的方法对密码进行哈希处理,然后使用相同的算法对输入进行哈希处理并比较结果。您只存储散列值,而不是实际密码。这使您能够检查是否有人输入了正确的密码,而不会让用户面临加密被破坏和密码暴露的可能性。
有关您的方法的具体信息不是我可以提供的(因为我不知道它是如何工作的),但您最好的办法是创建一个额外的列来存储散列密码,散列现有密码,然后保持它们是最新的密码更改。将此新列用于所有新开发,然后在移动完成并经过测试后,使用明文密码删除该列。
答案 2 :(得分:1)
编写大量测试,测试大量的角落案例(大写和小写,数字,符号,Unicode字符,长密码等)。在开发和测试时,创建一个系统以回到旧系统(当然,通过提供旧密码列表,因为一旦密码被哈希,您将无法直接将它们转换回来)。保存当前密码列表的副本。在测试文件或测试数据库中转换密码,然后使用保存的密码复制来测试一切是否正常。现在将系统投入生产,并确保它适用于您的用户。如果没有,您已经测试了迁移回旧系统的计划。一旦它被证明可以工作几周,你可以删除明文密码列表,然后就可以了。
答案 3 :(得分:1)
我只是哈希当前密码,将它们存储在新的数据库字段中,并在删除密码字段时开始使用该字段。然后,我会通知我的用户,现在是更改密码的好时机,因为您已经实施了更多安全机制来保证数据的安全。
要进行备份,只需执行SELECT * INTO Backup FROM UserData
答案 4 :(得分:1)
通过为每次登录尝试运行两种身份验证方法(加密和未加密),您可以获得额外的信心,如果它们产生不同的结果,则会收到发送给您的警报电子邮件。您的用户无法看到此更改,因此可以运行数周甚至数月。一旦您看到旧的和新的身份验证适用于足够高的用户百分比,请停用旧身份验证。
答案 5 :(得分:0)
如果可能,您可以尝试这样做:向所有用户发送电子邮件,以便在超时期限内更新其密码,之后如果他们不更改密码则无法使用。散列这些新密码并存储散列。这需要对前端进行一些更改(即它发回的数据)。