0

0

客户端动态盐值认证的正确实现方案

碧海醫心

碧海醫心

发布时间:2026-03-11 13:49:02

|

775人浏览过

|

来源于php中文网

原创

客户端动态盐值认证的正确实现方案

本文详解如何在密码认证中安全使用动态盐值(salt),解决客户端生成盐值后服务端无法验证的典型问题,强调盐值必须由服务端生成并存储,配合强哈希算法(如bcrypt)实现安全认证。

本文详解如何在密码认证中安全使用动态盐值(salt),解决客户端生成盐值后服务端无法验证的典型问题,强调盐值必须由服务端生成并存储,配合强哈希算法(如bcrypt)实现安全认证。

在现代Web认证系统中,“客户端生成动态Salt”是一个常见但根本性错误的设计思路。正如问题中所描述:若客户端每次生成新Salt并用其哈希密码后再发送,服务端将因缺乏该Salt而无法复现哈希过程——数据库中仅存旧Salt对应的哈希值,导致验证必然失败。更严重的是,这种设计违背了Salt的核心安全原则:Salt必须唯一、随机、且与密码哈希值一同持久化存储,由服务端完全控制其生命周期。

✅ 正确实践:Salt由服务端生成并存储

Salt绝不能由客户端决定或预置(如代码中硬编码的 "XXXXXXXXXXXX"),也不应通过客户端传递后“同步更新”。标准且安全的流程如下:

mallcloud商城
mallcloud商城

mallcloud商城基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离vue的企业级微服务敏捷开发系统架构。并引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手容易,适合学习和企业中使用。真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案,面向互联网设计同时适合B端和C端用户,支持CI/CD多环境部署,并提

下载
  1. 注册阶段:用户首次注册时,服务端生成高强度随机Salt(如bcrypt.genSalt(12)),将其与密码哈希值(bcrypt.hash(password, salt))一同存入数据库;
  2. 登录阶段:客户端仅提交明文(或TLS加密下)的用户名和密码;服务端根据用户名查出对应记录中的完整哈希值(含嵌入的Salt),调用bcrypt.compare()自动提取Salt并完成比对。

? 关键点:bcrypt等现代哈希函数将Salt与哈希结果编码在同一字符串中(如$2b$12$abc123...),服务端无需单独存储或传输Salt字段,极大简化且强化安全性。

? 示例:修复后的服务端认证逻辑(Node.js + bcryptjs)

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const mysql = require('mysql2/promise'); // 推荐使用 promise 版本
const bcrypt = require('bcryptjs');

const pool = mysql.createPool({
  host: 'xx.xx.xx.xx',
  user: 'xxxx',
  password: 'XXXXXXXXX',
  database: 'customers',
  waitForConnections: true,
  connectionLimit: 10
});

app.use(bodyParser.json());

app.post('/login', async (req, res) => {
  const { username, password } = req.body;

  if (!username || !password) {
    return res.status(400).json({ message: 'Username and password are required' });
  }

  try {
    const [rows] = await pool.execute(
      'SELECT id, Username, PasswordHash, Company, Access, Databases FROM customers.Unfallmeldung WHERE Username = ?',
      [username]
    );

    if (rows.length === 0) {
      return res.status(401).json({ message: 'Invalid credentials' });
    }

    const user = rows[0];
    // bcrypt 自动解析 hash 中的 salt 并比对
    const isMatch = await bcrypt.compare(password, user.PasswordHash);

    if (!isMatch) {
      return res.status(401).json({ message: 'Invalid credentials' });
    }

    const response = [user.Company, user.Access, user.Databases];
    res.status(200).json({ message: response });
  } catch (error) {
    console.error('Login error:', error);
    res.status(500).json({ error: 'Internal server error' });
  }
});

app.listen(3000, () => console.log('Secure auth server running on port 3000'));

? 客户端适配要点(Java示例)

  • 移除客户端Salt逻辑:删除HashPassword.encrypt()中硬编码Salt及手动SHA-512实现;
  • 仅传输原始凭证:客户端不再对密码做任何哈希,直接以明文(依赖HTTPS保障传输安全)提交;
  • 增强健壮性:避免字符串拼接JSON(易受注入),改用JSONObject或Gson等库构造请求体。
// ✅ 正确客户端(节选)
String requestBody = new JSONObject()
    .put("username", username)
    .put("password", password) // ← 原始密码,不哈希!
    .toString();

⚠️ 重要注意事项

  • 永远不要在客户端哈希密码:这无法防止重放攻击,且破坏Salt机制;真正的安全边界是HTTPS + 服务端强哈希;
  • 禁用弱哈希算法:SHA-512 + 静态Salt属于“加盐但不防爆破”,必须使用bcrypt、scrypt或Argon2等自适应、慢速哈希函数;
  • 数据库字段命名规范:将原Password列重命名为PasswordHash,明确语义,避免误导;
  • 密码策略与风控:配合登录失败锁定、速率限制、多因素认证(MFA)进一步加固。

✅ 总结

动态Salt的价值在于每个用户、每次注册都拥有唯一且不可预测的随机值,而这一过程必须由服务端完成并持久化。客户端唯一职责是安全地传输原始凭证(借助HTTPS),把密码学处理全权交予服务端。遵循此原则,不仅能彻底规避“Salt不同步”问题,更能构建符合OWASP ASVS标准的高安全性认证体系。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

455

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

334

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号