前端常用的数据加密:MD5、SHA、Base64及其实现方式

引言

本文旨在探讨对称加密非对称加密 的概念、它们在HTTP和HTTPS通信 中的应用,以及哈希算法 的重要性。同时,我们还将深入解析MD5型SHA算法 ,并探讨这些算法如何确保数据的完整性和安全性。同时,文章还涉及了 Base64 编码的概念及其Node.js实现。

对称加密和非对称加密

对于数字通信和数据保护而言,对称加密和非对称加密是两种关键的加密技术。

  • 对称加密:采用相同的密钥进行数据的加密和解密。优点是加解密过程速度快,适合处理大量数据。然而,它面临着密钥分发的挑战,即必须在加密和解密双方之间安全地共享密钥。
  • 非对称加密:使用一对密钥,公钥用于加密,私钥用于解密。它解决了密钥分发的问题,因为公钥可以公开共享,而私钥保持私有。非对称加密通常用于安全地交换对称加密的密钥。

HTTP与HTTPS协议中,这两种加密方法起到了关键作用。HTTP通信未加密,易受中间人攻击。相比之下,HTTPS采用SSL/TLS协议,结合对称和非对称加密技术,以确保数据传输的安全性。在HTTPS中,非对称加密用于密钥交换阶段,一旦建立安全通道,后续通信则采用对称加密。

哈希算法

哈希算法(Hash Algorithm)又称散列算法、散列函数、哈希函数,是一种从任何数据中创建小的数字"指纹"的方法。无论输入数据的大小,哈希算法都能快速生成一个固定长度的哈希值。它的关键特性包括:

  • 正向快速:快速生成数据的哈希值。
  • 逆向困难:逆向计算困难,从哈希值无法还原原始数据。
  • 输入敏感:对输入数据高度敏感,即使是微小的变化也会产生不同的哈希值。

常见的哈希算法

  • MD4和MD5:早期的算法,输出128位,现在已不被认为是安全的。

  • SHA系列

    • SHA-0和SHA-1:输出128位,已不再安全。
    • SHA-2系列(包括SHA-224、SHA-256、SHA-384和SHA-512):分别输出224、256、384、512位,目前仍被广泛认为是安全的。

哈希算法与冲突避免

在哈希算法中,避免"冲突"(即不同的输入产生相同的哈希值)是设计上的一个重要目标。这种冲突的可能性可以用潜在的输出值的范围来衡量:

  • 2的128次方约为10的39次方级别,这是MD4和MD5的理论输出范围。
  • 2的160次方约为10的48次方级别,对应于SHA-0和SHA-1的输出范围。
  • 2的256次方达到了10的77次方级别,这是SHA-256的输出范围。

考虑到宇宙中的原子总数估计在10的60到80次方之间,2的256次方的输出空间为SHA-2系列提供了极低的冲突概率,从而使它们在现代应用中保持高度的安全性。

MD5算法

MD5全称Message Digest Algorithm 5,是一种广泛使用的哈希算法,它将任意长度的输入转换为固定长度的输出。它通过以下步骤处理信息:

  1. 512位分组处理:

    • MD5算法首先将输入数据(如文本或文件内容)分割成多个512位的块。
    • 如果数据不满512位,算法会进行填充,以确保每个块均为512位。
  2. 分组细分为16个32位子分组:

    • 每个512位的块进一步细分为16个32位的子分组。
    • 这样的细分方便后续的处理步骤。
  3. 系列处理产生四个32位分组:

    • MD5算法通过一系列复杂的数学和逻辑操作处理这些32位的子分组。
    • 这些操作包括移位、旋转、加法等,最终产生四个32位的输出。
  4. 级联四个32位分组生成128位散列值:

    • 这四个32位的输出组合起来,形成一个128位的哈希值。
    • 这个哈希值通常以32个十六进制数字表示。

在区块链技术中,MD5和其他哈希算法的不可逆特性被用来确保数据的不可篡改性。通过累积哈希值,即每个新块包含前一个块的哈希值,区块链创造了一个连续的、不可更改的数据链。任何对链中单个块的篡改都将导致整个链的哈希值改变,从而被轻易地检测到。

然而网站如cmd5.com等可以通过预存的MD5哈希值数据库快速反查,获取原始数据。

为了提高安全性,可以使用"加盐"技术。加盐(Salting)是一种安全措施,用于增强哈希过程的安全性:

加盐的原理:

  • 在计算哈希值前,向原始数据(如密码)添加随机数据(即"盐")。
  • 这样,即使两个用户具有相同的原始密码,它们的最终哈希值也会因为加盐而不同。
  • 加盐使得预生成哈希值表(如彩虹表)变得无效,因为每个哈希值都需要独立计算。

加盐的实践:

  1. 生成随机盐:

    • 每次存储新密码时,生成一个新的随机盐。
  2. 结合密码和盐:

    • 将盐与密码结合,然后一起进行哈希处理。
  3. 存储盐和哈希值:

    • 将盐和结果哈希值一同存储在数据库中。

