ASP.NET MembershipProvider在加密时使用passwordSalt

时间:2014-11-11 22:56:11

标签: encryption hash

我有一个关于ASP.NET成员资格的问题(来自.NET 2.0),更具体地说是它加密密码的方式(当你选择加密它们,而不是哈希时),以及它验证它们的方式。

我的印象是,如果您选择哈希密码而不加密密码,密码盐才有意义。而且,根据MSDN documentation on those old-school membership providers

  

PasswordSalt nvarchar(128)随机生成的128位值用于加密密码哈希值;以base-64编码形式存储

但是,我已经尝试更改salt以获取存储为加密的密码,并且该密码的验证停止工作(加密密码未更改,只是密码缓冲区)。

那么,在使用这些成员资格提供程序加密/验证密码时是否涉及passwordSalt(因为验证已停止工作,我会说是,但我不知道为什么)?

谢谢,一切顺利。

编辑: 我已经尝试输入一个无效的base64 salt,并得到了这个堆栈跟踪,我认为这对于加密检查已经有点奇怪了。它看起来更像是一个哈希检查。奇怪的是MSDN上没有记录这一点。

[FormatException: Invalid length for a Base-64 char array or string.] System.Convert.FromBase64_Decode(Char* startInputPtr, Int32 inputLength, Byte* startDestPtr, Int32 destLength) +14390811 System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength) +162 System.Convert.FromBase64String(String s) +56 System.Web.Security.SqlMembershipProvider.EncodePassword(String pass, Int32 passwordFormat, String salt) +148 System.Web.Security.SqlMembershipProvider.CheckPassword(String username, String password, Boolean updateLastLoginActivityDate, Boolean failIfNotApproved, String& salt, Int32& passwordFormat) +245 System.Web.Security.SqlMembershipProvider.ValidateUser(String username, String password) +195

1 个答案:

答案 0 :(得分:-1)

我设法进入System.Web.dll并找到原因。 显然,MSDN文档不符合实现。

如果选择加密,显然它确实使用盐。

private string EncodePassword(string pass, int passwordFormat, string salt) {
byte[] bIn = Encoding.Unicode.GetBytes(pass); byte[] bSalt = Convert.FromBase64String(salt); byte[] bRet = null; ... byte[] bAll = new byte[bSalt.Length + bIn.Length]; Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length); Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length); bRet = EncryptPassword(bAll, _LegacyPasswordCompatibilityMode); }