VBMAN.Hash - 哈希计算对象
概述
VBMAN.Hash 提供了基于 Windows CryptoAPI 的哈希计算功能,支持 MD5、SHA1、SHA256、SHA384、SHA512 等多种哈希算法。支持字符串、字节数组和文件的哈希计算,输出格式支持十六进制字符串、Base64 和原始字节数组。
核心特性
- 多种算法: 支持 MD5、SHA1、SHA256、SHA384、SHA512
- 多格式输入: 支持字符串、字节数组、文件
- UTF8 支持: 完美支持 UTF8 编码的中文字符串
- 链式调用: 流畅的 API 设计
- 灵活输出: 支持 Hex、Base64、字节数组等多种输出格式
枚举
CryptoHashAlgorithm
哈希算法枚举
vb
Public Enum CryptoHashAlgorithm
HASH_ALG_DEFAULT = 0 ' 使用类属性默认算法 (SHA256)
HASH_ALG_MD5 = 32771 ' MD5 算法 (128位)
HASH_ALG_SHA1 = 32772 ' SHA1 算法 (160位)
HASH_ALG_SHA256 = 32780 ' SHA256 算法 (256位)
HASH_ALG_SHA384 = 32781 ' SHA384 算法 (384位)
HASH_ALG_SHA512 = 32782 ' SHA512 算法 (512位)
End EnumCryptoStringEncoding
字符串编码枚举
vb
Public Enum CryptoStringEncoding
ENCODING_ANSI = 0 ' ANSI 编码
ENCODING_UTF8 = 1 ' UTF8 编码(默认)
End Enum传统调用方法
ComputeHash
计算字符串的哈希值(返回十六进制字符串)
vb
Public Function ComputeHash(ByVal Text As String, _
Optional ByVal Algorithm As CryptoHashAlgorithm, _
Optional ByVal Encoding As CryptoStringEncoding = ENCODING_UTF8) As String参数:
Text- 要哈希的文本字符串Algorithm- 可选参数,哈希算法,默认使用类属性值 (SHA256)Encoding- 可选参数,字符串编码,默认 UTF8
返回: 十六进制格式的哈希字符串
示例:
vb
' MD5 计算(默认 UTF8 编码)
Dim md5Result As String
md5Result = VBMAN.Hash.ComputeHash("邓伟", HASH_ALG_MD5)
Debug.Print md5Result ' 输出: c518f98015a0e6a6b3ea15c5c7f4a8e2
' MD5 计算(ANSI 编码)
md5Result = VBMAN.Hash.ComputeHash("邓伟", HASH_ALG_MD5, ENCODING_ANSI)
Debug.Print md5Result
' SHA256 计算
Dim sha256Result As String
sha256Result = VBMAN.Hash.ComputeHash("Hello World", HASH_ALG_SHA256)
Debug.Print sha256ResultComputeHashBytesToHex
计算字节数组的哈希值(返回十六进制字符串)
vb
Public Function ComputeHashBytesToHex(ByRef Data() As Byte, _
Optional ByVal Algorithm As CryptoHashAlgorithm) As String示例:
vb
Dim bytes() As Byte
bytes = VBMAN.ToolsUtf8.Encode("Hello")
Dim hash As String
hash = VBMAN.Hash.ComputeHashBytesToHex(bytes, HASH_ALG_MD5)
Debug.Print hashComputeHashBytes
计算字节数组的哈希值(返回原始字节数组)
vb
Public Function ComputeHashBytes(ByRef Data() As Byte, _
Optional ByVal Algorithm As CryptoHashAlgorithm) As Byte()示例:
vb
Dim bytes() As Byte
bytes = VBMAN.ToolsUtf8.Encode("Hello")
Dim hashBytes() As Byte
hashBytes = VBMAN.Hash.ComputeHashBytes(bytes, HASH_ALG_SHA256)ComputeFileHash
计算文件的哈希值(返回十六进制字符串)
vb
Public Function ComputeFileHash(ByVal FilePath As String, _
Optional ByVal Algorithm As CryptoHashAlgorithm) As String说明: 直接二进制读取文件内容计算哈希,不进行字符编码处理
示例:
vb
' 计算文件 MD5
Dim fileMd5 As String
fileMd5 = VBMAN.Hash.ComputeFileHash("C:\\file.txt", HASH_ALG_MD5)
Debug.Print fileMd5
' 计算文件 SHA256
Dim fileSha256 As String
fileSha256 = VBMAN.Hash.ComputeFileHash("C:\\file.txt", HASH_ALG_SHA256)
Debug.Print fileSha256链式调用方法(推荐)
Mode
设置哈希算法(链式调用入口,可选)
vb
Public Function Mode(ByVal Algorithm As CryptoHashAlgorithm) As cCryptoHash说明: 如果不调用此方法,默认使用 HASH_ALG_SHA256
示例:
vb
' 设置算法为 MD5
VBMAN.Hash.Mode(HASH_ALG_MD5).DataString("hello").ReturnHex()DataString
输入字符串数据(链式调用)
vb
Public Function DataString(ByVal Text As String, _
Optional ByVal Encoding As CryptoStringEncoding = ENCODING_UTF8) As cCryptoHash示例:
vb
' 输入 UTF8 字符串
VBMAN.Hash.DataString("你好世界", ENCODING_UTF8).ReturnHex()
' 输入 ANSI 字符串
VBMAN.Hash.DataString("Hello", ENCODING_ANSI).ReturnHex()DataBytes
输入字节数组数据(链式调用)
vb
Public Function DataBytes(ByRef Data() As Byte) As cCryptoHash示例:
vb
Dim bytes() As Byte
bytes = VBMAN.ToolsUtf8.Encode("Hello")
VBMAN.Hash.Mode(HASH_ALG_MD5).DataBytes(bytes).ReturnHex()结果返回方法
ReturnHex
返回十六进制格式的哈希值(链式调用)
vb
Public Function ReturnHex(Optional ByVal UpperCase As Boolean = False) As String参数:
UpperCase- 可选参数,是否使用大写字母,默认 False(小写)
示例:
vb
' 返回小写 MD5
Dim md5 As String
md5 = VBMAN.Hash.Mode(HASH_ALG_MD5).DataString("邓伟").ReturnHex()
Debug.Print md5 ' c518f98015a0e6a6b3ea15c5c7f4a8e2
' 返回大写 MD5
Dim md5Upper As String
md5Upper = VBMAN.Hash.Mode(HASH_ALG_MD5).DataString("邓伟").ReturnHex(True)
Debug.Print md5Upper ' C518F98015A0E6A6B3EA15C5C7F4A8E2ReturnBase64
返回 Base64 格式的哈希值(链式调用)
vb
Public Function ReturnBase64() As String示例:
vb
Dim base64Hash As String
base64Hash = VBMAN.Hash.Mode(HASH_ALG_SHA256).DataString("Hello").ReturnBase64()
Debug.Print base64HashReturnBytes
返回字节数组格式的哈希值(链式调用)
vb
Public Function ReturnBytes() As Byte()示例:
vb
Dim hashBytes() As Byte
hashBytes = VBMAN.Hash.Mode(HASH_ALG_MD5).DataString("Hello").ReturnBytes()
' 遍历字节数组
Dim i As Integer
For i = LBound(hashBytes) To UBound(hashBytes)
Debug.Print Hex(hashBytes(i));
Next综合示例
示例1: MD5 哈希计算(UTF8 中文支持)
vb
Private Sub MD5Example()
' 基础用法 - 计算 UTF8 字符串的 MD5
Dim result As String
' 中文姓名 MD5 计算
result = VBMAN.Hash("邓伟").Mode(HASH_ALG_MD5).ReturnHex()
Debug.Print "邓伟 的 MD5: " & result
' 输出: c518f98015a0e6a6b3ea15c5c7f4a8e2
' 其他方式实现相同结果
result = VBMAN.Hash.Mode(HASH_ALG_MD5).DataString("邓伟").ReturnHex()
Debug.Print result
' 使用传统方法
result = VBMAN.Hash.ComputeHash("邓伟", HASH_ALG_MD5)
Debug.Print result
End Sub示例2: 多种算法对比
vb
Private Sub CompareAlgorithms()
Dim text As String
text = "Hello World"
Debug.Print "原文: " & text
Debug.Print "MD5: " & VBMAN.Hash.Mode(HASH_ALG_MD5).DataString(text).ReturnHex()
Debug.Print "SHA1: " & VBMAN.Hash.Mode(HASH_ALG_SHA1).DataString(text).ReturnHex()
Debug.Print "SHA256: " & VBMAN.Hash.Mode(HASH_ALG_SHA256).DataString(text).ReturnHex()
Debug.Print "SHA384: " & VBMAN.Hash.Mode(HASH_ALG_SHA384).DataString(text).ReturnHex()
Debug.Print "SHA512: " & VBMAN.Hash.Mode(HASH_ALG_SHA512).DataString(text).ReturnHex()
End Sub示例3: 密码哈希存储
vb
Private Function HashPassword(password As String, salt As String) As String
' 组合密码和盐值
Dim saltedPassword As String
saltedPassword = password & salt
' 使用 SHA256 计算哈希
Dim hash As String
hash = VBMAN.Hash.Mode(HASH_ALG_SHA256).DataString(saltedPassword).ReturnHex()
HashPassword = hash
End Function
Private Sub TestPasswordHash()
Dim password As String
Dim salt As String
Dim hashed As String
password = "MySecretPassword"
salt = "random_salt_123"
hashed = HashPassword(password, salt)
Debug.Print "密码哈希: " & hashed
End Sub示例4: 文件完整性校验
vb
Private Function CalculateFileMD5(filePath As String) As String
On Error GoTo ErrorHandler
' 计算文件 MD5
Dim md5 As String
md5 = VBMAN.Hash.ComputeFileHash(filePath, HASH_ALG_MD5)
CalculateFileMD5 = md5
Exit Function
ErrorHandler:
CalculateFileMD5 = ""
End Function
Private Sub VerifyFileIntegrity()
Dim filePath As String
Dim expectedMD5 As String
Dim actualMD5 As String
filePath = "C:\\important\\document.pdf"
expectedMD5 = "a1b2c3d4e5f6..."
actualMD5 = CalculateFileMD5(filePath)
If LCase(actualMD5) = LCase(expectedMD5) Then
Debug.Print "文件校验通过"
Else
Debug.Print "文件校验失败,可能被篡改"
End If
End Sub示例5: 批量哈希计算
vb
Private Sub BatchHashCalculation()
Dim items As Variant
items = Array("张三", "李四", "王五", "邓伟")
Dim i As Integer
For i = LBound(items) To UBound(items)
Dim name As String
name = items(i)
' 计算 MD5
Dim md5 As String
md5 = VBMAN.Hash.Mode(HASH_ALG_MD5).DataString(name).ReturnHex()
' 计算 SHA256
Dim sha256 As String
sha256 = VBMAN.Hash.Mode(HASH_ALG_SHA256).DataString(name).ReturnHex()
Debug.Print "姓名: " & name
Debug.Print " MD5: " & md5
Debug.Print " SHA256: " & sha256
Next i
End Sub示例6: 数据签名前处理
vb
Private Function PrepareDataForSignature(data As String, timestamp As String) As String
' 组合数据和 timestamp
Dim payload As String
payload = data & "|" & timestamp
' 使用 SHA256 计算哈希
Dim hash As String
hash = VBMAN.Hash.Mode(HASH_ALG_SHA256).DataString(payload).ReturnHex(True)
PrepareDataForSignature = hash
End Function
Private Sub TestDataSignature()
Dim data As String
Dim timestamp As String
Dim signature As String
data = "order_id=12345&amount=100.00"
timestamp = CStr(Now())
signature = PrepareDataForSignature(data, timestamp)
Debug.Print "数据签名: " & signature
End Sub最佳实践
- UTF8 中文支持: 处理中文字符串时,默认使用 UTF8 编码,确保跨平台一致性
- 算法选择:
- MD5: 速度快,但安全性较低,适合非安全场景(如缓存键、简单校验)
- SHA1: 安全性较 MD5 高,但也不推荐用于安全场景
- SHA256/SHA384/SHA512: 安全性高,推荐用于密码、数字签名等安全场景
- 链式调用: 推荐使用链式调用方式,代码更清晰
- 盐值使用: 密码哈希务必添加随机盐值,防止彩虹表攻击
- 文件哈希: 大文件计算时注意内存使用,类库会自动分块处理
常见 MD5 参考值
vb
' 空字符串 MD5
Debug.Print VBMAN.Hash.Mode(HASH_ALG_MD5).DataString("").ReturnHex()
' 结果: d41d8cd98f00b204e9800998ecf8427e
' "123456" MD5
Debug.Print VBMAN.Hash.Mode(HASH_ALG_MD5).DataString("123456").ReturnHex()
' 结果: e10adc3949ba59abbe56e057f20f883e
' 中文 "你好" MD5
Debug.Print VBMAN.Hash.Mode(HASH_ALG_MD5).DataString("你好").ReturnHex()
' 结果: 7eca689f0d3389d9dea66ae112e5cfd7算法输出长度
| 算法 | 输出长度 (Hex) | 输出长度 (Bytes) |
|---|---|---|
| MD5 | 32 字符 | 16 字节 |
| SHA1 | 40 字符 | 20 字节 |
| SHA256 | 64 字符 | 32 字节 |
| SHA384 | 96 字符 | 48 字节 |
| SHA512 | 128 字符 | 64 字节 |