sql-server - 如何散列已经存在的密码?

标签 sql-server powershell

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

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

变量 |值(value)

密码 | 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

但冯在评论中说我无法将其中的散列密码作为凭据传递。那么这意味着我必须在表中保持非散列?我认为散列在这种情况下会很好地工作......

最佳答案

看起来您对上面评论中不相关的讨论感到困惑。

首先:散列密码在您的 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 代码中硬编码。如果您决定采用这种方式,您将需要自己实现密码存储方法。

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

至于在 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函数作为示例,但您需要将其更改为加密函数。

希望这可以为您澄清事情。

关于sql-server - 如何散列已经存在的密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52437625/

相关文章:

powershell - 将文本添加到列表输出

c# - PowerShell 命令通过代码添加 EF 迁移

powershell - InstallShield Automation 无法创建对象

powershell - 英语非美国文化问题

sql-server - 更改影响 SQL Server 连接的协议(protocol)

windows - 使用 PowerShell 加载文件文件?

mysql - SqlServer 使用 MySql 创建表,如 auto_increment 主键

c++ - ODBC 连接未打开

sql - 如何在Sql Server GROUP BY格式的日期中按日期排序?

sql-server - 当MSSQL表中某列的值达到最大值时会发生什么以及解决办法?