Ошибка изменения пароля входа в SQL Server 2005

У нас есть база данных SQL Server 2005, работающая на компьютере под управлением Windows Server 2003. Эта база данных теперь требуется для обеспечения изменения пароля для своих логинов, то есть новые пароли должны отличаться от старых по меньшей мере на n символов. В логинах используется проверка подлинности SQL Server. У нас есть Enforce Password Policy, проверенная для этих логинов, но политика сложности паролей Windows не включает правило требуемой нормы.

Есть ли способ реализовать это правило с помощью триггера или какого-либо другого механизма в SQL Server? Мы бы предпочли не прибегать к чему-то экзотическому, например, пытаться декомпилировать и редактировать passfilt.dll.

Дайте мне знать, если я оставил любую полезную информацию и благодарю вас за любую помощь, которую вы можете предоставить.

1 ответ

Я бы использовал расстояние Левенштейна:

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 - минимальный порог изменения.

Уточнение: расстояние Левенштейна вычисляет дисперсию, подсчитывая, сколько индивидуальных изменений персонажа потребовалось бы для соответствия источнику цели.

ПРИМЕР:

DECLARE @s varchar(200) = 'stackoverflow',
 @t varchar(200) = 'lackdoversow',
 @d int = 5
select
 dbo.edit_distance_within(@s,@t,@d)

Результат: 5

licensed under cc by-sa 3.0 with attribution.