我们在Windows Server 2003计算机上运行SQL Server 2005数据库。此数据库现在需要对其登录强制执行密码更改差异,即新密码应与旧密码相差至少n个字符。登录使用SQL Server身份验证。我们已针对这些登录检查了强制密码策略,但Windows密码复杂性策略未包含所需的差异规则。
有没有办法在SQL Server中使用触发器或其他机制实现此规则?我们宁可不诉诸异国情调,比如试图反编译和编辑passfilt.dll。
如果我遗漏了任何有用的信息,请告诉我们,并感谢您提供的任何帮助。
答案 0 :(得分:0)
我会使用Levenshtein距离:
CREATE FUNCTION edit_distance_within(@s nvarchar(4000), @t nvarchar(4000), @d int)
RETURNS int
AS
BEGIN
DECLARE @sl int, @tl int, @i int, @j int, @sc nchar, @c int, @c1 int,
@cv0 nvarchar(4000), @cv1 nvarchar(4000), @cmin int
SELECT @sl = LEN(@s), @tl = LEN(@t), @cv1 = '', @j = 1, @i = 1, @c = 0
WHILE @j <= @tl
SELECT @cv1 = @cv1 + NCHAR(@j), @j = @j + 1
WHILE @i <= @sl
BEGIN
SELECT @sc = SUBSTRING(@s, @i, 1), @c1 = @i, @c = @i, @cv0 = '', @j = 1, @cmin = 4000
WHILE @j <= @tl
BEGIN
SET @c = @c + 1
SET @c1 = @c1 - CASE WHEN @sc = SUBSTRING(@t, @j, 1) THEN 1 ELSE 0 END
IF @c > @c1 SET @c = @c1
SET @c1 = UNICODE(SUBSTRING(@cv1, @j, 1)) + 1
IF @c > @c1 SET @c = @c1
IF @c < @cmin SET @cmin = @c
SELECT @cv0 = @cv0 + NCHAR(@c), @j = @j + 1
END
IF @cmin > @d BREAK
SELECT @cv1 = @cv0, @i = @i + 1
END
RETURN CASE WHEN @cmin >= @d AND @c >= @d THEN @c ELSE -1 END
END
创建此功能,然后使用此查询调用旧密码和新密码的距离:
select
dbo.edit_distance_within(@s,@t,@d)
@s
是源字符串(旧密码),@t
是目标(新密码),@d
是最小更改阈值。
澄清: Levenshtein距离通过计算将源与目标匹配所需的单个字符更改来计算方差。
示例:
DECLARE @s varchar(200) = 'stackoverflow',
@t varchar(200) = 'lackdoversow',
@d int = 5
select
dbo.edit_distance_within(@s,@t,@d)
结果:5