PWDCOMPARE (Transact-SQL)

对密码执行哈希操作并将该哈希与现有密码的哈希进行比较。PWDCOMPARE 可用于搜索空的 SQL Server 登录密码或常见的弱密码。

主题链接图标Transact-SQL 语法约定

语法

PWDCOMPARE ( 'clear_text_password'
      , 'password_hash' 
   [ , version ] )

参数

  • 'clear_text_password'
    未加密的密码。clear_text_password 的数据类型为 sysname (nvarchar(128))。

  • 'password_hash'
    密码的加密哈希。password_hash 的数据类型为 varbinary(128)。

  • version
    可选参数;如果 password_hash 表示来自早于 SQL Server 2000(已迁移到 SQL Server 2005 或 SQL Server 2008 但从未转换为 SQL Server 2000 系统)的登录名的值,则该参数可设置为 1。version 的数据类型为 int。

    重要说明重要提示

    不推荐使用此参数,该参数将会从 SQL Server 的以后版本中删除。

返回类型

int

如果 clear_text_password 的哈希与 password_hash 参数匹配,则返回 1;否则返回 0。

注释

在您将 SQL Server 7.0 的实例迁移到 SQL Server 2000 或更高版本时,该密码哈希将不会更改,并且您必须使用 version 参数来测试该密码。在迁移后,当首次使用该登录名时,密码哈希将更新为在 SQL Server 2000 中首先使用的格式。之后,PWDCOMPARE 对于该登录名将不要求 version 参数。

PWDCOMPARE 函数不会威胁密码哈希的能力,因为可通过尝试使用作为第一个参数提供的密码登录,执行相同的测试。

权限

PWDENCRYPT 向用户开放使用。

检查 sys.sql_logins 的 password_hash 列要求 CONTROL SERVER 权限。

示例

A. 标识在 SQL Server 2005 或 SQL Server 2008 上没有密码的登录名

下面的示例标识没有密码的 SQL Server 登录名。第一个 WHERE 子句检查 SQL Server 2000 和更高版本使用的格式中存储的值的密码哈希。第二个 WHERE 子句包括 version 参数,以便检查在早于 SQL Server 2000 的 SQL Server 版本使用的格式中仍存储的值的密码哈希。

SELECT name FROM sys.sql_logins 
WHERE PWDCOMPARE('', password_hash) = 1 
OR PWDCOMPARE('', password_hash, 1) = 1 ;

B. 标识在 SQL Server 2000 上没有密码的登录名

sys.sql_logins 表在 SQL Server 2000 中不存在。您可以对 SQL Server 2000 的实例执行以下语句,以便标识没有密码的 SQL Server 登录名。

SELECT name FROM syslogins 
WHERE PWDCOMPARE ('', password) = 1 
OR PWDCOMPARE('', password, 1) = 1  ;

C. 搜索常见密码

为了搜索您要标识和更改的常见密码,请将密码指定为第一个参数。例如,执行以下语句以便搜索指定为 password 的密码。

SELECT name FROM sys.sql_logins 
WHERE PWDCOMPARE('password', password_hash) = 1 
OR PWDCOMPARE('password', password_hash, 1) = 1 ;