Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何对数据库中的数据进行加密并重新使用数据对用户进行身份验证_Spring_Security_Spring Mvc_Encryption - Fatal编程技术网

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

Spring 如何对数据库中的数据进行加密并重新使用数据对用户进行身份验证,spring,security,spring-mvc,encryption,Spring,Security,Spring Mvc,Encryption,我正在用SpringMVC开发一个应用程序,我想在身份验证中添加安全方面 在我的应用程序中,我在数据库中注册了登录名和密码,任何有权访问它的人都可以清楚地看到登录名和密码 我想在数据库中加密数据,这样我就可以确保没有人可以使用或泄露它们。 我在网上搜索过,但我发现有一些算法可以加密数据,比如md5,但问题是它是不可逆的 有人能帮我吗 为什么密码加密是不可逆的 当用户创建帐户时,在保存之前对其密码进行加密和散列。我更喜欢使用 当用户登录时,您可以使用bcrypt的checkpw将用户凭据与数据库中

我正在用SpringMVC开发一个应用程序,我想在身份验证中添加安全方面

在我的应用程序中,我在数据库中注册了
登录名
密码
,任何有权访问它的人都可以清楚地看到
登录名
密码

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


有人能帮我吗

为什么密码加密是不可逆的

当用户创建帐户时,在保存之前对其密码进行加密和散列。我更喜欢使用

当用户登录时,您可以使用bcrypt的
checkpw
将用户凭据与数据库中保存的哈希凭据进行比较。让它们不可逆(不可加密)可以确保,如果有人访问了您的数据库,他们也不会获得您所有用户的密码

我以前没有在java中使用BCrypt,但我只是浏览了一下,它似乎对您来说可能是一个很好的起点

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


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

为什么密码加密是不可逆的

当用户创建帐户时,在保存之前对其密码进行加密和散列。我更喜欢使用

当用户登录时,您可以使用bcrypt的
checkpw
将用户凭据与数据库中保存的哈希凭据进行比较。让它们不可逆(不可加密)可以确保,如果有人访问了您的数据库,他们也不会获得您所有用户的密码

我以前没有在java中使用BCrypt,但我只是浏览了一下,它似乎对您来说可能是一个很好的起点

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

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

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

理想情况下,您将散列密码,然后加密散列,其他用户将无法看到这些值是否加密。这是我的建议,但是如果您选择只加密密码,那么它就可以正常工作。

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


理想情况下,您将散列密码,然后加密散列,其他用户将无法看到这些值是否加密。这是我的建议,但是如果你选择只加密密码,那就可以了。

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

首先,关于保护密码的参考:。使用bcrypt、scrypt、PBKDF2或argon2

现在如何保护登录?实际上,您可以做类似的事情来保护它,但是您需要一个固定的salt(对于密码,salt不能是固定的!)。让我们假设bcrypt用于下面的示例

考虑用户将如何登录:用户输入其登录id和密码。系统将bcrypt应用于带有固定salt的登录id,以便在数据库中查找用户。从中,系统获取用户的salt密码,并在用户提供的salt密码上计算bcrypt,以查看它是否匹配数据库中的散列密码。如果是,则授予用户访问权限。因此,系统授予了访问权限,而无需将用户的登录id以明文形式存储在数据库中

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

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


两个多月前,我在一个博客中讨论了这个想法,请参见:

我同意Danny H的观点,但我也想解决你问题的另一半:保护登录(通常是电子邮件地址)。大多数人忽视了保护它的必要性,但对于那些希望为客户保密的网站(不仅是Ashley Madison,还有医疗服务)