lunes, 28 de noviembre de 2011

Procedimiento almacenado en SQL Server para generar contraseñas aleatorias

Este blog es una traducción de un artículo publicado en mssqltips por Brent Shaub, que permite crear un procedimiento almacenado que genera contraseñas aleatorias.

Problema

SQL Server se utiliza para apoyar muchas aplicaciones y una de esas características es el almacenamiento de contraseñas. A veces es necesario restablecer una contraseña con una contraseña temporal o generar una contraseña aleatoria para un usuario nuevo. En este tip se desarrolla un procedimiento almacenado para generar contraseñas aleatorias que se pueden incorporar en sus aplicaciones.

Solución

El siguiente procedimiento almacenado crea cadenas de caracteres al azar basado en cuatro parámetros que configuran el resultado.


  1. LEN - especifica la longitud del resultado (obligatorio)
  2. MIN - indica el Código ASCII inicial (opcional: por omisión "48": que es el número cero)
  3. RANGE - determina el rango de cuántos caracteres ASCII se incluirán (opcional: por omisión "74" (48 + 74 = 122) donde 122 es "z" minúscula)
  4. EXCLUDE - un string de caracteres por excluir de la salida final (opcional: por omisión incluye cero, "O" mayúscula, estos signos de puntuación :;<=>?@[]`^\/)


Código

create proc [dbo].uspRandChars
   @len int,
   @min tinyint = 48,
   @range tinyint = 74,
   @exclude varchar(50) = '0:;<=>?@O[]`^\/',
   @output varchar(50) output
as
   declare @char char
   set @output = ''
   while @len > 0 begin
     select @char = char(round(rand() * @range + @min, 0))
     if charindex(@char, @exclude) = 0 begin
       set @output += @char
       set @len = @len - 1
     end

   end;
go

Ejemplos

declare @newpwd varchar(20)

-- all values between ASCII code 48 - 122 excluding defaults
exec [dbo].uspRandChars @len=8, @output=@newpwd out
select @newpwd

-- all lower case letters excluding o and l
exec [dbo].uspRandChars @len=10, @min=97, @range=25, @exclude='ol', @output=@newpwd out
select @newpwd

-- all upper case letters excluding O
exec [dbo].uspRandChars @len=12, @min=65, @range=25, @exclude='O', @output=@newpwd out
select @newpwd

-- all numbers between 0 and 9
exec [dbo].uspRandChars @len=14, @min=48, @range=9, @exclude='', @output=@newpwd out
select @newpwd

Resultados

2uR37gRq
--------------
qvffsvxzvd
--------------
IRTIFJHFFCKB
--------------
58739441336731

3 comentarios: