gpt4 book ai didi

sql-server - SQL Server - PWDEncrypt 和 PWDCompare 的替代实现

转载 作者:行者123 更新时间:2023-12-04 00:25:08 31 4
gpt4 key购买 nike

我正在修改一个应用程序,该应用程序使用 SQL Server 的 PWDEncrypt 和 PWDCompare 函数将散列密码存储到表的 varbinary 列中。

由于不应使用这些函数(由于算法可能发生变化或它们在未来被弃用),我想将应用程序转换为使用支持的 HASHBYTES 函数。

是否有人拥有使用 HASHBYTES 功能实现与 PWDENCRYPT/PWDCOMPARE 相同功能的代码,这样我就不必让每个用户在转换期间更改他们的密码并且现有的散列密码仍然有效?

我正在使用 SQL Server 2008 R2。

最佳答案

我已经成功地使用 SQL 生成了我自己的 PWDENCRYPT 和 PWDCOMPARE 实现。

不幸的是,由于在 PWDENCRYPT 部分使用了 RAND(),您无法将其转换为 UDF。

这是执行 PWDEncrypt 的代码

DECLARE @passwordToEncrypt NVARCHAR(MAX)
SET @passwordToEncrypt = 'Password'

DECLARE @salt VARBINARY(4)
SET @salt = CONVERT(VARBINARY(4), RAND())

DECLARE @encryptedPassword VARBINARY(128)

SET
@encryptedPassword
=
0x0100
+
--Salt
@salt
+
--Hash of Password + Salt
HASHBYTES('SHA1', @passwordToEncrypt + CONVERT(NVARCHAR(MAX), @salt))

SELECT
@passwordToEncrypt [OriginalPassword],
@encryptedPassword [MyPWDEncrypt],
PWDCOMPARE(@passwordToEncrypt, @encryptedPassword) [SQLPWDCompare]

这是执行 PWDCompare 的代码

DECLARE @passwordToTest NVARCHAR(MAX)
SET @passwordToTest = 'Password'

DECLARE @encryptedPassword VARBINARY(128)
SET @encryptedPassword = PWDENCRYPT(@passwordToTest)

SELECT
@passwordToTest [OriginalPassword],
@encryptedPassword [SQLPWDEncrypt],
CASE WHEN
@encryptedPassword
=
--Header
0x0100
+
--Salt
CONVERT(VARBINARY(4), SUBSTRING(CONVERT(NVARCHAR(MAX), @encryptedPassword), 2, 2))
+
--Hash of Password + Salt
HASHBYTES('SHA1', @passwordToTest + SUBSTRING(CONVERT(NVARCHAR(MAX), @encryptedPassword), 2, 2))
THEN 1 ELSE 0 END [MyPWDCompare]

关于sql-server - SQL Server - PWDEncrypt 和 PWDCompare 的替代实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8503582/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com