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