普通视图

发现新文章,点击刷新页面。
昨天以前首页

图文+示例,带你彻底搞清楚那些加密手段...!

作者 momo06117
2026年1月3日 17:02

前言

最近,小编在学习的过程中有了解到加密的手段,因此想来分享一下自己学到的一些新知识。如有讲得不好或遗漏 欢迎各位大佬在评论区指出。

关于加密

加密是指通过特定手段将明文存储的内容加密成密文。那么为什么要进行加密呢?

互联网中各种攻击防不胜防,如果敏感内容不加密存储,例如用户密码之类的(一想到自己的密码明晃晃的暴露在传输过程中,是不是有点后背一凉的感觉~),那攻击者就能够轻易获取用户隐私信息并实施攻击。

因此加密是必不可少的。那么加密的手段有哪些?或者我们在针对什么场景应该做什么加密?

下面小编一一介绍并通过node手段简单实现。

hash加密

加密手段中,最常见的就是hash加密,指通过一定的算法将明文转化为密文。

比如将密码abc随机后退3格加密成为dfg,这是一种最简单的加密手段。

现代常见最常见的加密手段有MD5SHA加密等,由于其复杂性hash加密是不可逆的。但是由于hash算法固定,因此同一个密码加密后是相同的密文,因此攻击者想到可以通过彩虹表攻击。

故实际生产中,我们往往会往明文先加盐(一段随机的字符串插入),然后再进行hash加密。

image.png

使用场景: 数据库中的密码存储(由于hash不可逆,实则程序员也不知道你的密码)

实现示例: 使用bcrypt进行加密

//自动加盐并且内嵌
const hashPassword = bcrypt.hashSync(password,10) 
//解密
const compareResult = bcrypt.compareSync(userinfo.password,result[0].password)

对称加密

上面说到了hash算法,但由于hash算法是不可逆的,故常用于存储加密,而实际开发中我们会经常用到传输加密,故对称加密应运而生。

对称加密是指将密码通过密钥加密后生成密文,对方再通过同一密钥破解生成的密文。

常见手段AES加密

优缺点:加密简单,解密速度快。但密钥的管理和传输困难。

image.png

实际场景:大量需要被加密的内容

实现示例:使用CryptoJS进行AES加密

const cryptoJs = require('crypto-js')

const message = 'hello word'
const key = 'this is key' //实际过程中 对称密钥通常是随机生成的

//加密
const encrypted = cryptoJs.AES.encrypt(message, key)

console.log('对称加密密文:',encrypted.toString())

//将密文解密
const decryptedMessage  = cryptoJs.AES.decrypt(encrypted,key)

console.log('解密:',decryptedMessage.toString(cryptoJs.enc.Utf8))

image.png

非对称加密

目的是为了解决上面提到的密钥安全问题,对称加密密钥被截获,密文也就轻易可知了。

非对称加密是指发送端用公钥进行加密,然后采用私钥进行解密,公钥是公开的,私钥是只有接受方才有的。就像一个箱子,发送方把用锁把箱子锁上,接收方用钥匙解锁。

常见手段: RSA非对称加密

优缺点: 由于私钥只有接收方可知,保密性好。但加密和解密比较耗时。

image.png

实际场景: 密钥交换,数字签名

实现示例: 使用node原生crypto进行RSA非对称加密

const crypto = require('crypto')

// 生成RSA密钥对
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
  modulusLength: 2048, // 密钥长度
  publicKeyEncoding: {
    type: 'spki',
    format: 'pem'
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'pem'
  }
})

const data = 'hello word';
console.log('原始数据:', data);

// 使用公钥加密
const encryptedData = crypto.publicEncrypt(
  {
    key: publicKey,
    padding: crypto.constants.RSA_PKCS1_OAEP_PADDING
  },
  Buffer.from(data)
)

console.log('加密后 (base64):', encryptedData.toString('base64'))

// 使用私钥解密
const decryptedData = crypto.privateDecrypt(
  {
    key: privateKey,
    padding: crypto.constants.RSA_PKCS1_OAEP_PADDING
  },
  encryptedData
)
console.log('解密后:', decryptedData.toString())

image.png

混合加密

上面有说到对称加密和非对称加密的优缺点,那么有没有集两者大成,既适合传输大量内容又密钥管理安全的方案呢? 答案是有的,那就是混合加密。

混合加密是指用非对称加密 加密 对称加密的密钥,可能有点绕,下面详细介绍一下。

加密过程

  1. 服务器生成一对公钥和私钥,将公钥发送给客户端
  2. 客户端收到私钥后,随机生成一对会话密钥(对称密钥)用服务器的公钥加密后发送
  3. 服务器收到密文后,用私钥解密,会话密钥
  4. 此时,服务器和客户端都有会话密钥,此后都使用会话密钥加密对话

优缺点:只需要前期少量资源用于非对称加密,后期可用对称加密传输大量内容,但实现比较复杂

image.png

实际场景: http加密的重要手段,现代大量加密场景等。

总结

总的来说,加密是我们开发过程中必不可少的一环,针对不同的环境,做出不同的加密手段是我们作为开发者必不可少的综合技能~

特性 Hash加密 对称加密 非对称加密 混合加密
加密类型 加密存储 加密传输 加密传输 加密传输
核心原理 单向散列函数 相同密钥加解密 公钥加密,私钥解密 非对称加密保护对称密钥
密钥数量 无密钥(有盐值) 1个共享密钥 2个密钥(公钥+私钥) 3个密钥(非对称对+对称密钥)
安全性 防篡改,不可逆 依赖密钥安全 依赖数学难题安全 综合安全等级最高
推荐场景 需要验证但不需要解密的场景 内部系统、大量加密 密钥分发、身份认证 公网通信、高安全要求

制作不易 礼貌集赞

image.png

❌
❌