Encryption ASP.NET MembershipProvider在加密时使用密码salt

Encryption ASP.NET MembershipProvider在加密时使用密码salt,encryption,hash,Encryption,Hash,我有一个关于ASP.NET成员身份(来自.NET 2.0)的问题,更具体地说是关于它加密密码的方式(当您选择加密密码而不是散列密码时),以及它验证密码的方式 我的印象是,只有当你选择散列密码而不是加密密码时,密码盐才有意义。而且,根据 PasswordSalt nvarchar(128)随机生成128位值,用于对密码哈希进行加密;以base-64编码形式存储 但是,我尝试将salt更改为一个存储为加密的密码,该密码的验证停止工作(加密的密码没有更改,只是密码salt) 那么,在使用这些成员资格提

我有一个关于ASP.NET成员身份(来自.NET 2.0)的问题,更具体地说是关于它加密密码的方式(当您选择加密密码而不是散列密码时),以及它验证密码的方式

我的印象是,只有当你选择散列密码而不是加密密码时,密码盐才有意义。而且,根据

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

但是,我尝试将salt更改为一个存储为加密的密码,该密码的验证停止工作(加密的密码没有更改,只是密码salt)

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

谢谢,祝你一切顺利

编辑: 我尝试输入了一个无效的base64 salt,得到了这个stacktrace,在我看来这已经有点奇怪了,用于加密检查。它看起来更像是散列检查。奇怪的是,这些都没有记录在MSDN上


[格式异常:Base-64字符数组或字符串的长度无效。]
System.Convert.FromBase64_解码(字符*startInputPtr,Int32 inputLength,字节*startDestPtr,Int32 destLength)+14390811
System.Convert.FromBase64CharPtr(Char*inputPtr,Int32 inputLength)+162
System.Convert.FromBase64String(字符串s)+56
System.Web.Security.SqlMembershipProvider.EncodePassword(字符串密码,Int32密码格式,字符串salt)+148
System.Web.Security.SqlMembershipProvider.CheckPassword(字符串用户名、字符串密码、布尔值updateLastLoginActivityDate、布尔值failIfNotApproved、字符串和salt、Int32和passwordFormat)+245
System.Web.Security.SqlMembershipProvider.ValidateUser(字符串用户名、字符串密码)+195

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

如果选择了加密,显然它确实使用了salt


私有字符串编码密码(字符串密码、int密码格式、字符串salt)
{
byte[]bIn=Encoding.Unicode.GetBytes(pass); 字节[]bSalt=Convert.FromBase64String(salt); 字节[]bRet=null; ... 字节[]bAll=新字节[bSalt.Length+bIn.Length]; 缓冲区块拷贝(bSalt,0,bAll,0,bSalt.Length); 缓冲区区块复制(仓位,0,球,bSalt.Length,仓位长度); bRet=加密密码(bAll,_LegacyPasswordCompatibilityMode); }