Sql server 如何散列已存在的密码?

Sql server 如何散列已存在的密码?,sql-server,powershell,Sql Server,Powershell,在测试并确保我的Send_email函数使用SQL表中的硬编码用户和密码成功进行身份验证后,我现在尝试对密码进行哈希运算 “我的专栏”的设置方式如下: 变量|值 密码|someP@ssword 列都是varchar,值列的长度是1000(这太多了吗?我将其设置为这么多,因为我了解到sha 512需要很多长度或其他东西,并且看到了使用1000的示例,至少如此) 我用这个查询来散列 INSERT INTO [dbo].[Table] (value) VALUES(HASHBYTES('S

在测试并确保我的Send_email函数使用SQL表中的硬编码用户和密码成功进行身份验证后,我现在尝试对密码进行哈希运算

“我的专栏”的设置方式如下:

变量|值 密码|someP@ssword

列都是varchar,值列的长度是1000(这太多了吗?我将其设置为这么多,因为我了解到sha 512需要很多长度或其他东西,并且看到了使用1000的示例,至少如此)

我用这个查询来散列

  INSERT INTO [dbo].[Table] (value)
    VALUES(HASHBYTES('SHA2_512', 'someP@ssword'))
但它会生成一个非二进制散列,我怀疑这就是为什么我收到这个电子邮件身份验证失败的错误,因为它可能无法破译非二进制密码字符。但问题是value列中有其他值,因此无法将整个列转换为varbinary

那么,有没有办法对硬编码的密码进行散列,或者我必须将其作为散列插入?或者,是否有一种方法可以只转换特定的字段/单元格,而不必更改值列的其余设计,这样它就不会影响其中的其他值?或者我应该为密码创建一个完全独立的列并将其设置为二进制? 编辑:我必须在此电子邮件功能调用中传递密码以进行身份验证:

Send-EMail -EmailFrom $From_Email -SendTo $To_Email -Body $Email_Body -Subject $Job_Success_Email_Subject -Username $SmtpUser -Password $SmtpPassword

但是冯在评论中说,我不能将散列密码作为凭证传递进去。那就意味着我必须在表中保持非散列?我认为哈希法在这种情况下会很好地工作…

看起来你被上面评论中不相关的讨论弄糊涂了

首先:哈希密码在你的
发送电子邮件
函数中不起作用,因为该函数无法“取消”所述密码。请阅读本介绍

如果您希望保护密码并能够检索原始值,则需要对其进行加密。加密的主题相当大,远远超出了用SO编写的范围。我将提供一些链接供您阅读:

密码短语加密是最简单的实现方法,但也是最薄弱的,因为任何阅读SP代码的人都会发现密码短语,因此可以解密数据注意密码短语本身可以作为参数传递到
密码短语
,允许您(安全地)将其存储在数据库之外的其他位置,即不必在SP代码中硬编码。如果您决定这样做,您将需要自己实现密码短语存储方法

使用密钥和证书进行加密提供了一种非常安全的方法,但除了非常小心地备份密钥之外,还需要一些时间进行设置。如果您丢失了密钥,您的数据将丢失,即您永远无法解密它

至于在
varchar
列中存储二进制数据,这很简单,下面是一个示例:

DECLARE @BinValue VARBINARY( 500 ) = HASHBYTES('SHA2_512', 'someP@ssword')
DECLARE @StringBinValue VARCHAR( 500 ) = CONVERT( VARCHAR( 500 ), @BinValue, 1 )
SELECT @BinValue, @StringBinValue, CONVERT( VARBINARY( 500 ), @StringBinValue, 1 ) AS BackToString
我使用了您原来的
HASHBYTES
函数作为示例,但您需要将其更改为加密函数


希望这能为您澄清问题。

看来您被上面评论中不相关的讨论弄糊涂了

首先:哈希密码在你的
发送电子邮件
函数中不起作用,因为该函数无法“取消”所述密码。请阅读本介绍

如果您希望保护密码并能够检索原始值,则需要对其进行加密。加密的主题相当大,远远超出了用SO编写的范围。我将提供一些链接供您阅读:

密码短语加密是最简单的实现方法,但也是最薄弱的,因为任何阅读SP代码的人都会发现密码短语,因此可以解密数据注意密码短语本身可以作为参数传递到
密码短语
,允许您(安全地)将其存储在数据库之外的其他位置,即不必在SP代码中硬编码。如果您决定这样做,您将需要自己实现密码短语存储方法

使用密钥和证书进行加密提供了一种非常安全的方法,但除了非常小心地备份密钥之外,还需要一些时间进行设置。如果您丢失了密钥,您的数据将丢失,即您永远无法解密它

至于在
varchar
列中存储二进制数据,这很简单,下面是一个示例:

DECLARE @BinValue VARBINARY( 500 ) = HASHBYTES('SHA2_512', 'someP@ssword')
DECLARE @StringBinValue VARCHAR( 500 ) = CONVERT( VARCHAR( 500 ), @BinValue, 1 )
SELECT @BinValue, @StringBinValue, CONVERT( VARBINARY( 500 ), @StringBinValue, 1 ) AS BackToString
我使用了您原来的
HASHBYTES
函数作为示例,但您需要将其更改为加密函数


希望这能为您澄清问题。

是的,谢谢。我正在编写一个脚本,并将一些常见变量保存在一个文本文件中的键值对中。然后我更进一步,制作了一个表格,而不是保存这些变量。我现在必须保护表中的密码,所以我认为哈希是一种方法。我不知道哈希值不能传递。哦,雷斯脱学得很好!所以散列值只能在“比较”场景中使用?例如,用户输入值并与之比较哈希值,对吗?至于加密,我不喜欢密钥和证书的概念,这应该是非常简单的:/我可能会使用你提到的第一种方法(通过短语传递)。所以据我所知,加密值仍然需要解密,对吗?我已经更新了我的答案,添加了一条关于
ENCRYPTBYPASSPHRASE
的注释,所以我读了第一篇博客。从我看到的是,值必须包含在解密函数中?解密短语('Pa$$W0rd4EnCRyPt10n')?嗯,那就没什么用了:/因为这意味着我必须在脚本中硬编码密码…我希望函数只是解密(“$SmtpPassword”)Dang,我想我必须使用Chef在那里存储密码并从Chef那里检索它…我希望是si