在C#前端显示密码,在后端存储为二进制文件(在SQL Server中)

-1 c# sql-server asp.net passwords

我在后端有一个表,我将密码转换成后存储密码hash.HASHBYTES('SHA2_512', 'Welcome1').它存储在后端,如下所示:

0xDA07C08A2C2EF3710E688BFF476A8A09D52D6D34B6EE3C41A4B1F58F2949792EF20079565CA0D78E2758B33B50A13C9829C08BDF670DC802E627F289364D203A.
Run Code Online (Sandbox Code Playgroud)

现在,我希望在将其转换回"Welcome1"后,从前端的后端显示此密码.

我无法做到这一点并获得密码system.byte[].任何人都可以帮我把'Welcome1'作为前端的价值.

要求是为管理员创建一个页面,他可以看到所有用户,他们的详细信息包括密码.如果他点击一个用户(链接按钮),他的所有细节都应该出现在包括密码的文本框中.我知道它不是显示密码的好方法,但想知道我们拥有的所有选项.如果没有,我可以让业务知道这是不可能的.谢谢你的帮助.

ang*_*son 6

让我先总结一下我的答案然后再详细说明:

你不能!

更重要的是,你甚至不应该尝试!.


通过散列密码,您已经执行了从密码到其他东西的单向计算/转换,通常是一个字节序列,通常再次表示为十六进制字符串.

不应轻视"单向"部分.

首先,你可以反转哈希吗?不,你不能.但你可以猜出它的价值.

你怎么能猜到这个?

有几种方法可供选择:

  1. 暴力破解
  2. 利用弱点
  3. 彩虹表

暴力破解

强制执行基本上意味着您将尝试每个可能的密码,直到您的散列函数返回相同的散列.此时,您密码可能与数据库中的哈希值相匹配.根据不同的密码,您可能没有密码,但再次视情况而定,这可能没有多大的意义.

然而,强制好的哈希函数是不可行的,除非你打算让你的计算机在已知宇宙,过去和未来的生命中保持在线多次.

对于暴力破解SHA-512,将采取〜3.7×10 ^ 64年才能完成(未验证,从解除@emboss "优秀的答案在这里).

利用弱点

但是,如果您可以利用的算法存在缺陷,那么蛮力尝试可能会大幅缩短.不幸的是,SHA-512目前还没有这样的弱点.

不幸的是,如果你没有使用salt为你的哈希添加一些随机性,你实际上很难打破哈希的下一个可能的方法.

salt表示对于evey密码,您想要哈希生成随机值,然后将密码与此随机值组合,然后对此执行哈希函数并获取哈希值.然后,将随机值+哈希值存储在数据库中.

更多以下在彩虹表部分为什么这是一个好主意.

彩虹表

彩虹表意味着您可以为所有已知的密码和字符组合保留一个非常大的表,包含所有已知的哈希值,直到一定长度.然后,您可以只查找该表中的哈希并获取匹配的密码.就像蛮力一样,你会获得一个密码,并且根据碰撞的可能性,它可能不是密码,只是一个哈希值相同密码.

这些引导表非常大.对于SHA-512彩虹表长达9个字符,你说的接近(从1 TB的数据这个答案@LateralFractal).

对于更长的密码,这些表的大小很快就会失控.

现在,我在上面提到了盐.如果每个密码都有一个盐,并且每个盐是随机的(如果你为每个密码使用相同的盐,你的形状没有更好),那么你基本上需要每个盐的彩虹表,这意味着你必须生成这些自己表,对于你想要破解的每个密码.这也需要很长时间.对于大多数密码及其价值来说,不是宇宙寿命长,但不切实际.

结论如何:你不能,你根本不能.将哈希反转回其密码没有实际的解决方案.


你为什么不这样做?

用于散列密码(通常用的唯一原因为好)是避免实际存储开始与密码.

许多用户(大多数?)在很多站点上使用相同的密码,因此如果一个站点被破坏,并且数据转储可用,并且密码以可逆方式存储或使用可以使用的基本哈希进行反转彩虹表或暴力强迫,然后许多网站上的用户帐户突然变得妥协.

此外,这对您来说很重要,因为他们故意使用破碎的方式将密码(哈希)存储在他们的数据库中,所以违规网站的所有者不会满意地看着.你希望成为那个人.

所以这就是你应该这样做的原因.我的意思是,一旦你明白你不能将哈希值反转回他们的密码,你的回答就不应该转换为存储允许你反转它的密码的其他方式.