我在SQL Server Management Studio中创建了具有以下结构的表[user]
:
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中执行此操作?
谢谢
P.S。我使用的是SQL Server 2008 Express 10.50.1600.1和Microsoft SQL Server Management Studio 10.50.1600.1。
答案 0 :(得分: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功能......)不要重新发明轮子,特别是如果你不说流畅的加密,不要重新发明安全轮。大多数框架都有会员管理模块。例如。 Introduction to Membership
答案 1 :(得分:2)
您无法在网格表中运行查询,您必须运行查询才能执行更新。要计算MD5,您可以使用:
CONVERT(VARCHAR(32), HashBytes('MD5', 'admin'), 2)
答案 2 :(得分:1)
Edit Top 200 Rows
功能用于交互式数据输入,其中只接受值,而不是在存储之前需要评估的表达式。
如果要将插入的实际值作为表达式的结果,请使用查询窗口插入数据。 (我不知道您是否仅仅因为想要尝试该功能或其他原因而使用Edit
功能,但如果这是因为您不知道如何使用SQL插入数据,请查看在this manual。)
此外,作为@Damien has correctly noted,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's answer之类的调用。不管你是否真的需要将哈希值存储为varchar(32)
而不是varbinary(16)
,这是一个完全不同的问题。