如何哈希一个已经存在的密码?

时间:2018-09-21 06:11:42

标签: sql-server powershell

在测试并确保我的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)在评论中说,我无法在其中传递哈希密码作为凭据。那么那意味着我必须保持它在桌子上不被打散?我认为哈希在这种情况下会很好地工作...

1 个答案:

答案 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函数为例,但是您需要将其更改为加密函数。

希望这可以为您澄清一切。