图文+示例,带你彻底搞清楚那些加密手段...!
前言
最近,小编在学习的过程中有了解到加密的手段,因此想来分享一下自己学到的一些新知识。如有讲得不好或遗漏 欢迎各位大佬在评论区指出。
关于加密
加密是指通过特定手段将明文存储的内容加密成密文。那么为什么要进行加密呢?
互联网中各种攻击防不胜防,如果敏感内容不加密存储,例如用户密码之类的(一想到自己的密码明晃晃的暴露在传输过程中,是不是有点后背一凉的感觉~),那攻击者就能够轻易获取用户隐私信息并实施攻击。
因此加密是必不可少的。那么加密的手段有哪些?或者我们在针对什么场景应该做什么加密?
下面小编一一介绍并通过node手段简单实现。
hash加密
加密手段中,最常见的就是hash加密,指通过一定的算法将明文转化为密文。
比如将密码abc随机后退3格加密成为dfg,这是一种最简单的加密手段。
现代常见最常见的加密手段有MD5,SHA加密等,由于其复杂性hash加密是不可逆的。但是由于hash算法固定,因此同一个密码加密后是相同的密文,因此攻击者想到可以通过彩虹表攻击。
故实际生产中,我们往往会往明文先加盐(一段随机的字符串插入),然后再进行hash加密。
![]()
使用场景: 数据库中的密码存储(由于hash不可逆,实则程序员也不知道你的密码)
实现示例: 使用bcrypt进行加密
//自动加盐并且内嵌
const hashPassword = bcrypt.hashSync(password,10)
//解密
const compareResult = bcrypt.compareSync(userinfo.password,result[0].password)
对称加密
上面说到了hash算法,但由于hash算法是不可逆的,故常用于存储加密,而实际开发中我们会经常用到传输加密,故对称加密应运而生。
对称加密是指将密码通过密钥加密后生成密文,对方再通过同一密钥破解生成的密文。
常见手段:AES加密
优缺点:加密简单,解密速度快。但密钥的管理和传输困难。
![]()
实际场景:大量需要被加密的内容
实现示例:使用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))
![]()
非对称加密
目的是为了解决上面提到的密钥安全问题,对称加密密钥被截获,密文也就轻易可知了。
非对称加密是指发送端用公钥进行加密,然后采用私钥进行解密,公钥是公开的,私钥是只有接受方才有的。就像一个箱子,发送方把用锁把箱子锁上,接收方用钥匙解锁。
常见手段: RSA非对称加密
优缺点: 由于私钥只有接收方可知,保密性好。但加密和解密比较耗时。
![]()
实际场景: 密钥交换,数字签名
实现示例: 使用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())
![]()
混合加密
上面有说到对称加密和非对称加密的优缺点,那么有没有集两者大成,既适合传输大量内容又密钥管理安全的方案呢? 答案是有的,那就是混合加密。
混合加密是指用非对称加密 加密 对称加密的密钥,可能有点绕,下面详细介绍一下。
加密过程:
- 服务器生成一对公钥和私钥,将公钥发送给客户端
- 客户端收到私钥后,随机生成一对会话密钥(对称密钥)用服务器的公钥加密后发送
- 服务器收到密文后,用私钥解密,会话密钥
- 此时,服务器和客户端都有会话密钥,此后都使用会话密钥加密对话
优缺点:只需要前期少量资源用于非对称加密,后期可用对称加密传输大量内容,但实现比较复杂
![]()
实际场景: http加密的重要手段,现代大量加密场景等。
总结
总的来说,加密是我们开发过程中必不可少的一环,针对不同的环境,做出不同的加密手段是我们作为开发者必不可少的综合技能~
| 特性 | Hash加密 | 对称加密 | 非对称加密 | 混合加密 |
|---|---|---|---|---|
| 加密类型 | 加密存储 | 加密传输 | 加密传输 | 加密传输 |
| 核心原理 | 单向散列函数 | 相同密钥加解密 | 公钥加密,私钥解密 | 非对称加密保护对称密钥 |
| 密钥数量 | 无密钥(有盐值) | 1个共享密钥 | 2个密钥(公钥+私钥) | 3个密钥(非对称对+对称密钥) |
| 安全性 | 防篡改,不可逆 | 依赖密钥安全 | 依赖数学难题安全 | 综合安全等级最高 |
| 推荐场景 | 需要验证但不需要解密的场景 | 内部系统、大量加密 | 密钥分发、身份认证 | 公网通信、高安全要求 |
制作不易 礼貌集赞
![]()