在测试并确保我的Send_email函数使用SQL表中的硬编码用户名和密码成功进行身份验证之后,我现在尝试哈希密码。
我的列的设置方式如下:
密码| someP @ ssword
这两个列都是varchar,其value列的长度为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
但是冯(Von)在评论中说,我无法在其中传递哈希密码作为凭据。那么那意味着我必须保持它在桌子上不被打散?我认为哈希在这种情况下会很好地工作...
答案 0 :(得分:6)
您似乎对以上评论中不相关的讨论感到困惑。
首先:您的Send-EMail
函数中无法使用散列密码,因为该函数无法“散列”所述密码。阅读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-database-encryption-keys-database-engine?view=sql-server-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
我以您原来的HASHBYTES
函数为例,但是您需要将其更改为加密函数。
希望这可以为您澄清一切。