SQL Server - 如何将散列密码插入表?
Posted
技术标签:
【中文标题】SQL Server - 如何将散列密码插入表?【英文标题】:SQL Server - How to insert a hashed password to a table? 【发布时间】:2021-10-03 04:23:13 【问题描述】:抱歉我的无知,但我想在我的数据库中存储散列密码,
如何使用HASHBYTES
方法将哈希密码存储在Users
表中?
CREATE TABLE [Users](
EmailAddress NVARCHAR(320) UNIQUE,
UserID INT IDENTITY(1,1) PRIMARY KEY,
UserPassword NVARCHAR(32), -- I Edited the length
FirstName VARCHAR(256) not null,
LastName VARCHAR(256) not null,
MobileNumber BIGINT,
)
--我查了一下,发现这是哈希密码的方法
declare @afterhash varbinary(256) = HASHBYTES('SHA2_256', 'P@ssw0rd')
但是如何将它们结合起来呢?
【问题讨论】:
我并没有真正关注。除此之外,您已将UserPassword
定义为varchar(16)
,因此varbinary(8000)
永远不适合,您在这里挣扎什么?
@Larnu 再次嗨,我正在为如何在第一次插入时对密码进行哈希处理而苦苦挣扎,它是否应该在从客户端传递用户数据时调用的单独函数中?我的意思是如果我在这里执行INSERT INTO
声明会怎样?
只需将HASHBYTES
作为INSERT
的一部分包含在参数化语句中即可。同样,我不明白这里的问题是什么,除了 UserPassword
列不适合目的(因为它太小)
除了以前的cmets,UserPassword VARCHAR(8000)
是用来存储字符的。 HASHBYTES
返回varbinary
数据,其长度取决于选择的散列函数。例如:SHA2_256
返回 varbinary(32)
,因为 256 位是 32 个字节。
... 在文档中,存储的是 unhashed 值,@ExtraSun,而不是散列值。而且它不是文档中的密码,只是一个要散列的值。
【参考方案1】:
如前所述,我不明白这里的问题。只需在参数化的INSERT
中使用HASHBYTES
:
INSERT INTO dbo.Users (EmailAddress, UserPassword, FirstName, LastName, MobileNumber)
VALUES(@EmailAddress, HASHBYTES('SHA2_256',@Password), @FirstName, @LastName, @MobileNumber);
旁注:正如我在其他answer 中提到的,bigint
不是电话号码的正确选择。电话号码可以以0
开头并包含其他数字字符。 '01234567890'
之类的值将更改为1234567890
,'+441234567890'
之类的数字将更改为441234567890
,'(01234) 567890'
之类的数字将完全无法INSERT
【讨论】:
添加密码哈希应该是salted 作为一般的安全最佳实践。 谢谢@DanGuzman,但我不明白为什么Cast(@Password As varbinary(100)
需要额外的复杂性,Cast('|' As binary(1))
有什么用?在您附加的链接中。
@ExtraSun,salt 的目的是提供额外的防御,因为即使对于相同的密码(假设是随机盐),哈希也会不同。额外的复杂性很小。
谢谢,@DanGuzman 提供信用卡号 我读到通常使用ENCRYPTBYPASSPHRASE
,你认为我应该使用它吗? (它不是真实的网站,只是为了练习)
@ExtraSun 请提出一个新问题,确保它是Stack Overflow 的主题。 cmets 不适合这样的讨论。【参考方案2】:
声明@Users 表(passwordColumn NVARCHAR(32));
插入@Users 值 (HASHBYTES('SHA2_256','Password@1234.'));
从@Users 中选择 HASHBYTES('SHA2_256', passwordColumn);
【讨论】:
以上是关于SQL Server - 如何将散列密码插入表?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Apache Shiro 将散列密码存储到数据库中?