繁体   English   中英

如何对数据库中的数据进行加密并重新使用以验证用户身份

[英]how to encrypt data in database and reuse it to authenticate users

我正在使用Spring MVC开发应用程序,并且想将安全性添加到身份验证中。

在我的应用程序中,我已在数据库中loginloginpassword ,任何有权访问它的人都可以清楚地看到该loginpassword

我想在数据库中加密数据,以便确保没有人可以使用或泄露它们。 我在网上搜索过,但是发现有一些算法可以加密数据,例如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建模/

MD5是不可逆的哈希函数-它不是加密函数。 哈希每次都会为给定的输入提供相同的输出,这就是它们起作用的原因。 在您所描述的情况下,散列是可行的,因为可以看到哈希的用户不知道原始密码-也就是说,这听起来还是个坏主意。

理想情况下,您将对密码进行哈希处理,然后对哈希进行加密,其他用户将看不到这些值是否经过加密。 那是我的建议,但是如果您仅选择对密码进行加密,那么RSA加密就可以了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM