【问题标题】:SQL Server Management Studio: How to edit MD5 valueSQL Server Management Studio:如何编辑 MD5 值
【发布时间】:2013-03-27 20:51:11
【问题描述】:

我有表[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 中做到这一点?

谢谢

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

【问题讨论】:

  • MD5 不是内置函数。有HASHBYTES,但它返回varbinary,而不是varchar,而且你不能通过编辑网格编辑varbinary

标签: sql-server sql-server-2008 hash md5 sql-server-2008-express


【解决方案1】:
  1. 散列值是字节数组,而不是字符串。使用 VARBINARY 列类型。
  2. 请勿插入未加盐密码的 MD5。它takes 2.96 seconds to reverse crack online the hash to the password。使用正确加盐的密码并将加盐写在表中。
  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.

【讨论】:

    【解决方案2】:

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

    CONVERT(VARCHAR(32), HashBytes('MD5', 'admin'), 2)
    

    【讨论】:

      【解决方案3】:

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

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

      另外,作为@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) 是一个完全不同的问题。

      【讨论】:

        猜你喜欢
        • 2011-02-12
        • 2010-12-04
        • 1970-01-01
        • 2021-01-18
        • 2020-04-05
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 2010-09-08
        相关资源
        最近更新 更多