You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access前端连接SQL Server时如何加密表中密码并实现登录验证?

Access前端 + SQL Server后端 密码加密验证方案(SHA256+Salt)

一、SQL Server后端准备

1. 创建用户表

在SQL Server中创建存储用户信息的表,包含用户名、密码哈希值和随机盐:

CREATE TABLE dbo.Users (
    UserID INT IDENTITY(1,1) PRIMARY KEY,
    Username NVARCHAR(50) NOT NULL UNIQUE,
    PasswordHash VARBINARY(64) NOT NULL, -- SHA256哈希为32字节,VARBINARY(64)足够存储
    PasswordSalt VARBINARY(16) NOT NULL -- 16字节随机盐,提升哈希安全性
);

2. 创建密码哈希生成函数

用于注册新用户时,根据明文密码和随机盐生成哈希值:

CREATE FUNCTION dbo.GeneratePasswordHash(
    @Password NVARCHAR(100),
    @Salt VARBINARY(16)
)
RETURNS VARBINARY(64)
AS
BEGIN
    RETURN HASHBYTES('SHA2_256', CONCAT(@Password, CAST(@Salt AS NVARCHAR(32))));
END;

3. 创建登录验证存储过程

接收用户名和明文密码,自动获取对应盐值并生成哈希对比,返回验证结果:

CREATE PROCEDURE dbo.ValidateUserLogin
    @Username NVARCHAR(50),
    @Password NVARCHAR(100),
    @IsValid BIT OUTPUT
AS
BEGIN
    SET @IsValid = 0;
    
    DECLARE @StoredHash VARBINARY(64), @StoredSalt VARBINARY(16);
    SELECT @StoredHash = PasswordHash, @StoredSalt = PasswordSalt
    FROM dbo.Users
    WHERE Username = @Username;
    
    IF @StoredHash IS NOT NULL
    BEGIN
        IF @StoredHash = dbo.GeneratePasswordHash(@Password, @StoredSalt)
            SET @IsValid = 1;
    END;
END;

4. 注册新用户示例

添加新用户时,生成随机盐并计算哈希存入表中:

DECLARE @NewUsername NVARCHAR(50) = 'testuser';
DECLARE @NewPassword NVARCHAR(100) = 'testpass123';
DECLARE @NewSalt VARBINARY(16) = CRYPT_GEN_RANDOM(16); -- 生成16字节安全随机盐

INSERT INTO dbo.Users (Username, PasswordHash, PasswordSalt)
VALUES (
    @NewUsername,
    dbo.GeneratePasswordHash(@NewPassword, @NewSalt),
    @NewSalt
);

二、Access前端登录验证实现

在Access登录窗体中编写VBA代码,调用SQL Server的存储过程完成验证:

1. 登录窗体VBA代码

假设登录窗体包含txtUsername(用户名输入框)、txtPassword(密码输入框)和btnLogin(登录按钮):

Private Sub btnLogin_Click()
    Dim conn As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim isValid As Boolean
    
    ' 检查输入合法性
    If Nz(Me.txtUsername.Value, "") = "" Or Nz(Me.txtPassword.Value, "") = "" Then
        MsgBox "用户名和密码不能为空!", vbExclamation
        Exit Sub
    End If
    
    ' 连接SQL Server
    Set conn = New ADODB.Connection
    ' SQL身份验证连接字符串
    conn.ConnectionString = "Provider=SQLOLEDB;Data Source=你的SQL服务器地址;Initial Catalog=你的数据库名;User ID=SQL登录账号;Password=SQL登录密码;"
    ' Windows身份验证可替换为:
    ' conn.ConnectionString = "Provider=SQLOLEDB;Data Source=你的SQL服务器地址;Initial Catalog=你的数据库名;Integrated Security=SSPI;"
    
    On Error GoTo ConnectionError
    conn.Open
    
    ' 配置并调用存储过程
    Set cmd = New ADODB.Command
    cmd.ActiveConnection = conn
    cmd.CommandText = "dbo.ValidateUserLogin"
    cmd.CommandType = adCmdStoredProc
    
    ' 传递参数
    cmd.Parameters.Append cmd.CreateParameter("@Username", adVarWChar, adParamInput, 50, Me.txtUsername.Value)
    cmd.Parameters.Append cmd.CreateParameter("@Password", adVarWChar, adParamInput, 100, Me.txtPassword.Value)
    cmd.Parameters.Append cmd.CreateParameter("@IsValid", adBoolean, adParamOutput)
    
    cmd.Execute
    isValid = cmd.Parameters("@IsValid").Value
    
    ' 处理验证结果
    If isValid Then
        MsgBox "登录成功!", vbInformation
        DoCmd.OpenForm "主窗体名称" ' 替换为你的主窗体
        Me.Close
    Else
        MsgBox "用户名或密码错误!", vbCritical
        Me.txtPassword.Value = ""
        Me.txtUsername.SetFocus
    End If
    
    ' 清理资源
    conn.Close
    Set cmd = Nothing
    Set conn = Nothing
    Exit Sub
    
ConnectionError:
    MsgBox "数据库连接失败:" & Err.Description, vbCritical
    Set cmd = Nothing
    If conn.State = adStateOpen Then conn.Close
    Set conn = Nothing
End Sub

三、安全注意事项

  • 绝不存储明文密码:SQL Server中仅保留盐和哈希值,杜绝明文泄露风险。
  • 使用独立随机盐:每个用户对应唯一随机盐,避免彩虹表攻击,CRYPT_GEN_RANDOM生成的盐安全性较高。
  • 加密网络传输:跨网络部署时,在连接字符串中添加Encrypt=yes;TrustServerCertificate=no;启用SSL加密,防止密码传输被窃听。
  • 限制SQL账号权限:Access连接SQL Server使用的账号仅授予执行验证存储过程和读取用户表的权限,避免过度权限引发的安全问题。

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 18:20:21