Share via


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 ログインを特定します。1 つ目の WHERE 句では、SQL Server 2000 以降のバージョンで使用される形式で格納されている値のパスワード ハッシュを確認します。2 つ目の WHERE 句では、SQL Server 2000 より前のバージョンの SQL Server で使用される形式で格納されている値のパスワード ハッシュを確認します。そのため、version パラメータが含まれています。

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

B. SQL Server 2000 で、パスワードがないログインを特定する

SQL Server 2000 には sys.sql_logins テーブルが存在しません。パスワードがない SQL Server ログインを特定するには、SQL Server 2000 のインスタンスに対して次のステートメントを実行します。

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 ;