由于原来系统的密码都是默认123456,希望用户在登陆后能够手动修改密码。但是真实情况是,无论工作岗位是否重要,大家都不修改密码。所以系统密码以后采用随机生成强密码模式。
首先,密码需确保随机生成,以降低重复概率。并且要维系强密码模式,即需涵盖字符的大小写、数字以及特殊符号等元素,以此保障密码的强度。
为达成随机之目的,运用了 SQLServer 的 rand()函数来获取随机数。为确保强密码之设定,密码所采用的格式为:a + 1 位大写字母+当前年份+1 位小写字母+当前月份+1 位特殊符号+当前日期+ 1 位与前面不同的特殊符号。
其中,大写字母、小写字母以及特殊符号能够通过 rand()获取随机数,而后依照相同比例缩放至字符范围内。例如,在 Ascii 中,A - Z 所对应的数字为 65 - 90,a - z 所对应的数字为 97 - 122,0 - 9 所对应的数字为 48 - 57,<=>?@ 所对应的数字为 60 - 64,#$%& 所对应的数字为 35 - 38 。
'a'
+dbo.fnRndRang(65,90,rand())
+Cast(year(getdate()) as nvarchar(100))
+dbo.fnRndRang(97,122,rand())
+Cast(month(getdate()) as nvarchar(100))
+dbo.fnRndRang(60,64,rand())
+Cast(day(getdate()) as nvarchar(100))
+dbo.fnRndRang(34,38,rand())
通过同比例缩放的形式,编写出了函数 fnRndRang ,此函数能够针对一定范围内的数值进行等比例缩放,进而获取一个随机的 ascill 字符。
if exists (select * from sysobjects where xtype='fn' and name='fnRndRang')
begin
drop function fnRndRang;
end
go
create function fnRndRang(
@min int,
@max int,
@rnd float
)
returns nvarchar(100)
as
begin
declare @code nvarchar(100)
declare @upcode int
set @upcode=ceiling(@rnd*100)
set @upcode=
case
when @upcode<@min or @upcode>@max then ceiling((@upcode*1.0/100)*(@max-@min))+@min
else @upcode
end
return char(@upcode)
end
这样就可以生成一个随机密码,后面可以放到自己的SQL中,自动生成密码了。