Можно действительно написать сценарий паролей от SQL-сервера 2000 и импортировать их в SQL-сервер 2008 так, чтобы они были распознаны как прописные пароли. Вот некоторое дополнительное чтение, которое будет полезно в понимании хэшей пароля SQL-сервера, таким образом, Вы будете мочь следующее наряду с примером.
Пароли SQL Server 2000 были на самом деле нечувствительны к регистру, как описано в этой напыщенной речи. Несмотря на это, хеши SQL-сервера хранят чувствительную к регистру и нечувствительную к регистру копию пароля, так, чтобы, когда Вы мигрируете, хэши пароля к SQL-серверу 2005/2008 Ваши пароли были затем чувствительны к регистру.
Для проверения этого можно выполнить следование Сервера SQL Server 2000:
exec sp_addlogin @loginame= 'usera' , @passwd='password'
при вхождении в SQL Server 2000, поскольку Усера работает с 'ПАРОЛЕМ', даже при том, что он не был должен. Для миграции Усера в SQL Server 2005/2008, мы можем использовать следующее для копирования входа в систему, сохраняющего sid и хэш пароля:
select
'exec sp_addlogin @loginame ='''
+ [name] + ''''
+ ', @passwd= '
+ master.dbo.fn_varbintohexstr([password])
+ ', @sid= '
+ master.dbo.fn_varbintohexstr([sid])
+ ', @encryptopt = ''skip_encryption_old'''
from sysxlogins where name='usera'
Вы получите следующий вывод (с другим sid и хешируете, конечно):
exec sp_addlogin @loginame ='usera',
@passwd= 0x01004409eb54922c0cd2bedbad754f37afad4053bdadf719ff80c8a8abf5801b813114be6ba0c2c8543b2db77b33,
@sid= 0x06cf56eb108a12428712f8b7c66ca1cd, @encryptopt = 'skip_encryption_old'
То, что можно сделать, выполняют некоторую 'обработку' на хэше пароля прежде, чем импортировать его в 2008 так, чтобы второй прописной хеш перезаписал чувствительный к регистру хеш. Это будет означать, что все Ваши пароли находятся в верхнем регистре. Используя пароль имеет выше, можно выполнить следующую операцию, которую я сделал здесь в t-sql:
declare @old_passwd char(94) -- original hash from sql server 2000
declare @new_passwd char(94) -- new upper case password for sql server 2008
declare @cs_hash char(40) -- case sentive part
declare @ci_hash char(40) -- case insentive part
declare @salt char(14)
set @old_passwd = '0x01004409EB54922C0CD2BEDBAD754F37AFAD4053BDADF719FF80C8A8ABF5801B813114BE6BA0C2C8543B2DB77B33'
set @salt = SUBSTRING(@old_passwd,1,14)
set @cs_hash = SUBSTRING(@old_passwd,15,40) -- not used, but here for understanding
set @ci_hash = SUBSTRING(@old_passwd,55,40)
set @new_passwd = @salt + @ci_hash + @ci_hash
SELECT @new_passwd
использование этого @new_password как @passwd параметр для sp_addlogin будет означать, что пароль распознан как верхний регистр!
корректный ответ должен исправить приложения прежней версии так, чтобы они не делали этого (который имеет право на DailyWTF - сознательно сокращение пространства поиска для трещины грубой силы).
надо надеяться, Вы имеете исходный код и можете сделать это.
в противном случае ответ chopper3 будет работать.
Можно также сделать, как Chopper3 предполагает, потому что Вы оказываетесь перед необходимостью сообщать пользователям так или иначе. Даже если можно написать сценарий изменения в верхнем регистре, это - все еще изменение пароля, и пользователям нужно сказать об этом.
Проблема состоит в том, что сопоставление базы данных, устанавливающее это, которое Вы имели в старой базе данных 2000 года, было нечувствительно к регистру, но Вы мигрировали на новую базу данных, где установка сопоставления была чувствительна к регистру. Все, что необходимо сделать, изменяют настройки сопоставления в Вас более новые свойства баз данных, и затем они будут соответствовать именам независимо от случая.
Ваше приложение было кодировано к Верхнему регистру пароли, потому что разработчики не поняли, что база данных 2000 года была чувствительна к регистру. Они, возможно, легко изменили настройки базы данных 2000 года к нечувствительному к регистру для решения их проблемы, но они, очевидно, приняли решение "взломать" вокруг этого вместо этого.
Я нахожу это интересным, что все, на которые elses отвечают на этот вопрос, следуют за тем же наивным путем. Вообразите все напрасно потраченное время в истории из-за разработчиков, не понимающих эту простую проблему.