当前位置: 首页 > news >正文

md5等摘要算法的「撞库」与「加盐」(Ⅰ)

了解 MD5 摘要算法、撞库与加盐

在网络安全中,“撞库攻击”和“加盐”是经常听到的术语,而 MD5 等摘要算法的特性也使它们在密码学领域备受关注。今天,我将为大家科普 MD5 摘要算法的基本原理,以及撞库和加盐技术的作用与区别。

一、什么是 MD5 及其在密码学中的作用

MD5(Message Digest Algorithm 5)是 Ronald Rivest 在 1991 年设计的一种消息摘要算法,通常用于生成 128 位的哈希值。其主要特性包括:

  • 不可逆性:MD5 将输入消息(如密码)通过算法处理,生成一串固定长度的“摘要”,从而隐去了原始数据内容。但算法本身无法通过结果直接反推原文。
  • 相同输入相同输出:对于同一个输入值,MD5 总会生成相同的输出。这对密码验证非常重要,因为在验证过程中无需保存密码原文,仅需保存哈希值。
  • 高效性:生成 MD5 哈希值的过程相对简单且快速。

这些特性使得 MD5 早期在密码存储和数据完整性验证中被广泛应用,但随着计算能力的增强和更多安全研究的进展,MD5 的一些缺陷逐渐暴露,特别是抗碰撞性不足的问题。

示例:生成 MD5 哈希

我们可以用 JavaScript 来生成 MD5 哈希,来更好地理解这个算法的工作方式:

// 使用 crypto-js 库来生成 MD5 哈希(需要先安装 crypto-js)
const CryptoJS = require("crypto-js");// 用户输入的密码
const password = "password123";// 生成 MD5 哈希
const hash = CryptoJS.MD5(password).toString();
console.log("不加盐的哈希:", hash);

输出的哈希值在每次输入相同密码时都会一样,例如 password123 的哈希值可能为 482c811da5d5b4bc6d497ffa98491e38。这就使得彩虹表和撞库攻击可能有效。

二、什么是“撞库”攻击?

“撞库”是黑客使用的破解密码技术之一,属于暴力破解的一种变种。在撞库攻击中,黑客会利用大量的预生成哈希值,去“碰撞”目标系统中保存的哈希值,以找出可能的原始密码。

撞库的主要流程
  1. 获取数据库信息:黑客通常通过漏洞、数据泄露等途径,获得目标数据库中存储的哈希密码。
  2. 构建或使用现有的哈希库:将常见密码进行哈希处理,生成大量的哈希值,然后将这些哈希值与泄露的哈希值对比。
  3. 比对匹配:当哈希库中的某个哈希值与目标哈希值相同时,说明原始密码已经被成功破解。
“彩虹表”与撞库

彩虹表是帮助黑客实现撞库攻击的重要工具。它是一个庞大的哈希值数据库,存储了从常见密码生成的哈希值,并按一定规律减少存储空间。当数据库中的哈希值足够多时,黑客可以极大地减少破解密码的时间成本。

为什么 MD5 更容易被撞库?

由于 MD5 的输出长度和计算能力的提升,普通设备便可快速生成大量哈希值。更重要的是,MD5 不能抵抗彩虹表的暴力破解,这也正是 MD5 渐渐被更安全的哈希算法(如 SHA-256)替代的原因。

三、什么是“加盐”?

“加盐”(Salting)是一种增加哈希算法安全性的技术。在生成密码哈希之前,程序会在原始密码后追加一串随机字符(盐值),再进行哈希操作。加盐的主要作用是通过随机性来增加哈希结果的唯一性,防止撞库攻击。

加盐的主要流程
  1. 生成随机盐值:为每个用户生成一个独特的随机字符串作为盐值。
  2. 盐值与密码组合:将盐值与用户的原始密码拼接在一起。
  3. 生成哈希值:对盐值与密码组合后的字符串进行 MD5 或其他哈希操作,生成一个独一无二的哈希值。
示例:带盐的 MD5 哈希生成

为了更好地理解加盐过程,我们来看看如何在 JavaScript 中为每个用户生成一个带盐的 MD5 哈希:

