在SQL Server中保存字节数组

34

我想使用一种需要使用字节数组保存密码的方法,就像这个帖子中所述。

那么在SQL Server中应该使用哪种数据类型来保存字节数组?并且如何使用SqlCommand传递和检索字节数组?

3个回答

36
如果它的长度总是相同的话,那么使用binary(length)是合适的。如果它的长度将会变化,使用varbinary(maxlength)
参考binary和varbinary
而且,正如@p.s.w.g所说,你可以将其放入适当的参数中从代码传递它。

谢谢你的回答!真的帮了我很多。一开始我有点困惑,认为需要强调 varbinary(maxlength) 不是指 varbinary(max)。'maxlength' 指的是哈希密码的最大可能长度。 - Saul Muñoz Garcia

6

只需要像使用其他参数一样使用 byte[],将 SqlDbType.Binary 指定为参数类型即可。以下为 C# 示例:

// Generate your password hash some way
byte[] passwordHash = new byte[] { 0x0, 0x1, 0x2 ... };

...

command.Parameters.Add("@passwordHash", SqlDbType.Binary);
command.Parameters["@passwordHash"].Value = passwordHash;

或者如果您更喜欢 VB.NET

' Generate your password hash some way
Dim passwordHash As Byte() = New Byte() { &H0, &H1, &H2 ... }

...

command.Parameters.Add("@passwordHash", SqlDbType.Binary)
command.Parameters("@passwordHash").Value = passwordHash

使用二进制 SQL 数据类型是否可行?我在谷歌上搜索到一些人说它适用于像图片这样的大型二进制文件,你同意吗? - Akkad
@user2155873 对于文件大小较大或长度不固定的文件,请使用VARBINARY(MAX)。对于密码哈希,请使用BINARY(32)(或者您的哈希值有多长就用多长)。 - p.s.w.g
1
@user2155873 - 鉴于您可以声明一个 binary(5),它分配了 5 个字节的存储空间,您会说这只适用于存储大文件吗? - Damien_The_Unbeliever

0

我建议使用nvarchar(45),并将您的32个字节转换为Base64字符串。这是保存哈希的标准方法。

或者,您可以使用nvarchar(64)并将其存储为十六进制字符串。


2
我已经阅读了有关此主题的Microsoft文档,从未看到将哈希转换为Base64的建议。无论如何,为什么不将哈希保存为字节数组呢? - Tiago Freitas Leal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接