5

내 데이터베이스에 사용자를 생성하는 SQL 스크립트가 있습니다. .procs에 저장된 .Net 멤버십을 사용합니다.만들 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'[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

, 그것은 단순히 계산 : 그 전에 디코딩해야하므로

SHA1 (소금 + 비밀번호)

솔트는, Base64로 인코딩 저장 (유니 코드) 암호로 연결됩니다. 마지막으로 결과는 저장 용으로 인코딩 된 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

달콤한! 감사! 잘 작동합니다! 사이드 노트 : 사용자가 나중에 비밀 번호를 변경하면 tb_Memberships 테이블에서 볼 때 새 비밀번호도 "소금에 절인" – aron