5

Tengo un script SQL que crea usuarios en mi base de datos. Utiliza los procesos almacenados de membresía de .Net.SQL para crear usuarios de .Net Membership Provider

En este punto, funciona bien.

El único problema es que las contraseñas son guardado texto claro. ¿Qué debería cambiar para que se con sal/encriptación (No está seguro de qué término utilizar aquí)

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 

gracias!

+0

¿Por qué no utiliza la API de membresía sino que ejecuta el SQL? –

+0

Necesito ejecutar una instrucción sql por razones de entorno – aron

+0

¿Qué versión de SQL estás usando? 2005, 2008 o R2? – hwiechers

Respuesta

10

Bajo el capó se ve como para el modo de almacenamiento de contraseñas "hash", simplemente se calcula:

SHA1 (Sal + contraseña)

la sal se almacenan Base64 codificado, por lo que debe ser descodificado antes para concatenarse con la contraseña (Unicode). Finalmente, el resultado es codificado Base64 para almacenamiento.

El siguiente (horrible) SQL dará como resultado un valor adecuadamente codificado que puede ser sustituido en lugar de la "micontraseña" que tiene actualmente. También debe establecer @PasswordFormat en 1 para indicar que la contraseña está almacenada en 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, gracias, pero ¿cómo incluir esto en la declaración sql anterior? – aron

+0

He modificado mi código para incorporar el hash de la contraseña con su SQL original. – Iridium

+0

¡Dulce! ¡Gracias! ¡funciona bien! Nota al margen: si el usuario luego cambia su contraseña, la nueva contraseña también se "sacia" cuando se ve en la tabla tb_Memberships – aron

Cuestiones relacionadas