是否可以将所有用户密码更改为大写

是否可以将所有用户密码更改为大写

我目前正在将一些服务器从 MS sql server 2000 迁移到 2008。一些旧版应用程序受密码保护,本质上是通过检查服务器上是否存在具有该名称和密码的用户来保护。

每个应用程序在将密码发送到服务器之前都会将其转换为大写,但是,是的,您猜对了,服务器上的密码不一定以大写形式存储:这在 2000 年不是问题,但在 2008 年是问题(这是正确的!)。

这些应用程序没有任何允许用户更改密码的巧妙功能,而且我不想要求每个用户更改密码或更改应用程序,因此我想知道是否可以使用脚本将所有用户密码更改为更高版本以及如何创建它(要修改的表,如何修改散列字段等)?

答案1

您确实可以从 sql server 2000 中编写密码脚本并将其导入到 sql server 2008 中,以便将它们识别为大写密码。以下是一些背景阅读这将有助于理解 SQL 服务器密码哈希,因此您可以按照示例进行操作。

SQL Server 2000 密码实际上是不区分大小写的,如这场咆哮。 即便如此,sql server 哈希仍存储了区分大小写和不区分大小写的密码副本,以便当您将密码哈希迁移到 sql server 2005/2008 时,您的密码区分大小写。

为了测试这一点,您可以在 SQL Server 2000 Server 上运行以下命令:

exec sp_addlogin  @loginame= 'usera' , @passwd='password'

以 usera 身份登录 SQL Server 2000 可以使用 'PASSWORD' ,尽管实际上不应该这样。要将 usera 迁移到 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 和 hash):

 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 作为sp_addlogin 的@passwd 参数将意味着密码被识别为大写!

答案2

没有办法更改他们现有的密码,这些密码实际上是在本地加密的,但你可以将他们的密码重置为大写字母并通知他们

答案3

正确的答案是修复旧版应用程序,使它们不会这样做(这符合 DailyWTF 的要求 - 故意减少暴力破解的搜索空间)。

希望您有源代码并可以做到这一点。

如果没有的话,chopper3 的答案将会有效。

答案4

您不妨按照 Chopper3 的建议去做,因为无论如何您都必须通知用户。即使您可以编写脚本更改大写字母,这仍然是密码更改,需要通知用户。

相关内容