Skip to content

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 Enum

CryptoStringEncoding

字符串编码枚举

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 sha256Result

ComputeHashBytesToHex

计算字节数组的哈希值(返回十六进制字符串)

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 hash

ComputeHashBytes

计算字节数组的哈希值(返回原始字节数组)

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  ' C518F98015A0E6A6B3EA15C5C7F4A8E2

ReturnBase64

返回 Base64 格式的哈希值(链式调用)

vb
Public Function ReturnBase64() As String

示例:

vb
Dim base64Hash As String
base64Hash = VBMAN.Hash.Mode(HASH_ALG_SHA256).DataString("Hello").ReturnBase64()
Debug.Print base64Hash

ReturnBytes

返回字节数组格式的哈希值(链式调用)

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

最佳实践

  1. UTF8 中文支持: 处理中文字符串时,默认使用 UTF8 编码,确保跨平台一致性
  2. 算法选择:
    • MD5: 速度快,但安全性较低,适合非安全场景(如缓存键、简单校验)
    • SHA1: 安全性较 MD5 高,但也不推荐用于安全场景
    • SHA256/SHA384/SHA512: 安全性高,推荐用于密码、数字签名等安全场景
  3. 链式调用: 推荐使用链式调用方式,代码更清晰
  4. 盐值使用: 密码哈希务必添加随机盐值,防止彩虹表攻击
  5. 文件哈希: 大文件计算时注意内存使用,类库会自动分块处理

常见 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)
MD532 字符16 字节
SHA140 字符20 字节
SHA25664 字符32 字节
SHA38496 字符48 字节
SHA512128 字符64 字节

VB6及其LOGO版权为微软公司所有