如何重现ASP.NET MVC4密码哈希,由内置的会员系统产生?
示例:
输入: loz123
输出: APeJ4h0M4h7OFz91WwmJUjFfI2Daiq5xaUaZzcevoyWfkPZ3SYFJ48F+YzNrBNvaJA==
数据库中的"Salt“字段为空。
我正在将数据从一个数据库传输到另一个数据库。在源数据库中,密码以纯文本形式存储。在目标数据库中,密码应存储为ASP.NET成员系统生成的哈希。我知道哈希是关于使用SHA1算法和base64编码的,但是我不能得到正确的输出。如果MS SQL Server中有内置函数,则会很方便,这样就可以执行如下查询:
SELECT Username, Hash(Password) FROM Users发布于 2013-10-03 20:29:34
这可能会帮助您获得正确的算法:
您必须检查您的特定设置。
来自MSDN的摘要:
SQL Server成员资格提供程序支持Clear、Encrypted和哈希密码格式。Clear密码以纯文本形式存储,这提高了密码存储和检索的性能,但安全性较低,因为如果您的SQL Server数据库遭到破坏,则很容易读取密码。加密的密码在存储时会进行加密,并且可以解密以进行密码比较或密码检索。这需要对密码存储和检索进行额外的处理,但更安全,因为如果SQL Server数据库遭到破坏,则无法轻松确定密码。存储在数据库中时,哈希密码使用单向哈希算法和随机生成的salt值进行哈希。验证密码时,会将其与数据库中的Salt值进行哈希运算以进行验证。无法检索哈希密码。
PasswordFormat值在ASP.NET应用程序的Web.config文件的providers部分中指定。
默认情况下,根据配置中machineKey元素中提供的信息对加密和散列密码进行加密或散列。请注意,如果为验证属性指定值3DES,或者未指定值,则将使用SHA1算法对哈希密码进行哈希处理。
可以使用membership元素(ASP.NET设置架构)配置元素的hashAlgorithmType属性定义自定义哈希算法。如果选择加密,则默认密码加密使用AES。您可以通过设置machineKey配置元素的解密属性来更改加密算法。如果要加密密码,则必须为machineKey元素中的decryptionKey属性提供显式值。在将加密密码与ASP.NET成员身份一起使用时,不支持decryptionKey属性的默认值AutoGenerate。
发布于 2016-01-12 02:50:20
我不得不用“清除”密码更新一个较旧的数据库,将其改为“哈希”,我想用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即使我的数据库最初设置为“清除”密码,Salt值也是使用每个记录创建的,但是,如果由于某些原因没有Salt值,您可以使用以下命令创建它们:
/*
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 = ''请注意,您需要首先生成Salts,然后生成散列。享受吧!
https://stackoverflow.com/questions/19157755
复制相似问题