将凭证秘密与已知值进行比较

Han*_*non 5 sql-server credentials sql-server-2019

假设我有一个带有特定秘密的 SQL Server凭据保存在数据库中。我只想在数据库中保存的秘密与实际秘密不同时修改凭据。

有时,一个例子很好,所以看看这个:

CREATE CREDENTIAL [MyCred]
WITH IDENTITY = N'DOMAIN\User'
    , SECRET = N'some_password';
Run Code Online (Sandbox Code Playgroud)

因此,在的密码DOMAIN\User从 更改为 后,我需要更新密钥,但前提是存储的值不匹配。即我不想盲目地删除并重新创建凭据。some_passwordsome_new_password

通过服务器主体,我可以使用该LOGINPROPERTY([login_name], 'PasswordHash')函数来获取存储在主数据库中的加密密码的哈希版本,但这似乎不适用于凭据。

小智 6

加密凭证密码可以通过 DAC 查看:-

SELECT *
FROM [master].sys.sysobjvalues
WHERE valclass = 28;
Run Code Online (Sandbox Code Playgroud)

它们的存储方式与登录密码不同,而是使用服务主密钥 (SMK) 进行加密。

这篇文章更进一步,并链接到 PowerShell 脚本来解密它们:-

https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-credential-passwords/

您可以自动运行 PowerShell 脚本来导出明文密码以进行比较。

也许更简单的方法是只检查 sys.credentials 的 [modify_date],如果该日期早于已知的密码更改(假设您知道它已被更改),您就会知道需要更新凭证。

如果您正在处理 AD 密码,则可以使用 Get-ADUser 查找密码更改日期进行比较,但在更复杂的 AD 环境下,要获得可靠的结果会变得更加困难。

  • 使用这种方法要小心,它并不完全正确:https://www.sengallardy.com/dbatools-decryption-issues-are-not-a-sql-server-bug/ (2认同)