5

Ho uno script SQL che crea utenti nel mio database. Usa i proc memorizzati da membri .Net.SQL per creare utenti del provider di appartenenze a .Net

A questo punto funziona correttamente.

L'unico problema è che le password sono scritte in chiaro. Cosa devo cambiare qui per essi sono salata/criptati (non so cosa termine da usare qui)

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 

grazie!

+0

Perché non si utilizza l'API di appartenenza, ma si esegue l'SQL? –

+0

Ho bisogno di eseguire una dichiarazione SQL per motivi di ambiente – aron

+0

Quale versione di SQL stai usando? 2005, 2008 o R2? – hwiechers

risposta

10

Sotto il cofano sembra che per la modalità di memorizzazione di password "hash", esso calcola semplicemente:

SHA1 (sale + password)

Il sale viene memorizzato Base64 codificato, quindi deve essere decodificato prima essere concatenato con la password (Unicode). Infine, il risultato è Base64 codificato per l'archiviazione.

Il seguente (orribile) SQL restituirà un valore opportunamente codificato che può essere sostituito al posto della "parola chiave" che si ha attualmente. È necessario inoltre impostare @PasswordFormat su 1 per indicare che la password è stata memorizzata come hash.

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

Iridium, grazie, ma come faccio a includerlo nell'istruzione sql sopra? – aron

+0

Ho modificato il mio codice per incorporare l'hashing della password con l'SQL originale. – Iridium

+0

Dolce! Grazie! funziona bene! Nota a margine: se l'utente modifica la propria password in seguito, anche la nuova password viene "salata" quando viene visualizzata nella tabella tb_Memberships – aron

Problemi correlati