SQL Server 2005登录密码更改方差

时间:2014-02-04 16:46:13

标签: sql sql-server-2005 passwords

我们在Windows Server 2003计算机上运行SQL Server 2005数据库。此数据库现在需要对其登录强制执行密码更改差异,即新密码应与旧密码相差至少n个字符。登录使用SQL Server身份验证。我们已针对这些登录检查了强制密码策略,但Windows密码复杂性策略未包含所需的差异规则。

有没有办法在SQL Server中使用触发器或其他机制实现此规则?我们宁可不诉诸异国情调,比如试图反编译和编辑passfilt.dll。

如果我遗漏了任何有用的信息,请告诉我们,并感谢您提供的任何帮助。

1 个答案:

答案 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

相关问题