// 使用 crypto-js 生成带盐的哈希
const generateSaltedHash = (password) => {// 生成一个随机的盐值const salt = CryptoJS.lib.WordArray.random(16).toString();// 将盐值和密码组合后进行 MD5 哈希处理const saltedHash = CryptoJS.MD5(password + salt).toString();console.log("盐值:", salt);console.log("带盐的哈希:", saltedHash);// 返回盐值和带盐的哈希(存储时需保存这两个值)return { salt, saltedHash };
};// 示例
const { salt, saltedHash } = generateSaltedHash("password123");

在这个示例中,每次生成的哈希值都会不同,因为盐值是随机的。存储密码时,我们需要保存 盐值和带盐哈希值。验证密码时,只需使用相同的盐值生成哈希,比较是否一致即可。

示例:验证带盐的哈希

为了验证用户的密码,我们将提取存储的盐值并与用户输入的密码组合,重新生成带盐的哈希值并进行比对。

// 验证带盐哈希的函数
const verifyPassword = (inputPassword, storedSalt, storedHash) => {// 使用存储的盐值生成输入密码的哈希const inputHash = CryptoJS.MD5(inputPassword + storedSalt).toString();// 比对生成的哈希值和存储的哈希值return inputHash === storedHash;
};// 验证示例
const isPasswordCorrect = verifyPassword("password123", salt, saltedHash);
console.log("密码验证通过:", isPasswordCorrect); // 如果密码正确,会输出 true

四、总结与安全建议

MD5 虽然简单高效,但随着信息安全领域的发展,其安全性逐渐暴露出不足。如果你正在开发网站、应用,或管理用户数据,可以参考以下安全建议:

  1. 避免直接使用 MD5 存储密码:建议采用更安全的算法,如 SHA-256、SHA-3。
  2. 加盐处理:为每个用户生成独特的随机盐值,将其与密码结合后再生成哈希值。
  3. 使用多轮哈希:即多次对加盐后的密码进行哈希操作,进一步提升安全性。
  4. 限制暴力破解:在验证过程中添加登录次数限制、验证码等机制,减少被暴力破解的可能性。

总之,MD5 等摘要算法的核心原理并不复杂,但在实际应用中必须考虑其安全性不足的问题。通过“加盐”处理,我们可以大幅提高存储的密码哈希的安全性,保护用户的数据隐私。


http://www.mrgr.cn/news/69473.html

相关文章:

  • Ubuntu24.04安装和配置Redis7.4
  • 【ES6】ES6中,如何实现桥接模式?
  • 30 秒!用通义灵码画 SpaceX 星链发射流程图
  • HTML之表单学习记录
  • 蓝桥杯每日真题 - 第7天
  • 数据结构Python版
  • npm i 的时候报错: npm ERR! Error: EPERM: operation not permitted, rename
  • vue3使用element-plus,树组件el-tree增加引导线
  • 【debug】QT 相关问题error汇总 QT5升级到QT6需要注意要点
  • Diffusion Policy——斯坦福刷盘机器人UMI所用的扩散策略(含Diff-Control、ControlNet详解)
  • C#语言详解:从基础到进阶
  • 代码随想录训练营Day20 | 93.复原IP地址 - 78.子集 - 90.子集II
  • 移动应用开发:实现简易调查问卷
  • 第二十九天|贪心算法| 134. 加油站, 135. 分发糖果 ,860.柠檬水找零,406.根据身高重建队列
  • 基于STM32的红外遥控接收器
  • PostgreSQL 删除数据库
  • 每天五分钟深度学习PyTorch:基于全连接神经网络完成手写字体识别
  • HarmonyOS入门 : 获取网络数据,并渲染到界面上
  • Android中桌面小部件的开发流程及常见问题和解决方案
  • MQTT协议解析 : 物联网领域的最佳选择
  • HTML5+css3(定位属性,position:absolute,relative,fixed,相对定位,绝对定位,固定定位,z-index属性)
  • 【微软太离谱!企业用户Windows Server 2022一夜之间自动升到2025】
  • RK3568笔记1:BootRom
  • 计算机网络之物理层
  • 对HFSS中的结构使用Icepak进行热仿真-以微带电路为例-含工程
  • ts 将100个元素,每行显示9个元素,然后显示出所有行的元素,由此我们延伸出一个项目需求的简单算法实现。