c# - 在 C# 和 SQL Server 2008 R2 中使用 MD5

标签 c# sql-server hash sql-server-2008-r2 md5

我以前使用 MD5 以编程方式对密码进行哈希处理,但是当我比较 C# 中创建的 MD5 哈希值和 SQL Server 创建的 MD5 哈希值 ( HASHBYTES('MD5', 'admin') ) 时,结果并不相同。

为什么它们不一样?如何解决这个问题?

另外我应该如何在sql server 2008 R2中存储MD5。使用 varbinary(max)binary(16)

最佳答案

除了 Reza M.A 的答案之外,您应该使用 HASHBYTES() 获得良好的结果。但是,字节顺序可能是问题。在 SQL Server 2005+ 中,通过进行一些转换并使用内置的 REVERSE() 可以轻松反转字节顺序。

DECLARE 
    @test varchar(MAX),
    @vbTest varbinary(MAX)

SET @test = 'admin'
SET @vbTest = CONVERT(varbinary(max), @test, 0)

SELECT 
    HASHBYTES('MD5', @vbTest),
    CAST(
        REVERSE(
            CAST(
                HASHBYTES('MD5', @vbTest) 
            AS varchar(max))
        ) 
    AS varbinary(max))

我相信如果散列输出是从 HASHBYTES() 输出的,则应该将其存储为 varbinary(max)。否则,将其存储为原始值类型 - 如果它是二进制(16),则使用它。

关于c# - 在 C# 和 SQL Server 2008 R2 中使用 MD5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18031480/

相关文章:

c# - 能够在用户尝试关闭 Windows 窗体而不保存时通知用户请求 'Save Changes'

c# - long vs Guid for the Id (Entity),优缺点是什么

c# - 使用语句似乎没有处理我的对象

SQL Server : SELECT when 2 values exist in rows

hash - 为什么在使用 decl_storage 时 `blake2_256` 无法防止 StorageDoubleMap 中的 "first key pair"受到损害?

ruby - 检查一个散列是否包含另一个散列

c# - 在 C# 中将 HTML 电子邮件签名附加到纯文本电子邮件正文

c# - 生成订单号

sql-server - 当使用 WinSCP 选择要上传到 FTP 服务器的文件的掩码不匹配任何文件时,SSIS 任务失败

Ruby Hash 初始化(默认值 nil)