文件基本加密哈希并存储到 SQL Server






2.85/5 (4投票s)
一个基本的 VB.NET 示例,用于生成哈希值并使用 SQLClient 将其存储到 SQL Server 的二进制列中。
引言
我的许多项目都需要跟踪文件——我们何时看到它们,它们去向何处,以及它们在整个过程中发生了什么。 我们还需要知道在不同的名称和/或来自不同的来源下,何时拥有重复的内容。 对于这两个目标,以加密哈希的形式生成文件的摘要会有所帮助。(有关该概念的介绍,请参阅维基百科的 加密哈希函数 文章。) 跟踪和比较哈希值可以快速告诉我们是否以前见过文件的内容。
我在搜索 VB.NET 文件哈希处理的示例中看到,许多示例让我觉得不如下面“操作方法”部分中的示例那样实用。 最初,我遇到了一个问题,即以 Byte
数组的形式读取文件并传递该数组。
MyByteArray = MySHA.ComputeHash(My.Computer.FileSystem.ReadAllBytes(FileUNCPath))
这对于小文件来说效果很好,但对于大文件来说却会严重失败。 相比之下,使用流(如下所示)可以正常工作,即使对于 GB 级别的文件也是如此。
在创建哈希摘要后,大多数其他示例会将字节数组转换为字符串表示形式,然后将其发送到数据库表。 在许多实现中(例如,使用十六进制、Base64 等编码),这将增加摘要所需的存储空间。 而且,对于额外的空间,似乎获得的唯一好处是能够通过不使用参数的 SQL 语句发送数据。 在这里使用参数是值得的,因为发送和存储二进制值比使用字符串表示形式更有效。
操作指南
这些示例假定以下命名空间导入(并且您的项目导入“System
”,如默认 Windows 应用程序项目所用)
Imports System.IO
Imports System.Data.SqlClient
以下示例演示如何创建哈希值。 此示例使用 SHA256 算法的类。 可以通过轻微的修改来替换 System.Security.Cryptography
实现的另一种算法
' example filename
Dim MyFilePath As String = "c:\test\example.pdf"
' define a Byte Array to hold the result of the hashing algorithm
Dim MyByteArray As Byte()
' make an object for the implementation of the HashAlgorithm
Dim MySHA As New Security.Cryptography.SHA256Managed
' calculate the hash value and keep it for later
MyByteArray = MySHA.ComputeHash(File.OpenRead(MyFilePath))
以下示例演示如何存储哈希值(假设“db
”是一个打开的 SqlConnection
,并且 Files 表包含一个名为 HashVal
的列,其类型为 Binary
,长度为 32)。
Dim MyCmd As SqlCommand = db.CreateCommand
MyCmd.CommandText = "INSERT INTO dbo.Files (HashVal) VALUES (@HashVal);"
Dim SHAParameter As New SqlParameter( _
"@HashVal", Data.SqlDbType.Binary, 32, Data.ParameterDirection.Input)
SHAParameter.Value = MyByteArray
MyCmd.Parameters.Add(SHAParameter)
MyCmd.ExecuteNonQuery()
以下示例演示如何比较哈希值并根据其是否存在于表中返回计数
Dim MyCmd As SqlCommand = db.CreateCommand
MyCmd.CommandText = "SELECT COUNT(*) FROM dbo.Files WHERE HashVal=@HashVal;"
Dim SHAParameter As New SqlParameter( _
"@HashVal", Data.SqlDbType.Binary, 32, Data.ParameterDirection.Input)
SHAParameter.Value = MyByteArray
MyCmd.Parameters.Add(SHAParameter)
Dim MyCount As Int32 = MyCmd.ExecuteScalar
摘要
这些基本步骤可以作为利用加密哈希作为消息摘要,以跟踪和重复检查文件,并与 SQL Server 协调的基础构建块。