前端可以使用JavaScript的crypto库实现:

js 复制代码
const crypto = require("crypto");

// 使用固定盐值的函数
const salt = "YourCustomSalt"; // 更换为您自己的盐值
const passToSaltHash = password => {
    const hash = crypto.createHash("md5");
    return hash.update(password + salt).digest("hex");
};

const password = "yourPassword"; // 替换为您的密码
console.log(passToSaltHash(password)); // 输出加盐后的哈希值

通过这种方式,即使攻击者知道加密使用的是MD5算法,没有具体的盐值信息,他们仍然很难破解密码。然而,即便如此,鉴于MD5算法本身的安全缺陷,目前推荐使用更为安全的哈希算法,如SHA-256,特别是在处理敏感信息如密码时。

SHA算法

安全哈希算法(Secure Hash Algorithm, SHA)家族是另一类重要的哈希算法,包括SHA-1、SHA-2等。特别是SHA-256,在加密货币和区块链领域中尤为重要。

js 复制代码
const crypto = require("crypto");

// SHA-256加密示例
const sha256Hash = (data) => {
    return crypto.createHash("sha256").update(data).digest("hex");
};

const data = "示例数据";
console.log("SHA-256加密: " + sha256Hash(data));

结论

对称加密、非对称加密和哈希算法是构建数字安全基础的三大支柱。它们各自有着独特的功能和优势,但在实际应用中,这些技术往往是相互补充的。从确保网络通信的安全(如HTTPS),到保障数据的完整性和不可篡改性(如区块链技术),这些方法共同构成了我们数字生活的安全基础。随着技术的发展,理解这些基本概念对于任何涉及数据处理和网络通信的专业人士来说,都是至关重要的。

与Base64区分

Base64本身不是加密或哈希技术,它通过将二进制数据 转换为ASCII字符串来实现数据的传输和存储。Base64编码特别适合在那些不允许包含二进制数据的场合中传输数据,如在某些基于文本的协议(如HTTP)中发送图像或其他媒体文件。

通过将加密或哈希后的数据转换为可传输的文本格式,Base64确保了这些数据在网络上传输的可行性和方便性。

在Node.js中,由于缺少浏览器专有的atob()btoa()函数,Buffer类成为处理Base64编码和解码的主要工具。

Base64 编码过程

  1. 创建Buffer : 使用Buffer.from(str, 'utf-8')创建一个基于给定字符串str的缓冲区。这里的'utf-8'是字符编码,用于指定如何将字符串转换为二进制数据。如果省略,将默认使用UTF-8编码。

  2. 转换为Base64 :调用buff.toString('base64')将缓冲区的内容编码为Base64格式的字符串。

  3. 输出Base64字符串: 将得到的Base64字符串输出到控制台。

    javascript 复制代码
    const str = 'Base64 Encoding in Node.js';
    const buff = Buffer.from(str, 'utf-8');
    const base64 = buff.toString('base64');
    console.log(base64); // 输出Base64编码的字符串

Base64 解码过程

  1. 创建Base64 Buffer : 使用Buffer.from(base64, 'base64')创建一个基于Base64编码字符串的缓冲区。

  2. 转换为普通文本 : 使用buff.toString('utf-8')将缓冲区内容解码回UTF-8格式的普通文本。

  3. 输出普通文本字符串: 将解码后的普通文本字符串输出到控制台。

    javascript 复制代码
    const base64 = 'QmFzZTY0IEVuY29kaW5nIGluIE5vZGUuanM=';
    const buff = Buffer.from(base64, 'base64');
    const str = buff.toString('utf-8');
    console.log(str); // 输出解码后的普通文本

参考资料

【前端】深入剖析MD5的HASH 算法 - 掘金 (juejin.cn)

哈希算法与MD5、SHA - 知乎 (zhihu.com)

crypto - 廖雪峰的官方网站 (liaoxuefeng.com)

Encoding and decoding Base64 strings in Node.js (attacomsian.com)

相关推荐
J不A秃V头A35 分钟前
Vue3:编写一个插件(进阶)
前端·vue.js
司篂篂1 小时前
axios二次封装
前端·javascript·vue.js
姚*鸿的博客1 小时前
pinia在vue3中的使用
前端·javascript·vue.js
宇文仲竹2 小时前
edge 插件 iframe 读取
前端·edge
Kika写代码2 小时前
【基于轻量型架构的WEB开发】【章节作业】
前端·oracle·架构
天下无贼!3 小时前
2024年最新版Vue3学习笔记
前端·vue.js·笔记·学习·vue
Jiaberrr3 小时前
JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)
前端·javascript·tree·树形·过滤筛选
赵啸林3 小时前
npm发布插件超级简单版
前端·npm·node.js
罔闻_spider4 小时前
爬虫----webpack
前端·爬虫·webpack
吱吱鼠叔4 小时前
MATLAB数据文件读写:1.格式化读写文件
前端·数据库·matlab