如何哈希已有的密码?

Cat*_*ter 1 sql-server powershell

在测试并确保我的Send_email函数使用SQL表中的硬编码用户和密码成功验证后,我现在正在尝试哈希密码.

我的列设置方式是这样的:

变量| 值

密码| someP @提供ssword

列是varchar两者,值列是1000长度(太多了?我把它设置为那么多,因为我读到sha 512需要很多长度或者其他东西,并且看到使用1000的示例至少如此)

我正在使用此查询来哈希,

  INSERT INTO [dbo].[Table] (value)
    VALUES(HASHBYTES('SHA2_512', 'someP@ssword'))
Run Code Online (Sandbox Code Playgroud)

但它生成一个非二进制哈希,我怀疑是为什么我收到此错误的电子邮件身份验证失败,因为它可能无法破译非二进制密码字符.但问题是我在值列中有其他值,所以我无法将整列转换为varbinary.

那么有一种方法可以对硬编码的密码进行哈希处理,或者我必须将其作为哈希插入?或者有没有办法只转换那个特定的字段/单元格而不必更改值列的其余设计,这样它也不会影响其他值?或者我应该为密码创建一个完全独立的列并将其设置为二进制?

编辑:我必须在此电子邮件功能调用中传递密码进行身份验证:

Send-EMail -EmailFrom $From_Email -SendTo $To_Email -Body $Email_Body -Subject $Job_Success_Email_Subject -Username $SmtpUser -Password $SmtpPassword
Run Code Online (Sandbox Code Playgroud)

但Von在评论中表示我不能将哈希密码作为凭证传递.那意味着我必须在表格中保持不受影响?我认为哈希在这种情况下会完美地工作......

Ale*_*lex 5

您似乎对上述评论中不相关的讨论感到困惑.

首先:散列密码在你的Send-EMail函数中不起作用,因为函数没有办法"unhashing"所说的密码.阅读Hashing vs Encryption的这篇介绍.

如果您想保护密码并能够检索原始值,则需要对其进行加密.加密的主题非常庞大,超出了可以用SO编写的范围.我将提供一些链接供您阅读:

http://www.manjuke.com/2018/03/data-encryption-in-sql-server-using-t.html https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/encrypt-a-column-of-data?view = sql-server-2017 https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/sql-server-and-数据库的加密密钥的数据库引擎?视图= SQL服务器-2017

通过密码加密将是最简单的实现,但也是最弱的,因为任何人读取SP的代码都会找到密码短语,因此可以解密数据.请注意,密码短语本身可以ENCRYPTBYPASSPHRASE作为参数传递,允许您(安全地)将其存储在数据库之外的其他位置,即您不必在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
Run Code Online (Sandbox Code Playgroud)

我使用您的原始HASHBYTES函数作为示例,但您需要将其更改为加密函数.

希望这能为您澄清一些事情.