5

У меня есть SQL-скрипт, который создает пользователей в моей базе данных. Он использует хранимые процедуры .Net.SQL для создания пользователей .Net Memberhip Provider

На данный момент он отлично работает.

Единственная проблема заключается в том, что пароли сохранены четким текстом. Что я должен изменить здесь, чтобы они соленые/зашифрованы (Не уверен, что использовать термин здесь)

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'[email protected]', 
    @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 

спасибо!

+0

Почему вы не используете API членства, но вместо этого вы запускаете SQL? –

+0

Мне нужно запустить инструкцию sql по причинам среды – aron

+0

Какую версию SQL вы используете? 2005, 2008 или R2? – hwiechers

ответ

10

Под капотом он выглядит как для режима хранения паролей «HASHED», он просто вычисляет:

SHA1 (соль + пароль)

Соль хранятся в кодировке 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'[email protected]', 
    @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 
+0

Иридиум, спасибо, но как включить это в вышеприведенное заявление sql? – aron

+0

Я изменил свой код, чтобы включить хэширование пароля с исходным SQL. – Iridium

+0

Sweet! Благодаря! работает хорошо! Сторона примечания: если пользователь позже изменяет свой пароль, новый пароль также «солен» при просмотре в таблице tb_Memberships. – aron

 Смежные вопросы

  • Нет связанных вопросов^_^