Java 如何检索哈希密码的原始明文密码

Java 如何检索哈希密码的原始明文密码,java,database,Java,Database,我看过很多文章,它们都讨论/建议如何将明文密码转换为哈希密码并存储在数据库中 我的问题是,如果明文密码被散列并存储在数据库中,那么如果用户忘记了密码,我如何检索原始明文密码 我们的应用程序不像银行那样需要非常高的安全性。在某种程度上,我的应用程序还要求我们登录并检查用户帐户。如果我们开始对密码进行散列存储,有没有办法做到这一点 这取决于您用来散列密码的内容。但通常情况下,这是不可能的。 如果用户忘记了密码,那么您可以给他一个页面链接,他可以在其中更改密码,或者给他一个生成的临时密码。您不需要。执

我看过很多文章,它们都讨论/建议如何将明文密码转换为哈希密码并存储在数据库中

我的问题是,如果明文密码被散列并存储在数据库中,那么如果用户忘记了密码,我如何检索原始明文密码


我们的应用程序不像银行那样需要非常高的安全性。在某种程度上,我的应用程序还要求我们登录并检查用户帐户。如果我们开始对密码进行散列存储,有没有办法做到这一点

这取决于您用来散列密码的内容。但通常情况下,这是不可能的。
如果用户忘记了密码,那么您可以给他一个页面链接,他可以在其中更改密码,或者给他一个生成的临时密码。

您不需要。执行此过程的唯一方法是使用用户可以记住的其他内容重置用户的密码


当通过算法对密码进行哈希运算时,算法的结果将存储到数据库中。要在下次登录时检查用户的密码是否正确,请再次运行相同的算法,并将输出与数据库中存储的内容进行比较——即,如果哈希匹配,则用户的密码必须正确。

您没有。它不起作用。哈希映射是单向映射。您应该阅读一些关于hashmap的内容,它们的作用以及它们为什么有用


您无法从哈希值中获取密码。

您不能。就我个人而言,如果可能的话,我会尽量避免使用能够恢复我密码的网站,因为这意味着访问他们散列密码文件的黑客可以访问我的帐户

您为用户提供了设置新密码的工具,通常是基于发送到以前建立的地址的电子邮件或安全问题和答案

我的问题是,如果明文密码被散列并存储在 数据库,那么如果 用户忘记密码了吗

您散列了密码,无法执行此操作。散列会丢失信息,最好是计算散列的冲突

要比较存储的密码,请创建给定密码的哈希,并将哈希与数据库中存储的哈希进行比较


如果用户忘记了密码,为用户创建一个新密码:创建一个随机密码,将哈希存储在数据库中,然后将普通密码发送给用户。

我不是用Java开发的,但通常,当我们使用哈希函数加密密码时,只有一个方向。所以,要理解hash的意思并不容易


在这种情况下,解决方案是允许用户使用其他字段(例如电子邮件)重置密码。

如果不这样做,则要求用户更改密码。哈希与加密不同。关于此主题或类似主题的文章数量相当多,当我不在手机上时,我会看看是否可以发布一个相关的。但简短的回答是:不要这样做!基本上,密码是以这种方式加密的,以防止像您描述的那样进行反向工程。想象一下,如果有人破坏了你的系统,能够将密码解密为纯文本…注意:我写的是加密的,但我应该写哈希,因为前者意味着双向转换。这正是哈希的要点。这是一个单向函数。我同意,这就是为什么我说它取决于!如果您有一个包含所有哈希组合的知识数据库,则可以进行反向查找。你可以在互联网上找到这种数据库,所以使用这种haching方法不是一件好事。所以,从技术上讲,这是可能的,而你的-1是不相关的。我明白你的意思,但依情况而定,IMHO不是一个好答案,特别是在这种情况下,我认为op不想下载和存储数十亿的散列密码、彩虹表和类似的东西。当然,但他可以使用一个web服务来做到这一点。无论如何,正如我所说,这不是解决办法。他必须用另一种方式。这确实取决于你用什么来散列你的密码。例如,如果您使用如下函数:hashString plain{return plain;},那么实际上根本不哈希密码。我个人在一个系统上工作,我们需要普通形式的密码,所以我们以BASE64加密形式存储密码,而不是散列,所以我们能够提取普通形式。你指的是彩虹表,从技术上说,你是对的,你可以尝试使用这样的东西,但它只适用于任何输入组合:输入了密钥对。但问题是开头的句子,这正是恩里曼所指的;它不取决于哈希函数的类型,哈希函数定义为单向函数。这最终是一种误导。抱歉耽搁了,在我的电话上,它不是加密的,是散列
爱德,小心点,这是两件不同的事:。对不起,你说得对。在葡萄牙语中,我们通常不关心这些术语,但你是对的