65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.85/5 (4投票s)

2006年10月6日

CPOL

2分钟阅读

viewsIcon

19423

一个基本的 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 协调的基础构建块。

© . All rights reserved.