如何加密数据库中的数据并重用它来验证用户身份

时间:2015-12-02 18:16:15

标签: spring security spring-mvc encryption

我正在使用Spring MVC开发应用程序,我想在我的身份验证中添加安全方面。

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

我想在数据库中加密数据,以便我确信没有人可以使用或泄露它们。 我在网上搜索过,但我发现有些算法可以对md5等数据进行加密,但这个问题是不可逆转的。

有些身体可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

为什么密码加密是不可逆转的问题?

当用户创建帐户时,请在保存之前加密并哈希密码。我更喜欢使用bcrypt

当用户登录时,您可以使用bcrypt的checkpw将用户凭据与保存在数据库中的散列值进行比较。让它们不可逆转(不可加密)确保如果有人获得对您的数据库的访问权限,那么它们也不会获得您的所有用户密码

我之前没有使用过BC的BC,但我只是看了this tutorial,看起来它可能是一个很好的起点

编辑:刚刚意识到他正在使用jBCrypt,但两者的差异应该非常小

Edit2: Here是关于破解数据库中密码的一篇非常好的文章,我推荐使用bcrypt的原因以及为什么要使用单向加密

答案 1 :(得分:2)

我同意Danny H的意见,但也想解决你问题的另一半:保护登录(通常是电子邮件地址)。大多数人忽略了保护它的必要性,但对于想要保持其客户保密的网站(不仅仅是Ashley Madison而且还有医疗网站),那么您需要为其他数据添加一层保护。 / p>

首先,有关保护密码的参考:Secure Salted Password Hashing。使用bcrypt,scrypt,PBKDF2或argon2。

那么保护登录呢?你实际上可以做类似的事情来保护它,但你需要一个固定的盐(对于密码,盐不能修复!)。我们假设bcrypt用于下面的例子。

考虑用户如何登录:用户输入他的登录ID和密码。系统将bcrypt应用于使用固定salt的登录ID以在数据库中查找用户。由此,系统获取用户的密码盐,并且系统使用salt计算用户提供的密码上的bcrypt,以查看它是否与数据库中的哈希密码匹配。如果是,则授予用户访问权限。因此,系统授予访问权限,而不以明文形式在数据库中存储用户的登录ID。

用户忘记密码怎么办?如果登录ID是电子邮件地址没问题:用户在忘记密码页面上输入登录(电子邮件地址),系统在用户输入的电子邮件地址上应用带有固定盐的bcrypt以查看用户是否存在于数据库中,并假设是,然后发送电子邮件用户密码重置的秘密链接。在数据库中,我们必须将该秘密链接与该用户相关联,以确保他只重置自己的密码(而不是其他人的密码!)。

如果公开数据库怎么办?任何人都可以通过计算该用户的电子邮件地址上的bcrypt并在数据库中查找匹配来确定特定用户是否在数据库中,但是没有人能够反转整个电子邮件地址集合,这是一个很大的改进。目前的情况。

我在2个多月前的博客中讨论了这个想法,请参阅:https://littlemaninmyhead.wordpress.com/2015/09/08/a-retrospective-on-ashely-madison-and-the-value-of-threat-modeling/

答案 2 :(得分:0)

MD5是hash函数,它不可逆 - 它不是加密函数。哈希每次都为给定的输入提供相同的输出,这就是它们工作的原因。 Hashing可以在你描述的场景中工作,因为可以看到哈希的用户不会知道原始密码 - 这就是说,这听起来仍然是一个坏主意。

理想情况下,您会对密码进行哈希处理,然后对哈希进行加密,而其他用户将无法查看这些值是否加密。这将是我的建议,但如果你只选择加密密码RSA encryption就行了。