2015-12-02 53 views
0

我正在用Spring MVC开发一个应用程序,我想将安全性方面添加到我的身份验证中。如何加密数据库中的数据并重用它来验证用户

在我的应用我有loginpassword是在数据库中,谁可以访问它可以看到loginpassword清楚任何一个registred。

我想在数据库中加密数据,以便我确信没有人可以使用或泄露它们。 我在网上搜索,但我发现有一些算法可能加密数据,如md5,但问题是不可逆的。

有些身体可以帮助我吗?

回答

2

我同意丹尼H,但也想解决你的问题的另一半:保护登录(通常是一个电子邮件地址)。大多数人忽略了保护它的需要,但是对于希望保持其客户保密性的网站(不仅仅是阿什利麦迪逊,还有医疗网站),那么你想为其他数据添加一层保护。

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

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

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

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

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

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

+0

是的,绝对同意和一些伟大的点! –

2

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

当用户创建一个帐户,盐和散列他们的密码保存之前。我更喜欢使用bcrypt

当用户登录时,可以使用bcrypt的checkpw将用户凭证与保存在数据库中的散列值进行比较。让他们不可逆转(不可解密)确保如果有人获得访问你的分贝,他们并没有得到你所有的用户密码以及

我以前没有用过java的BCrypt,但我只是瞥了一眼this tutorial,它似乎喜欢它可能是一个很好的起点,你

编辑:刚刚意识到他用jBCrypt,但在这两个的区别应该是非常小的

EDIT2:Here是破解一个相当不错的文章在数据库中找到的密码和I的原因建议bcrypt以及为什么你应该使用单向加密功能

+0

哈希是不加密的。 –

+0

是的,你是正确的,可能应该有不同的措辞,并会相应地编辑我的答案。在他所问的用例中,只是散列密码并保存它们应该没问题。在阅读你的答案后,我很好奇为什么你认为有必要加密已经哈希的密码 –

+0

我也想补充一下,我敢肯定有时候可能需要加密哈希密码。我只是觉得它可能是一个额外的复杂程度,90%的时间没有实质性的好处。我并不是真的与你争论,只是诚实好奇,想要像我一样精通 –

0

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

理想情况下,你会散列密码,然后加密哈希和其他用户将无法看到这些值加密或不。这将是我的建议,但如果您选择只加密密码RSA encryption将工作得很好。