Compartilhar via


PWDCOMPARE (Transact-SQL)

Obtém o valor hash de uma senha e compara-o com o de uma senha existente. PWDCOMPARE pode ser usado para procurar senhas de logon em branco do SQL Server ou senhas fracas comuns.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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

Argumentos

  • 'clear_text_password'
    É a senha não criptografada. clear_text_password é sysname (nvarchar(128)).

  • 'password_hash'
    É o hash de criptografia de uma senha. password_hash é varbinary(128).

  • version
    Parâmetro opcional que poderá ser definido como 1 se password_hash representar um valor de um logon anterior à migração do SQL Server 2000 para o SQL Server 2005 ou o SQL Server 2008, mas nunca poderá ser convertido no sistema do SQL Server 2000. version é int.

    Observação importanteImportante

    Esse parâmetro foi preterido e poderá ser removido em uma futura versão do SQL Server.

Tipos de retorno

int

Retorna 1 se o hash de clear_text_password corresponder ao parâmetro password_hash, e 0 se não corresponder.

Comentários

Quando você migrar uma instância do SQL Server 7.0 para o SQL Server 2000 ou uma versão posterior, o hash de senha não será alterado e você deverá usar o parâmetro version para testar a senha. Após da migração, quando o logon for usado pela primeira vez, o hash de senha será atualizado para o formato que foi usado primeiro no SQL Server 2000. A partir daí, PWDCOMPARE não requer o parâmetro version para esse logon.

A função PWDCOMPARE não é uma ameaça contra a força de hashes de senha porque o mesmo teste pode ser executado por meio de tentativa de logon usando a senha fornecida como o primeiro parâmetro.

Permissões

PWDENCRYPT está disponível para o público.

A permissão CONTROL SERVER é necessária para examinar a coluna password_hash de sys.sql_logins.

Exemplos

A. Identificando logons que não tenham senhas no SQL Server 2005 ou no SQL Server 2008

O exemplo a seguir identifica logons do SQL Server que não tenham nenhuma senha. A primeira cláusula WHERE verifica se o hash de senha contém os valores armazenados no formato usado pelo SQL Server 2000 e versões posteriores. A segunda cláusula WHERE inclui o parâmetro version para verificar se o hash de senha contém os valores que ainda estão armazenados no formato usado por versões do SQL Server anteriores ao SQL Server 2000.

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

B. Identificando logons que não tenham senhas no SQL Server 2000

A tabela sys.sql_logins não existe no SQL Server 2000. Você pode executar a instrução a seguir em uma instância do SQL Server 2000 para identificar logons do SQL Server que não tenham nenhuma senha.

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

C. Procurando senhas comuns

Para procurar senhas comuns que você deseja identificar e alterar, especifique a senha como o primeiro parâmetro. Por exemplo, execute a instrução a seguir para procurar uma senha especificada como password.

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