T-SQL Passwort Generator Nr. 2
Der erste Password Generator in T-SQL für den MS SQL Server erstellt komplett kryptische Passwörter, die man sich eigentlich nicht merken kann, dafür kann man sie nicht „erraten“. Somit sind sie zumindest als Passwörter für System-Accounts (wie der „sa“) oder Anwendungs-Rollen gut geeignet; also wo sich niemand interaktive anmeldet.
Nun will ich einen Generator vorstellen, das auch merkbare Passwort erstellt und zwar sogenannte „Mnemonische Passwörter“. Diese bestehen immer aus einer Kombination aus Konsonant gefolgt von einem Vokal. Dadurch entstehen zufällig Wörter, die zwar keinen richtigen Sinn machen, aber „sprechbar“ und somit besser merkbar sind; z.B. „yegazoru“.
Die Logik der Stored Procedure ist im Großen dem von Nr. 1 gleich; nur das immer Kombinationen von 2 Buchstaben erstellt werden.
-- Alte vorhandene Version löschen
IF NOT OBJECT_ID('dbo.spGeneratePassword2') IS NULL
DROP PROCEDURE dbo.spGeneratePassword2;
GO
-- Autor: Olaf Helper
-- Stand: 07.04.2009
-- Typ: Stored Procedure
-- Name: spGeneratePassword2
-- Generiert "Mnemonische Passwörter" mit je
-- ein Konsonant und ein Vokal in Folge erzeugen
CREATE PROCEDURE dbo.spGeneratePassword2
@Password AS varchar(128) OUTPUT,
@MinLen AS tinyint = 8,
@MaxLen AS tinyint = 128
AS
BEGIN
DECLARE @vocal char(5);
DECLARE @consonat char(21);
DECLARE @useLen 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);
-- Set der verwendbaren Zeichen setzen
SET @vocal = 'aeiou';
SET @consonat = 'bcdfghjklmnpqrstvwxyz';
-- Wieviele Zeichen nun wirklich
IF @MinLen = @MaxLen
SET @useLen = @MinLen;
ELSE
SET @useLen = @MinLen + (RAND() * (@MaxLen - @MinLen));
-- Es werden immer 2 Zeichen erzeugt, deshalb nur die Hälfte
SET @useLen = @useLen / 2;
-- Passwort zusammenbauen
SET @loop = 0;
SET @Password = '';
WHILE @loop < @useLen
BEGIN
-- Konsonant
SET @pos = 1 + (RAND() * (20));
SET @Password = @Password + SUBSTRING(@consonat, @pos, 1);
-- Vokal
SET @pos = 1 + (RAND() * (4));
SET @Password = @Password + SUBSTRING(@vocal, @pos, 1);
SET @loop = @loop + 1;
END;
END;
GO
-- Unit-Test; Passwörter generieren lassen
DECLARE @loop int, @Password varchar(128);
SET @loop = 0;
WHILE @loop < 20
BEGIN
-- Passwörter generieren lassen
EXEC dbo.spGeneratePassword2 @Password OUTPUT, 8, 11;
SELECT @Password AS Pwd;
SET @loop = @loop + 1;
END;
GO