4

我正在使用默认的 SQL 提供程序、默认的 web.config 设置来实现 ASP.NET 成员资格。

我注意到密码是散列的。但我不知道 asp.net 如何对我的密码进行哈希处理,所以我不确定黑客是否有可能解密这个?

如果 asp.net 使用相同的规则来散列密码,这是每个人都知道的。比黑客可以轻松破解它。

例如。如果 asp.net 使用 MD5(123456),结果是“E10ADC3949BA59ABBE56E057F20F883E”,那么黑客可能有一个 MD5 字典来查找它。

我的设置是:

<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
             applicationName="/" />

-- SQL 语句:

SELECT am.UserId, am.[Password], am.PasswordSalt FROM aspnet_Membership am

-- 结果是:

F10A635D-22DA-419C-84E6-767D2A35A010,tpeiwPt5+kFbcocQZOuc4aoHeuI=,PVq9dPtbFxze9Erbfd7HrA==

密码是123456,变成“tpeiwPt5+kFbcocQZOuc4aoHeuI=”。

这个值在不同的机器或不同的应用程序上总是相同的吗?

如果这个值与盐“PVq9dPtbFxze9Erbfd7HrA==”有关,那么黑客是否有可能使用这个盐来解密我的密码?

4

1 回答 1

7

为了能够回答这个问题,你必须了解两件事:哈希的作用和盐的作用。

哈希的要点是在单向过程中将任意字符串提炼成已知长度的字符串。也就是说,一个好的散列算法会以这样的方式做到这一点,即很难找到任何散列到相同值的字符串。

然而,问题是哈希算法在给定相同的输入时总是返回相同的结果。加盐的目的是在密码数据库被盗的情况下缓解这个问题。每次我散列密码时,我都会生成一个完全随机的盐,它不需要是秘密的,并在散列之前将它添加到我的密码中。这样,我确保每次对给定密码进行哈希处理时,都会获得不同的结果。随机盐不需要保密,实际上必须与散列密码一起以“明文”形式存储的原因是,出于身份验证的目的,需要用于生成原始散列的相同盐来验证给定密码与哈希匹配。

因为每次用户想要更改密码时都会随机生成一个好的盐,所以即使重新存储相同的密码也几乎肯定会创建一个完全不同的哈希,只要存储密码的应用程序正确使用盐。

如果哈希算法结构良好,那么对存储随机盐的密码的唯一可能攻击就是暴力搜索。像 MD5 这样的一些哈希算法被认为是“损坏的”,因为它可以在比蛮力时间更快的时间内找到所谓的“哈希冲突”。您将需要了解您的平台使用哪种算法来生成密码哈希,并仔细阅读以了解是否可以找到该算法的哈希冲突。

于 2012-07-27T05:43:45.617 回答