[英]how to encrypt data in database and reuse it to authenticate users
我正在使用Spring MVC开发应用程序,并且想将安全性添加到身份验证中。
在我的应用程序中,我已在数据库中login
了login
和password
,任何有权访问它的人都可以清楚地看到该login
和password
。
我想在数据库中加密数据,以便确保没有人可以使用或泄露它们。 我在网上搜索过,但是发现有一些算法可以加密数据,例如md5
,但是这个问题是不可逆的。
有人可以帮我吗?
为什么密码的加密不可逆?
用户创建帐户时,请先保存密码并对其进行哈希处理,然后再保存。 我更喜欢使用bcrypt 。
用户登录后,可以使用bcrypt的checkpw
将用户凭据与保存在数据库中的哈希凭据进行比较。 使它们不可逆(不可解密)可确保如果某人获得了对您数据库的访问权限,那么他们也不会获得您所有用户的密码
我以前没有在Java中使用BCrypt,但是我只是浏览了一下本教程 ,看来对您来说它可能是一个不错的起点
编辑:刚刚意识到他正在使用jBCrypt,但两者之间的差异应该很小
Edit2: 这是一篇很好的文章,介绍了破解数据库中的密码以及我建议使用bcrypt的原因以及为什么应使用单向加密的原因
我同意Danny H的观点,但也想解决您问题的另一半:保护登录名(通常是电子邮件地址)。 大多数人都忽略了对其进行保护的需要,但是对于想要保持其客户机密性的网站(不仅是Ashley Madison,还有医疗网站),那么您想要为其他数据添加一层保护。
首先,有关保护密码的参考: 安全盐密密码散列 。 使用bcrypt,scrypt,PBKDF2或argon2。
现在如何保护登录名呢? 实际上,您可以执行类似的操作来保护它,但是您将需要使用固定的盐(对于密码,盐不能固定!)。 假设下面的示例使用bcrypt。
考虑用户如何登录:用户输入其登录ID和密码。 系统将bcrypt应用于带有固定盐的登录ID,以在数据库中查找用户。 由此,系统获取用户的密码salt,然后系统对用户提供的密码加上salt来计算bcrypt,以查看其是否与数据库中的哈希密码匹配。 如果是这样,则授予用户访问权限。 因此,系统授予访问权限,而无需以明文形式在数据库中存储用户的登录ID。
用户忘记密码怎么办? 如果登录ID是电子邮件地址,则没问题:用户在“忘记密码”页面上输入登录名(电子邮件地址),系统在用户输入的电子邮件地址上应用带有固定盐的bcrypt,以查看该用户是否存在于数据库中,并假设是,则发送电子邮件用户的密码重置秘密链接。 在数据库中,我们必须将该秘密链接与该用户相关联,以确保该用户仅重置自己的密码(而不是其他人的密码!)。
如果数据库暴露了怎么办? 任何人都可以通过在该用户的电子邮件地址上计算bcrypt并在数据库中查找匹配项来确定特定用户是否在数据库中,但是没有人能够撤消整个电子邮件地址集合,这是对现状。
我在两个多月前的一个博客中讨论了这个想法,请参阅: https : //littlemaninmyhead.wordpress.com/2015/09/08/a-retrospective-on-ashely-madison-and-the-value-of -threat建模/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.