网站首页 > 技术文章 正文
引言
本文旨在探讨对称加密与非对称加密的概念、它们在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,是一种广泛使用的哈希算法,它将任意长度的输入转换为固定长度的输出。它通过以下步骤处理信息:
- 512位分组处理:
- MD5算法首先将输入数据(如文本或文件内容)分割成多个512位的块。
- 如果数据不满512位,算法会进行填充,以确保每个块均为512位。
- 分组细分为16个32位子分组:
- 每个512位的块进一步细分为16个32位的子分组。
- 这样的细分方便后续的处理步骤。
- 系列处理产生四个32位分组:
- MD5算法通过一系列复杂的数学和逻辑操作处理这些32位的子分组。
- 这些操作包括移位、旋转、加法等,最终产生四个32位的输出。
- 级联四个32位分组生成128位散列值:
- 这四个32位的输出组合起来,形成一个128位的哈希值。
- 这个哈希值通常以32个十六进制数字表示。
在区块链技术中,MD5和其他哈希算法的不可逆特性被用来确保数据的不可篡改性。通过累积哈希值,即每个新块包含前一个块的哈希值,区块链创造了一个连续的、不可更改的数据链。任何对链中单个块的篡改都将导致整个链的哈希值改变,从而被轻易地检测到。
然而网站如cmd5.com等可以通过预存的MD5哈希值数据库快速反查,获取原始数据。
为了提高安全性,可以使用“加盐”技术。加盐(Salting)是一种安全措施,用于增强哈希过程的安全性:
加盐的原理:
- 在计算哈希值前,向原始数据(如密码)添加随机数据(即“盐”)。
- 这样,即使两个用户具有相同的原始密码,它们的最终哈希值也会因为加盐而不同。
- 加盐使得预生成哈希值表(如彩虹表)变得无效,因为每个哈希值都需要独立计算。
加盐的实践:
- 生成随机盐:
- 每次存储新密码时,生成一个新的随机盐。
- 结合密码和盐:
- 将盐与密码结合,然后一起进行哈希处理。
- 存储盐和哈希值:
- 将盐和结果哈希值一同存储在数据库中。
前端可以使用JavaScript的crypto库实现:
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,在加密货币和区块链领域中尤为重要。
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 编码过程
- 创建Buffer: 使用Buffer.from(str, 'utf-8')创建一个基于给定字符串str的缓冲区。这里的'utf-8'是字符编码,用于指定如何将字符串转换为二进制数据。如果省略,将默认使用UTF-8编码。
- 转换为Base64:调用buff.toString('base64')将缓冲区的内容编码为Base64格式的字符串。
- 输出Base64字符串: 将得到的Base64字符串输出到控制台。
const str = 'Base64 Encoding in Node.js';
const buff = Buffer.from(str, 'utf-8');
const base64 = buff.toString('base64');
console.log(base64); // 输出Base64编码的字符串
Base64 解码过程
- 创建Base64 Buffer: 使用Buffer.from(base64, 'base64')创建一个基于Base64编码字符串的缓冲区。
- 转换为普通文本: 使用buff.toString('utf-8')将缓冲区内容解码回UTF-8格式的普通文本。
- 输出普通文本字符串: 将解码后的普通文本字符串输出到控制台。
const base64 = 'QmFzZTY0IEVuY29kaW5nIGluIE5vZGUuanM=';
const buff = Buffer.from(base64, 'base64');
const str = buff.toString('utf-8');
console.log(str); // 输出解码后的普通文本
猜你喜欢
- 2024-12-06 如何在Spring Boot中实现前后端数据的加密通信
- 2024-12-06 聊聊前端常见的数据加密
- 2024-12-06 自创一种前端语言,能否替代js,以实现代码加密?
你 发表评论:
欢迎- 07-07使用AI开发招聘网站(100天AI编程实验)
- 07-07Tailwindcss 入门(tailwindcss中文文档)
- 07-07CSS 单位指南(css计量单位)
- 07-07CSS 定位详解(css定位属性的运用)
- 07-07程序员可以作为终身职业吗?什么情况下程序员会开始考虑转行?
- 07-07云和学员有话说:国企转行前端开发,斩获13K高薪!
- 07-0791年转行前端开发,是不是不该转,有啥风险?
- 07-07计算机图形学:变换矩阵(图形学 矩阵变换)
- 595℃几个Oracle空值处理函数 oracle处理null值的函数
- 587℃Oracle分析函数之Lag和Lead()使用
- 575℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 572℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 568℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 561℃【数据统计分析】详解Oracle分组函数之CUBE
- 548℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 541℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- 前端获取当前时间 (50)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)