创建.NET Membership Provider用户的SQL语句

5
我有一个SQL脚本,在我的数据库中创建用户。它使用了.NET成员资格存储过程。目前,它运行良好。唯一的问题是密码以明文保存。我应该做什么来使它们被加盐/加密(不确定要使用哪个术语)?
GO

DECLARE @return_value int,
  @UserId uniqueidentifier


EXEC @return_value = [dbo].[aspnet_Membership_CreateUser]
  @ApplicationName = N'Theater',
  @UserName = N'sam.sosa',
  @Password = N'mypassword',
  @PasswordSalt = N'eyhKDP858wdrYHbBmFoQ6DXzFE1FB+RDP4ULrpoZXt6f',
  @Email = N'sam@Simple.com',
  @PasswordQuestion = N'Whats your favorite color',
  @PasswordAnswer = N'Fusia',
  @IsApproved = 1,
  @CurrentTimeUtc = '2010-03-03',
  @CreateDate = '2010-03-03',
  @UniqueEmail = 1,
  @PasswordFormat = 0,
  @UserId = @UserId OUTPUT

SELECT @UserId as N'@UserId'

SELECT 'Return Value' = @return_value

GO

thanks!


为什么不使用会员API而要运行SQL呢? - František Žiačik
我需要运行一个 SQL 语句,出于环境原因。 - aron
你使用的是哪个版本的SQL?2005、2008还是R2? - hwiechers
1个回答

11

在“Hashed”密码存储模式下,它看起来只是计算:

SHA1(Salt + Password)

Salt以Base64编码存储,因此在与(Unicode)密码连接之前必须进行解码。最后,结果被Base64编码以供存储。

以下可怕的SQL将输出一个适当编码的值,可以替换当前所使用的“mypassword”。您还必须将@PasswordFormat设置为1,以指示密码以哈希方式存储。

declare @salt nvarchar(128)
declare @password varbinary(256)
declare @input varbinary(512)
declare @hash varchar(64)

-- Change these values (@salt should be Base64 encoded)
set @salt = N'eyhKDP858wdrYHbBmFoQ6DXzFE1FB+RDP4ULrpoZXt6f'
set @password = convert(varbinary(256),N'mypassword')

set @input = hashbytes('sha1',cast('' as  xml).value('xs:base64Binary(sql:variable(''@salt''))','varbinary(256)') + @password)
set @hash = cast('' as xml).value('xs:base64Binary(xs:hexBinary(sql:variable(''@input'')))','varchar(64)')

-- @hash now contains a suitable password hash
-- Now create the user using the value of @salt as the salt, and the value of @hash as the password (with the @PasswordFormat set to 1)

DECLARE @return_value int, 
  @UserId uniqueidentifier 

EXEC @return_value = [dbo].[aspnet_Membership_CreateUser] 
  @ApplicationName = N'Theater', 
  @UserName = N'sam.sosa', 
  @Password = @hash, 
  @PasswordSalt = @salt, 
  @Email = N'sam@Simple.com', 
  @PasswordQuestion = N'Whats your favorite color', 
  @PasswordAnswer = N'Fusia', 
  @IsApproved = 1, 
  @CurrentTimeUtc = '2010-03-03', 
  @CreateDate = '2010-03-03', 
  @UniqueEmail = 1, 
  @PasswordFormat = 1, 
  @UserId = @UserId OUTPUT 

SELECT @UserId as N'@UserId' 

SELECT 'Return Value' = @return_value 

Iridium,谢谢,但是我应该如何将它包含在上面的SQL语句中? - aron
我已经修改了我的代码,将密码哈希与您原始的SQL结合起来。 - Iridium
太好了!谢谢!运行良好! 另外注意:如果用户稍后更改密码,则在tb_Memberships表中查看新密码时也会进行“加盐”。 - aron
这很棒,但有没有想过如何在SQL 2000中实现类似的功能?是啊,我知道... - Raelshark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接