使用散列密码创建登录名的最佳方法?

Roa*_*ool 6 sql-server

使用散列密码创建登录名的正确方法是什么,因为 .

我已经尝试了https://msdn.microsoft.com/en-us/library/ms189751.aspx 中解释的方法,但它不起作用。

查询1

CREATE LOGIN administratori WITH hashed_password = '12345'
,DEFAULT_DATABASE = MDAfondation
,DEFAULT_LANGUAGE = english
,CHECK_EXPIRATION = OFF
GO 
Run Code Online (Sandbox Code Playgroud)

如果有人能告诉我如何编写散列密码部分。

我应该这样做吗,如果我在验证(登录)时这样做,我如何告诉 sql 它应该先散列密码。

CREATE LOGIN administratori WITH PASSWORD = (HASHBYTES('SHA2_512','12345'))
,DEFAULT_DATABASE = MDAfondation
,DEFAULT_LANGUAGE = english
,CHECK_EXPIRATION = OFF
GO 
Run Code Online (Sandbox Code Playgroud)

因此,请使用带有查询的散列密码(最好使用SHA2_512散列)创建登录名的最佳方法是什么。如果有人能告诉我“Query1”的错误在哪里,我将不胜感激。

Han*_*non 8

HASHED语法只表示指定的密码哈希。SQL Server 将所有密码存储为散列,它从不以纯文本形式存储它们。

顺便说一句,使用散列密码创建登录的语法是:

CREATE LOGIN administratori 
WITH PASSWORD = 0x01003BA91A73BB0B9C06A647FC81F3B221EDA8E74AF33C20252F HASHED
    , DEFAULT_DATABASE = MDAfondation
    , DEFAULT_LANGUAGE = english
    , CHECK_EXPIRATION = OFF;
Run Code Online (Sandbox Code Playgroud)

密码被指定为二进制值 - 该值是密码的“散列”版本。上面的哈希是由PWDENCRYPT函数获得的,如下所示:

SELECT PWDENCRYPT('P@ssw0rd');
Run Code Online (Sandbox Code Playgroud)

当您需要确保每次登录的密码在新服务器上完全相同时,将密码指定为散列值对于将来自一台服务器的脚本登录部署到另一台服务器上非常有用。从现有服务器生成登录的代码的起点可能是:

DECLARE @cmd nvarchar(max);
DECLARE cur CURSOR LOCAL FORWARD_ONLY STATIC
FOR
SELECT N'CREATE LOGIN ' + QUOTENAME(sp.name) + N'
WITH PASSWORD = ' + COALESCE(sys.fn_varbintohexstr(
    CONVERT(VARBINARY(MAX), LOGINPROPERTY(sp.name, 'PasswordHash')
    )), '') + N' HASHED
    , SID = ' + CONVERT(VARCHAR(40), sys.fn_varbintohexstr(sp.sid), 0) + N'
    ' + CASE WHEN sp.default_database_name IS NOT NULL THEN N', DEFAULT_DATABASE = ' + QUOTENAME(sp.default_database_name) ELSE N'' END + N'
    ' + CASE WHEN sp.default_language_name IS NOT NULL THEN N', DEFAULT_LANGUAGE = ' + sp.default_language_name ELSE N'' END + N'
    ' + CASE WHEN LOGINPROPERTY('SomeLogin', 'DaysUntilExpiration') IS NULL THEN N', CHECK_POLICY = OFF
    , CHECK_EXPIRATION = OFF' ELSE N'' END + N'
' + CASE WHEN sp.is_disabled = 1 THEN N'ALTER LOGIN ' + sp.name + N' DISABLE;
' ELSE N'' END + N'
'
FROM sys.server_principals sp
WHERE sp.type_desc = N'SQL_LOGIN'
    AND NOT (sp.name LIKE N'##%')
    AND NOT (sp.name = N'sa')
ORDER BY sp.name;
OPEN cur;
FETCH NEXT FROM cur INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
    RAISERROR (@cmd, 0, 1) WITH NOWAIT;
    FETCH NEXT FROM cur INTO @cmd;
END
CLOSE cur;
DEALLOCATE cur;
Run Code Online (Sandbox Code Playgroud)

我将其包括在内以展示如何使用散列密码。

不建议使用散列密码创建新登录名,因为 SQL Server 无法确认密码匹配您设置的策略,例如最小密码长度和复杂性。