Skip to content

VBMAN.Password - 密码处理对象

概述

VBMAN.Password 提供了密码哈希创建和验证功能,使用 MD5 等哈希算法,支持自定义盐值。

核心特性

  • 密码哈希: 使用 MD5 算法生成密码哈希
  • 盐值支持: 支持自定义盐值增强安全性
  • 算法选择: 支持多种哈希算法(通过 Algorithm 属性)
  • 编码选择: 支持不同字符编码

属性

属性类型说明
LastErrorString最后错误信息(只读)
AlgorithmCryptoHashAlgorithm哈希算法(默认 MD5)
SaltString盐值(默认空字符串)
EncodingCryptoStringEncoding字符编码(默认 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

最佳实践

  1. 使用盐值: 始终使用盐值增强安全性,每个用户使用不同的盐值
  2. 存储盐值: 盐值需要与哈希一起存储,用于验证时
  3. 密码复杂度: 建议在前端验证密码复杂度(长度、字符类型等)
  4. 算法选择: 根据安全需求选择合适的哈希算法
  5. 错误处理: 检查 LastError 获取详细的错误信息

注意事项

  • 默认使用 MD5 算法,如有更高安全需求可更换其他算法
  • 盐值是重要的安全措施,不要固定使用同一个盐值
  • 密码哈希是单向的,无法从哈希还原原始密码

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