四时宝库

程序员的知识宝库

用SQLSERVER生成一个随机强密码


由于原来系统的密码都是默认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中,自动生成密码了。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接