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 - 如何将散列密码插入表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel 5.8 将散列密码存储到数据库中

如何使用 Apache Shiro 将散列密码存储到数据库中?

如何使 Vue.js 将散列密码发布到 Django REST API AbstractBaseUser 自定义模型?

使用 bcryptjs 将散列密码保存到数据库时出错

Ruby:如何将散列转换为 HTTP 参数?

如何将散列数组添加到 csv 文件中?