Tools - 密码工具类
cPassword - 密码哈希工具
概述
提供密码的哈希生成和验证功能,支持 MD5、SHA1、SHA256 等算法,支持自定义盐值。
依赖
cCryptoHash(src/Crypt/Hash)
属性
| 属性 | 类型 | 说明 |
|---|---|---|
Algorithm | CryptoHashAlgorithm | 哈希算法(默认 MD5) |
Salt | String | 盐值(默认空) |
Encoding | CryptoStringEncoding | 字符串编码(默认 UTF8) |
LastError | String | 最后一次错误信息(只读) |
枚举值
CryptoHashAlgorithm
vb
HASH_ALG_MD5 = 0
HASH_ALG_SHA1 = 1
HASH_ALG_SHA256 = 2方法
Create
创建密码哈希。
vb
Public Function Create( _
ByVal Password As String, _
Optional ByRef Salt As Variant _
) As String参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
Password | String | 明文密码 |
Salt | Variant | 可选,盐值(不传则使用属性中的 Salt) |
返回值:
返回十六进制格式的哈希字符串。
示例:
vb
Dim Pwd As New cPassword
' 使用默认 MD5
Dim Hash1 As String
Hash1 = Pwd.Create("myPassword")
Debug.Print Hash1 ' 输出: 34819d7beeabb9260a5c854bc85b3e44
' 使用 SHA256
Pwd.Algorithm = HASH_ALG_SHA256
Dim Hash2 As String
Hash2 = Pwd.Create("myPassword")
Debug.Print Hash2
' 使用随机盐值
Dim Salt As String
Salt = VBMAN.CryptoRandom.GetString(16) ' 生成16位随机盐
Pwd.Salt = Salt
Dim Hash3 As String
Hash3 = Pwd.Create("myPassword")Verify
验证密码是否匹配。
vb
Public Function Verify( _
ByVal Password As String, _
ByVal Hash As String, _
Optional ByRef Salt As Variant _
) As Boolean参数:
| 参数名 | 类型 | 说明 |
|---|---|---|
Password | String | 明文密码 |
Hash | String | 存储的哈希值 |
Salt | Variant | 可选,盐值 |
返回值:
True- 密码匹配False- 密码不匹配
示例:
vb
Dim Pwd As New cPassword
Pwd.Salt = "mysalt"
' 创建哈希
Dim StoredHash As String
StoredHash = Pwd.Create("myPassword")
' 验证密码
If Pwd.Verify("myPassword", StoredHash) Then
Debug.Print "密码正确"
Else
Debug.Print "密码错误"
End If完整示例
vb
Private Sub TestPassword()
Dim Pwd As New cPassword
' 配置
Pwd.Algorithm = HASH_ALG_SHA256
Pwd.Salt = "AppSpecificSalt"
Pwd.Encoding = ENCODING_UTF8
' 用户注册时存储哈希
Dim UserHash As String
UserHash = Pwd.Create(txtPassword.Text)
SaveToDatabase txtUserName.Text, UserHash
' 用户登录时验证
Dim StoredHash As String
StoredHash = GetHashFromDatabase(txtUserName.Text)
If Pwd.Verify(txtPassword.Text, StoredHash) Then
MsgBox "登录成功"
Else
MsgBox "密码错误"
End If
End Sub安全建议
- 使用强哈希算法 - 优先使用 SHA256
- 添加随机盐值 - 防止彩虹表攻击
- 盐值唯一性 - 每个用户应使用不同的盐值
- 盐值存储 - 盐值应与哈希一起存储