1

我有 table [user],在 SQL Server Management Studio 中创建,具有以下结构:

id int PRIMARY NOT NULL  
login varchar(255) NOT NULL  
password varchar(32) NOT NULL  

现在,我想将第一个用户插入数据库。右键单击表格[user],选择Edit top 200 rows并在网格中输入新的用户值:

id    | login    | password
1     | admin    | MD5('admin') 

但保存后,插入的密码是MD5('admin'),但我希望21232f297a57a5a743894a0e4a801fc3哈希。

如何在 Microsoft SQL Server Management Studio 中做到这一点?

谢谢

PS 我正在使用 SQL Server 2008 Express 10.50.1600.1 和 Microsoft SQL Server Management Studio 10.50.1600.1。

4

3 回答 3

3
  1. 哈希值是字节数组,而不是字符串。使用 VARBINARY 列类型。
  2. 不要插入未加盐密码的 MD5。反向破解在线哈希到密码需要2.96 秒。使用正确加盐的密码并将加盐写在表中。
  3. Right click to table [user], choose Edit top 200 rows and type new user values into the grid. 好吧,你期待什么?表格编辑是输入值的功能,如果您输入字符串MD5('admin'),那么表格中的值将是MD5('admin')...。它不是一个交互式函数评估器(除了 MD5 不是 SQL Server 函数......)

不要重新发明轮子,特别是如果你不会说流利的加密货币,就不要重新发明安全轮子。大多数框架都有成员管理模块。例如。会员介绍

于 2013-04-05T12:38:56.927 回答
2

您不能在网格表中运行查询,您必须运行查询才能进行更新。要计算 MD5,您可以使用:

CONVERT(VARCHAR(32), HashBytes('MD5', 'admin'), 2)
于 2013-04-05T12:40:22.520 回答
1

Edit Top 200 Rows功能用于交互式数据输入,其中只接受值,而不是需要在存储之前评估的表达式。

如果您希望插入的实际值是表达式的结果,请使用查询窗口来插入数据。(我不知道您是否Edit只是因为您想尝试该功能或出于其他原因而使用该功能,但如果那是因为您不知道如何使用 SQL 插入数据,请查看此手册。)

此外,正如@Damien 正确指出的那样,Transact-SQL 中没有任何MD5功能。有一种叫做HASHBYTES,它可以使用各种散列算法,包括 MD5。但是这个函数的结果是varbinary,不是varchar。具体来说,对于 MD5,它是varbinary(16). 因此,要存储 的直接结果HASHBYTES,您需要相应地更改password列的类型。

因此,更改列的类型,然后打开一个新的查询窗口并输入命令(或语句)来插入数据。应该为您完成这项工作的那个可能看起来像这样:

INSERT INTO user (id, login, password)
VALUES (1, 'admin', HASHBYTES('MD5', 'admin'));

公平地说,您可以省略更改列类型,在这种情况下,您需要将HASHBYTES上面的简单调用替换为@Garath 的答案中的调用。不过,您是否真的需要将散列存储为 invarchar(32)而不是varbinary(16)完全不同的问题。

于 2013-04-05T13:32:51.153 回答