kis*_*ore 9 php md5 flawed-concept
我使用md5加密我的项目中的密码.
当用户点击忘记密码并提交他的电子邮件时,我必须将密码发送给他.
但密码是使用md5加密的.生成新密码不应该这样做.因为在这个项目中管理员可以看到用户的所有细节.所以我必须向管理员显示原始密码.所以初始密码非常重要.那我怎么能解密密码或任何其他方式给他发送原始密码?
提前致谢...
Amb*_*ber 39
哈希不是为了解密而设计的,这就是为什么它们通常被称为"单向哈希"而不仅仅是哈希.
相反,要么......
生成一个新密码,哈希,存储新密码哈希代替旧密码,并将新生成的密码通过电子邮件发送给用户.
生成新密码,哈希,将其存储在临时密码字段中,然后当用户使用该密码登录时,提示他们输入永久新密码.
生成一个nonce,将其存储在nonce的字段中,并通过电子邮件向用户发送一个包含该nonce的链接,这将使他们能够访问页面以输入新密码.
第三个选项可能是最好的,因为它不会在阅读用户电子邮件的人的普通视图中留下实际的密码(临时或非临时),并且因为它使用了一个nonce,一旦它被使用它就不能被恶意用户再次使用.
哈希用于密码的原因是专门用于防止它们以恶意用户只需查看数据库就可以确定密码的形式存储.
"所以我必须向管理员显示原始密码."
如果要对密码进行哈希处理,则无法进行此操作.一般来说,允许管理员查看用户密码实际上是一个坏主意,因为很大一部分用户倾向于使用相同的密码来处理多件事,而一件事(例如,公司网络)的管理员可能不是许多其他事情的管理员(比如用户的网上银行系统).
MD5不是加密算法,它是一种散列算法.两者不一样; 加密被设计为可逆的(因此补充术语"解密"),而散列被设计为仅单向的.
你不能.密码哈希[1]被称为"不可逆"的原因是它们不能被逆转.这就是将它们用于密码存储的全部意义 - 这意味着,如果一个坏人手上的密码数据库,他不能只是反转哈希来找出所有密码是什么.
我从您的编辑中看到,您的意图是向管理员用户显示用户的密码,而不是用户自己进行密码恢复.这是一个非常糟糕的主意.许多用户尝试通过使用多个系统使用相同的密码,这意味着在显示他们的密码,以减轻记忆密码的负担,你的系统有损害他们的帐户的高概率等系统.
真实的故事:早在2000年,我就在一家创建语音邮件系统的初创公司工作.为了在第一天向我介绍产品,IT主管让我创建了一个语音邮件帐户,我做了,然后他在管理界面中提出了它.当我看到屏幕上显示我的语音信箱PIN以便所有人看到时,我差点就死了.部分是因为这是一个令人震惊的糟糕的安全实践,但主要是因为,即使他不知道,他现在知道我的ATM卡的密码.这只是坏事,坏事,坏事.不要那样做.
[1] MD5是一种散列算法,而不是加密算法.两者之间的关键区别在于,对于任何给定的散列算法,存在无限数量的输入将产生相同的输出(这就是为什么它不可逆),而加密具有输入的一对一对应关系.输出.