如何重现ASP.NET MVC 4密码哈希,通过内置的会员制产生的?
例:
输入:loz123
输出:APeJ4h0M4h7OFz91WwmJUjFfI2Daiq5xaUaZzcevoyWfkPZ3SYFJ48F + YzNrBNvaJA ==
在数据库中的“盐”字段为空。
我从一个数据库传输数据到另一个。 在源数据库中的密码被存储为纯文本。 在目标数据库中,密码应该被存储为通过ASP.NET成员系统生成哈希值。 我知道散列是一些关于使用SHA1算法和base64编码,但我不能得到正确的输出。 这将是方便,如果有在MS SQL Server中的内置功能,使诸如以下内容的查询可以执行:
SELECT Username, Hash(Password) FROM Users
这可以帮助你得到正确的算法:
http://msdn.microsoft.com/en-us/library/system.web.security.sqlmembershipprovider.passwordformat.aspx
你必须检查你的具体设置。
从MSDN摘要:
SQL Server成员资格提供程序支持清除 , 加密和哈希密码格式。 清除密码采用明文存储,从而提高密码的存储和检索的性能,但安全性较低,因为如果你的SQL Server数据库被泄露密码很容易被读取。 存储并且可以被解密密码比较或密码检索时加密的密码进行加密。 这需要密码的存储和检索额外的处理,但更安全,因为密码不容易,如果SQL Server数据库被泄露确定。 散列口令使用的是单向散列算法和存储在数据库中时随机生成盐值散列。 当密码被验证,则散列与数据库中用于验证的盐值。 哈希密码无法找回。
该了passwordFormat值在ASP.NET应用程序Web.config文件的提供者部分中指定。
加密和散列密码被加密或基于在配置machineKey元素提供的信息通过默认散列。 请注意,如果你指定的验证属性的3DES值,或者如果没有指定值,哈希密码将使用SHA1算法被散列。
自定义的散列算法可以使用成员元素(ASP.NET设置架构)配置元素的属性hashAlgorithmType来限定。 如果选择加密,默认密码加密使用AES。 您可以通过设置的machineKey配置元素的属性解密更改的加密算法。 如果您要加密密码,必须提供在machineKey元素的decryptionKey属性的显式值。 使用与ASP.NET成员加密的口令时自动生成的对于decryptionKey属性的默认值不支持。
我不得不更新与“清楚的”密码“散列”旧的数据库,我想用SQL来做到这一点 - 这就是我想出使切换快速和容易。
注意:首先要备份!
Select * into dbo.aspnet_Membership_BACKUP from [dbo].[aspnet_Membership]
函数来计算哈希值:
/*
Create compatible hashes for the older style ASP.Net Membership
Credit for Base64 encode/decode: http://stackoverflow.com/questions/5082345/base64-encoding-in-sql-server-2005-t-sql
*/
Create Function dbo.AspNetHashCreate (@clearPass nvarchar(64), @encodedSalt nvarchar(64))
Returns nvarchar(128)
as
begin
declare @binSalt varbinary(128)
declare @binPass varbinary(128)
declare @result nvarchar(64)
Select @binPass = CONVERT(VARBINARY(128), @clearPass)
-- Passed salt is Base64 so decode to bin, then we'll combine/append it with password
Select @binSalt = CAST(N'' as XML).value('xs:base64Binary(sql:column("bin"))','VARBINARY(128)')
from (Select @encodedSalt as bin) as temp;
-- Hash the salt + pass, then convert to Base64 for the output
Select @result = CAST(N'' as XML).value('xs:base64Binary(xs:hexBinary(sql:column("bin")))', 'NVARCHAR(64)')
from (Select HASHBYTES('SHA1', @binSalt + @binPass) as bin) as temp2;
-- Debug, check sizes
--Select DATALENGTH(@binSalt), DATALENGTH(@binPass), DATALENGTH(@binSalt + @binPass)
return @result
end
这样称呼它:
Update [dbo].[aspnet_Membership] set PasswordFormat = 1, Password = dbo.AspNetHashCreate(password, PasswordSalt) where PasswordFormat = 0
即使我的数据库最初设置为“清除”的口令,盐值与每个记录创建的,但是,如果由于某种原因你没有盐值,你可以用这个创建它们:
/*
Create compatible salts for the older style ASP.Net Membership (just a 16 byte random number in Base64)
Note: Can't use newId() inside function so just call it like so: dbo.AspNetSaltCreate(newId())
Credit for Base64 encode: http://stackoverflow.com/questions/5082345/base64-encoding-in-sql-server-2005-t-sql
*/
Create Function dbo.AspNetSaltCreate (@RndId uniqueidentifier)
Returns nvarchar(24)
as
begin
return
(Select CAST(N'' as XML).value('xs:base64Binary(xs:hexBinary(sql:column("bin")))', 'NVARCHAR(64)')
from (select cast(@RndId as varbinary(16)) as bin) as temp)
end
然后使用它是这样的:
Update [dbo].[aspnet_Membership] set PasswordSalt = dbo.AspNetSaltCreate(newId()) where PasswordSalt = ''
请注意,您需要首先生成盐,然后散列。 请享用!