Overblog Folge diesem Blog
Edit post Administration Create my blog
Blog von Olaf Helper

T-SQL Passwort Generator Nr. 1

16. März 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

WebShops, Forum und wo man sich sonst noch anmelden kann, der User aber nicht selbst ein Passwort vorgeben kann (gibt es sowas noch?), das muss ein Passwort vorgegeben werden. Das kann über die Business Logic des Backends erfolgen oder: Über den MS SQL Server per Stored Procedure in T-SQL.
Aber eigentlich nur eine Fingerübung für mich; hier also das SQL Script für einen Passwort Generator.

 -- Alte vorhandene Version löschen 
 IF NOT OBJECT_ID('dbo.spGeneratePassword1') IS NULL 
   DROP PROCEDURE dbo.spGeneratePassword1; 
 GO 
   
 -- Autor: Olaf Helper 
 -- Stand: 16.03.2009 
 -- Typ:  Stored Procedure 
 -- Name:  spGeneratePassword1 
 -- 
 CREATE PROCEDURE dbo.spGeneratePassword1 
  @Password AS varchar(128) OUTPUT, 
  @MinLen AS tinyint = 8, 
  @MaxLen AS tinyint = 128, 
   @WithLowLetters AS bit = 1, 
  @WithUpLetters AS bit = 1, 
  @WithDigits AS bit = 1, 
  @WithSigns AS bit = 1 
 AS 
 BEGIN 
  DECLARE @signs varchar(128); 
  DECLARE @useLen smallint; 
  DECLARE @len smallint; 
  DECLARE @loop smallint; 
  DECLARE @pos smallint; 
   
  -- Parameter-Validierung 
  IF @MinLen < 2 OR @MinLen > @MaxLen OR @MaxLen > 128 
   RAISERROR (N'Invalid pwd length range', 10, 1); 
  IF @WithLowLetters = 0 AND @WithUpLetters = 0 AND @WithDigits = 0 AND @WithSigns = 0 
   RAISERROR (N'No signs for pwd defined', 10, 1); 
   
   -- Set der verwendbaren Zeichen setzen 
  SET @signs = ''; 
   IF @WithLowLetters = 1 
   SET @signs = @signs + 'abcdefghijklmnopqrstuvwxyz'; 
  IF @WithUpLetters = 1 
   SET @signs = @signs + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
  IF @WithDigits = 1 
   SET @signs = @signs + '0123456789'; 
  IF @WithSigns = 1 -- Nur nicht-reservierte Zeichen 
   SET @signs = @signs + '!§$&/=?@*+~#-:<>^°'; 
  SET @len = LEN(@signs); 
   
  -- Wieviele Zeichen nun wirklich 
  IF @MinLen = @MaxLen 
   SET @useLen = @MinLen; 
  ELSE 
   SET @useLen = @MinLen + (RAND() * (@MaxLen - @MinLen)); 
   
  -- Passwort zusammenbauen 
  SET @loop = 0; 
  SET @Password = ''; 
  WHILE @loop < @useLen 
  BEGIN 
   SET @pos = 1 + (RAND() * (@len - 1)); 
   SET @Password = @Password + SUBSTRING(@signs, @pos, 1); 
   SET @loop = @loop + 1; 
  END;   
 END; 
 GO 


Funktioniert es auch? Machen wir den Test:

 -- Unit-Test; Passwörter generieren lassen 
 DECLARE @loop int, @Password varchar(128); 
   
 SET @loop = 0; 
 WHILE @loop < 20 
 BEGIN 
  -- Mit DEFAULTS abrufen 
  EXEC dbo.spGeneratePassword1 @Password OUTPUT; 
  SELECT @Password; 
  SET @loop = @loop + 1; 
 END; 
 GO 

 

Diesen Post teilen

Repost 0

Kommentiere diesen Post