我目前正在开发一个网站,我希望为每个用户生成一个随机密码,然后对其进行编码以将其保存在数据库中。
但是,我也希望能够检索解码后的密码,或者通过电子邮件发送给用户,或者通过与网站本身无关的其他方式(通过电话,Skype或其他方式)将其提供给他
我正在使用Symfony和bcrypt算法进行编码,使用默认的UserPasswordEncoder。
有没有办法访问解码后的密码,还是应该在我的数据库中保留plainPassword(用于发送)和encodedPassword(用于身份验证)?如果我这样做,是否有任何安全风险,知道普通密码本身不可修改或访问?
提前致谢。
答案 0 :(得分:2)
保持清晰的密码总是一个坏主意。对你的帖子作出反应:
在数据库中保留一个明确的密码和编码的密码是没用的。首先使用散列密码是为了防止访问清除密码。安全方面,它与完全不编码密码完全一样。
您不想保留明确的密码。切勿保持清晰的密码。它总是存在安全风险,正如近年来无数次数据泄漏所证明的那样。
不要通过邮件发送密码。这是不好的做法,因为任何访问您的用户邮箱的人都可以同时访问您的服务。
出于支持目的,您需要一种为用户生成新密码的方法,而不是访问先前定义的密码。这样,您可以在保持良好安全性的同时帮助用户。在这种情况下,您将在生成密码时将密码发送给用户,在数据库中存储散列版本,并在用户登录时强制执行强制密码更改,以确保邮箱中的密码以后不能用于访问您的服务。或者,更好的是,您还可以给用户一个令牌,允许他自己重置密码。
如果真的想要保持密码清晰(再次不要这样做),您至少需要使用强加密对其进行编码(例如RSA),并为您自己保留私钥,使您(并且只有您)能够解密密码,同时在数据库中保留安全版本。
通常用于编码密码(例如PBKDF2)的加密哈希算法专门用于避免以明文形式检索密码。对你或其他任何人。
答案 1 :(得分:0)
可以恢复的密码不是密码。始终保持用户密码哈希并在需要时生成新密码。
答案 2 :(得分:0)
简而言之:如果您真的需要普通密码将密码存储在数据库中,那么当您使用bcrypy对密码进行加密时,您无法解密密码,但这真的很糟糕。
解释:像bcrypt这样的算法无法解码。在数据库中存储普通密码是邪恶的。如果有人攻击你的数据库,或者你会有一些利用例如sql注入,那么坏人可以获得你所有的用户密码。有一些大公司在过去的故事中存储密码,他们在被黑客攻击时获得了非常宝贵的教训。
答案 3 :(得分:0)
保持清晰的密码会使加密的密码失效,不要这样做。
发送清除密码是可能的,当您生成随机字符串以创建密码时,此时您就会发送密码。
但最好的办法是强制用户创建一个新密码