VBMAN.Password - 密码处理对象
概述
VBMAN.Password 提供了密码哈希创建和验证功能,使用 MD5 等哈希算法,支持自定义盐值。
核心特性
- 密码哈希: 使用 MD5 算法生成密码哈希
- 盐值支持: 支持自定义盐值增强安全性
- 算法选择: 支持多种哈希算法(通过 Algorithm 属性)
- 编码选择: 支持不同字符编码
属性
| 属性 | 类型 | 说明 |
|---|---|---|
LastError | String | 最后错误信息(只读) |
Algorithm | CryptoHashAlgorithm | 哈希算法(默认 MD5) |
Salt | String | 盐值(默认空字符串) |
Encoding | CryptoStringEncoding | 字符编码(默认 UTF-8) |
方法
Create
创建密码哈希
vb
Public Function Create(ByVal Password As String, Optional ByRef Salt As Variant) As String参数:
Password- 明文密码Salt- 盐值(可选,默认使用 Salt 属性)
返回: 十六进制哈希字符串,失败返回空字符串
示例:
vb
' 基本使用
Dim hash As String
hash = VBMAN.Password.Create("mypassword")
Debug.Print hash ' MD5 哈希值
' 使用属性设置盐值
VBMAN.Password.Salt = "mysalt"
hash = VBMAN.Password.Create("mypassword")
' 通过参数传递盐值
hash = VBMAN.Password.Create("mypassword", "mysalt")Verify
验证密码
vb
Public Function Verify(ByVal Password As String, ByVal Hash As String) As Boolean参数:
Password- 明文密码Hash- 存储的哈希值
返回: True=验证通过, False=验证失败
示例:
vb
' 验证密码
Dim isValid As Boolean
isValid = VBMAN.Password.Verify("mypassword", storedHash)
If isValid Then
MsgBox "密码正确"
Else
MsgBox "密码错误: " & VBMAN.Password.LastError
End If综合示例
示例1: 用户注册(创建密码)
vb
Private Sub RegisterUser(username As String, password As String)
' 生成随机盐值(可选)
Dim salt As String
salt = VBMAN.ToolsStr.GetGUID() ' 使用 GUID 作为盐值
VBMAN.Password.Salt = salt
' 创建密码哈希
Dim passwordHash As String
passwordHash = VBMAN.Password.Create(password)
If passwordHash = "" Then
MsgBox "密码处理失败: " & VBMAN.Password.LastError
Exit Sub
End If
' 存储到数据库(同时存储哈希和盐值)
VBMAN.Db.Sql("INSERT INTO users (username, password_hash, salt) VALUES (?, ?, ?)"). _
Param("username", username). _
Param("password_hash", passwordHash). _
Param("salt", salt). _
ExecParam
MsgBox "注册成功!"
End Sub示例2: 用户登录(验证密码)
vb
Private Sub LoginUser(username As String, password As String)
' 查询用户信息
VBMAN.Db.Sql("SELECT * FROM users WHERE username=?").Param("username", username).FetchParam
If VBMAN.Db.Row.Count = 0 Then
MsgBox "用户不存在"
Exit Sub
End If
' 获取存储的哈希和盐值
Dim storedHash As String
Dim salt As String
storedHash = VBMAN.Db.Row("password_hash")
salt = VBMAN.Db.Row("salt")
' 设置盐值并验证
VBMAN.Password.Salt = salt
Dim isValid As Boolean
isValid = VBMAN.Password.Verify(password, storedHash)
If isValid Then
MsgBox "登录成功!"
' 执行登录后的操作...
Else
MsgBox "密码错误"
End If
End Sub示例3: 修改密码
vb
Private Sub ChangePassword(userId As Long, oldPassword As String, newPassword As String)
' 验证旧密码
VBMAN.Db.Sql("SELECT password_hash, salt FROM users WHERE id=?").Param("id", userId).FetchParam
VBMAN.Password.Salt = VBMAN.Db.Row("salt")
If Not VBMAN.Password.Verify(oldPassword, VBMAN.Db.Row("password_hash")) Then
MsgBox "原密码错误"
Exit Sub
End If
' 生成新盐值和新哈希
Dim newSalt As String
newSalt = VBMAN.ToolsStr.GetGUID()
VBMAN.Password.Salt = newSalt
Dim newHash As String
newHash = VBMAN.Password.Create(newPassword)
' 更新数据库
VBMAN.Db.Sql("UPDATE users SET password_hash=?, salt=? WHERE id=?"). _
Param("password_hash", newHash). _
Param("salt", newSalt). _
Param("id", userId). _
ExecParam
MsgBox "密码修改成功!"
End Sub最佳实践
- 使用盐值: 始终使用盐值增强安全性,每个用户使用不同的盐值
- 存储盐值: 盐值需要与哈希一起存储,用于验证时
- 密码复杂度: 建议在前端验证密码复杂度(长度、字符类型等)
- 算法选择: 根据安全需求选择合适的哈希算法
- 错误处理: 检查 LastError 获取详细的错误信息
注意事项
- 默认使用 MD5 算法,如有更高安全需求可更换其他算法
- 盐值是重要的安全措施,不要固定使用同一个盐值
- 密码哈希是单向的,无法从哈希还原原始密码