首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重现ASP.NET MVC 4密码哈希

问如何重现ASP.NET MVC 4密码哈希
EN

Stack Overflow用户
提问于 2013-10-03 19:14:57
回答 2查看 5.5K关注 0票数 2

如何重现ASP.NET MVC4密码哈希,由内置的会员系统产生?

示例:

输入: loz123

输出: APeJ4h0M4h7OFz91WwmJUjFfI2Daiq5xaUaZzcevoyWfkPZ3SYFJ48F+YzNrBNvaJA==

数据库中的"Salt“字段为空。

我正在将数据从一个数据库传输到另一个数据库。在源数据库中,密码以纯文本形式存储。在目标数据库中,密码应存储为ASP.NET成员系统生成的哈希。我知道哈希是关于使用SHA1算法和base64编码的,但是我不能得到正确的输出。如果MS SQL Server中有内置函数,则会很方便,这样就可以执行如下查询:

代码语言:javascript
复制
SELECT Username, Hash(Password) FROM Users
EN

回答 2

Stack Overflow用户

发布于 2013-10-03 20:29:34

这可能会帮助您获得正确的算法:

http://msdn.microsoft.com/en-us/library/system.web.security.sqlmembershipprovider.passwordformat.aspx

您必须检查您的特定设置。

来自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。

票数 1
EN

Stack Overflow用户

发布于 2016-01-12 02:50:20

我不得不用“清除”密码更新一个较旧的数据库,将其改为“哈希”,我想用sql来做这件事--这就是我想出的让这个转换变得又快又简单的方法。

注意:请先备份!!

代码语言:javascript
复制
Select * into dbo.aspnet_Membership_BACKUP from [dbo].[aspnet_Membership]

函数来计算散列:

代码语言:javascript
复制
/*
    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

这样叫它:

代码语言:javascript
复制
Update [dbo].[aspnet_Membership] set PasswordFormat = 1, Password = dbo.AspNetHashCreate(password, PasswordSalt) where PasswordFormat = 0

即使我的数据库最初设置为“清除”密码,Salt值也是使用每个记录创建的,但是,如果由于某些原因没有Salt值,您可以使用以下命令创建它们:

代码语言:javascript
复制
/*
    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

然后像这样使用它:

代码语言:javascript
复制
Update [dbo].[aspnet_Membership] set PasswordSalt = dbo.AspNetSaltCreate(newId()) where PasswordSalt = ''

请注意,您需要首先生成Salts,然后生成散列。享受吧!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19157755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档