- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
create procedure pwqgen @length int =3
as
/* pwqgen is a t-sql implementation of passwdqc's pwqgen password generator http://www.openwall.com/passwdqc/ */
/* inspired by https://github.com/iphoting/pwqgen.rb */
BEGIN
create table #separators (id int identity, s char(1))
insert into #separators
select "-" union select "_" union select "+" union select "=" union select "2" union select "3"
union select "4" union select "5" union select "6" union select "7" union select "8" union select "9"
declare @maxsep int, @s varchar(1)
select @maxsep=max(id) from #separators
declare @maxid int, @w varchar(30) , @pw varchar(31)
select @maxid=max(id) from words -- =4096
select @w=w from words where id=convert(int,round(rand()*@maxid,0) )
-- capitalize 1st letter
if rand() > 0.5
select @w= UPPER(LEFT(@w,1))+SUBSTRING(@w,2,LEN(@w))
set @pw=@w
set @length = @length-1
while @length > 0
begin
select @s=s from #separators where id=convert(int,round(rand()*@maxsep,0) )
delete from #separators where s=@s
select @w=w from words where id=convert(int,round(rand()*@maxid,0) )
-- capitalize 1st letter
if (rand() > 0.5 or @s is null)
select @w= UPPER(LEFT(@w,1))+SUBSTRING(@w,2,LEN(@w))
set @pw=@pw+@s+@w
set @length = @length -1
end
-- if no one number in @pw - append or replace last letter to random number
if PATINDEX('%[0-9]%', @pw ) > 0
begin
set @s=convert(char(1), 2+convert(int,round(rand()*7,0)) )
if len(@pw)<30 set @pw=@pw+@s
else set @pw=UPPER(RIGHT(@pw,1))+SUBSTRING(@pw,1,LEN(@pw)-1)+@s
end
drop table #separators
print @pw
END
-- требует существования таблички со словами
-- create table words (id int identity , w varchar(7))
-- 4 тыс слов взял отсюда: https://github.com/iphoting/pwqgen.rb/blob/develop/lib/pwqgen/wordlist.rb
паролегенератор на tsql.
при тестах понял что возможна ситуация, когда пароль не имеет ниодной цифры, что запрещено политикой.
наговнокодил кучу charindex-ов. впринципе то работало, но вспомнил этот сайт, условие переписал под patindex, но треш в ветке с условием if PATINDEX('%[0-9]%', @pw ) > 0 остался.
DBdev 20.09.2013 11:37 # +2
За что???чем???
anonimb84a2f6fd141 20.09.2013 20:17 # +4
Lure Of Chaos 21.09.2013 01:07 # +2
2. отсюда довольно странная, бажная и неэстетичная реализация.
3. сомнителен сам алгоритм, а особенно использование словаря - что делает его уязвимым атакам брута по словарю. есть алгоритмы генерации случайных, но легкозапоминающихся паролей.
spivti 21.09.2013 12:28 # +1
guest 21.09.2013 14:01 # −11