PWDCOMPARE (Transact-SQL)

Obtiene el valor hash de una contraseña y lo compara con el de otra existente. PWDCOMPARE se puede usar para buscar contraseñas de inicio de sesión de SQL Server en blanco o contraseñas poco seguras comunes.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

  • 'clear_text_password'
    Es la contraseña sin cifrar. clear_text_password es sysname (nvarchar(128)).

  • 'password_hash'
    Es el valor hash de cifrado de una contraseña. password_hash es de tipo varbinary(128).

  • version
    Parámetro opcional que se puede establecer en 1 si password_hash representa un valor de un inicio de sesión anterior a SQL Server 2000 que se migró a SQL Server 2005 o SQL Server 2008 pero que nunca se convirtió al sistema SQL Server 2000. version es int.

    Nota importanteImportante

    Este parámetro ha quedado en desuso y podría quitarse de las versiones posteriores de SQL Server.

Tipos de valor devueltos

int

Devuelve 1 si el valor hash de clear_text_password coincide con el parámetro password_hash, y 0 si no coincide.

Notas

Cuando migra una instancia de SQL Server 7.0 a SQL Server 2000 o una versión posterior, la contraseña no se cambia y debe usar el parámetro version para probarla. Después de la migración, cuando se usa el inicio de sesión por primera vez, el valor hash de la contraseña se actualiza al formato que se usó por primera vez en SQL Server 2000. Desde entonces, PWDCOMPARE no requiere el parámetro version para ese inicio de sesión.

La función PWDCOMPARE no es una amenaza contra la seguridad de los valores hash de las contraseñas porque podría realizarse la misma prueba intentando iniciar sesión con la contraseña proporcionada como primer parámetro.

Permisos

PWDENCRYPT está disponible al público.

Se requiere el permiso CONTROL SERVER para examinar la columna password_hash de sys.sql_logins.

Ejemplos

A. Identificar los inicios de sesión que no tienen contraseñas en SQL Server 2005 o SQL Server 2008

El ejemplo siguiente identifica los inicios de sesión de SQL Server que no tienen contraseñas. La primera cláusula WHERE comprueba si el valor hash de la contraseña coincide con los valores almacenados en el formato que se usa en SQL Server 2000 y versiones anteriores. La segunda cláusula WHERE incluye el parámetro version para comprobar si el valor hash de la contraseña coincide con los valores que siguen almacenados en el formato que se usa en las versiones de SQL Server anteriores a SQL Server 2000.

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

B. Identificar los inicios de sesión que no tienen contraseñas en SQL Server 2000

La tabla sys.sql_logins no existe en SQL Server 2000. Puede ejecutar la siguiente instrucción con una instancia de SQL Server 2000 para identificar los inicios de sesión de SQL Server que no tienen contraseñas.

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

C. Buscar contraseñas comunes

Para buscar contraseñas comunes que desee identificar y cambiar, especifique la contraseña como primer parámetro. Por ejemplo, ejecute la instrucción siguiente para buscar una contraseña especificada como password.

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