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.
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.Importante 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 ;