密码加密并存储在数据库中

Posted

技术标签:

【中文标题】密码加密并存储在数据库中【英文标题】:Password Encryption and store in database 【发布时间】:2020-03-20 09:44:12 【问题描述】:

我创建了一个具有基本要求的简单登录页面。我已将注册用户详细信息存储在数据库中。到目前为止,我已经以纯文本形式存储了他们的密码。但我想加密密码,然后将其存储在数据库中。我正在使用 java 和 jsp 来查看视图。此外,我正在尝试创建一个单击忘记密码的链接。一旦用户输入他们的邮件ID并单击按钮,用户应该检查他们的邮件中的重置密码链接,其中该链接在指定时间可以访问,稍后该链接将过期。请帮我解决这个问题。

【问题讨论】:

***.com/questions/10303767/… 参考此链接。 Encrypt and Decrypt in Java的可能重复 我正在尝试创建一个点击忘记密码的链接。一旦用户输入他们的邮件ID并单击按钮,用户应该检查他们的邮件中的重置密码链接,其中该链接在指定时间可以访问,稍后该链接将过期。请帮帮我。??? 密码应该经过哈希处理(使用 pbkdf2、bcrypt 等),而不是加密。 对于存储密码,请阅读this post,对于密码重置,尝试打开一个新问题并详细说明您到底在挣扎什么(不清楚) 【参考方案1】:

首先,加密和散列是有区别的。您应该使用散列而不是加密,因为散列是一种更安全的方式函数,另一方面加密过程不太安全并且可以解密。

其次,有很多散列算法,如SHA256,md5 (you shouldn't use it now because it is less secure)。使用一些SALT 技术甚至可以生成更安全的哈希。

第三,你应该亲自去寻找重置密码的机制,偷偷摸摸对你没有好处。提问前先研究好。但是您可以从这里Implementing forgot password functionality in Java

了解如何实现忘记密码的事情

【讨论】:

我已经浏览了您提到的链接。问题是我不知道如何在创建表时创建token, expirationdate,以及在向用户发送邮件时如何访问令牌。 您可以从以下链接了解如何创建和验证JWTs (Jason Web Tokens)。仔细检查一下。 developer.okta.com/blog/2018/10/31/jwts-with-java 包含tokenexpirationdate 的所有概念 好的,谢谢您的回复。我会通过你提到的链接。 我会在这里写下整个想法,但我希望你做一些研究并付出一些努力。那东西会帮助你如何思考。 [***.com/questions/47537908/… 我尝试使用链接但是当我尝试使用密码登录时,我得到了无效的用户凭据,因为在 db 中输入的密码看起来像 SHA2(CONCAT('gayuranimini', 78622100) , 256)。我尝试在 db 中单独输入 78622100,当尝试使用 gayuranimini 登录时,我收到 Invalid user credentials 错误。当我尝试使用 78622100 输入时,登录成功。请告诉我哪里错了。【参考方案2】:

为了存储密码,加密它们并存储加密版本是不明智的,因为您永远不需要反转加密。

保护密码存储基本上有 3 个部分

散列

哈希是首选,因为按照设计,它是不可逆的。存在大量强大的散列算法,寻求开发自己的散列算法是不明智的。 SHA-2 和 SHA-3 就是很好的例子。

腌制

练习使用非私有盐也很好,它本质上是一个存储在数据库中并附加到每次提交的密码的字符串,以创建散列并检查正确性。这是为了防止预计算彩虹表的攻击,因为盐是适当随机的。

胡椒粉

最后在你提供散列函数的代码中提供一个唯一的私钥使得计算彩虹表变得更加不可能

【讨论】:

以上是关于密码加密并存储在数据库中的主要内容,如果未能解决你的问题,请参考以下文章

.NET 中的密码加密/解密代码

你为啥要在数据库中存储纯文本或加密(非散列)密码?

加密(base64)密码未存储在数据库 hsql 中

如何通过DataSourceBuilder将jasypt加密密码传递给数据库

Shiro学习——密码的加密解密

Shiro学习——密码的加密解密