常见的算法可以分为以下三类

  1. 对称加密(AES)

对称加密算法是指加密和解密采用相同的密钥,是可逆的(即可解密)。

AES 常见

var CryptoJS = require("crypto-js");

var data = { id: 1, text: "Hello World" };

// 加密生成密文
var ciphertext = CryptoJS.AES.encrypt(
  JSON.stringify(data),
  "secret_key_123"
).toString();

// 解密得到明文
var bytes = CryptoJS.AES.decrypt(ciphertext, "secret_key_123");
var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
  1. 非对称加密算法(RSA)

非对称加密算法是指加密和解密采用不同的密钥(公钥和私钥),因此非对称加密也叫公钥加密,是可逆的(即可解密)。

RSA 加密算法既可以用来做数据加密,也可以用来数字签名。

--数据加密过程:发送者用公钥加密,接收者用私钥解密(只有拥有私钥的接收者才能解读加密的内容)

--数字签名过程:甲方用私钥加密,乙方用公钥解密(乙方解密成功说明就是甲方加的密,甲方就不可以抵赖)

使用场景: https 会话前期、CA 数字证书、信息加密、登录认证等

// 使用公钥加密
var publicKey = "public_key_123";
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
var encrypted = encrypt.encrypt("Hello World");

// 使用私钥解密
var privateKey = "private_key_123";
var decrypt = new JSEncrypt();
decrypt.setPrivateKey(privateKey);
var uncrypted = decrypt.decrypt(encrypted);
  1. 线性散列算法算法(MD5、SHA1、HMAC)

就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射, 也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值

简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

var hash = md5("Hello World");
// b10a8db164e0754105b7a99be72e3fe5

常见的业务 http 请求中, aes 的密钥在前端随机生成,从服务器获取 rsa 的公钥,对 aes 的密钥进行非对称加密,把加密后的密钥在请求头中传给服务器,用 aes 对 body 进行加密。 服务器收到请求头中的加密后的密钥,用 rsa 的密钥进行解密,得到明文的 aes 密钥,即可对 body 进行解密。

常见的对称加密算法有:AES、DES、3DES 所以你可以将对称加密简单理解为:一方通过密钥将信息加密后,把密文传给另一方,另一方通过这个相同的密钥将密文解密,转换成可以理解的明文。

非对称加密不同于对称加密,它有一对秘钥,一个称为公钥(publicKey) ,另一个称为私钥(privateKey),并且*只知道公钥是无法推算出私钥。

常见的非对称加密算法有:RSA、DSA、ECC 另外,这种算法还有一个特别神奇的功能,那就是通过公钥加密的内容,只有私钥才可以解开,而通过私钥加密的内容,只有公钥才可以解开。

公钥、私钥的用法:

第一种用法:公钥加密,私钥解密。---用于加解密

既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;

第二种用法:私钥签名,公钥验签。---用于签名

既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证。

这里提一点:签名 ≠ 加密,通俗点说加密就是你哪怕看到了不该看到的东西,也理解不了。而签名就是你做了任何事,都抵赖不了。

那为什么非对称加密比对称加密慢

这是因为对称加密主要的运算是位运算,速度非常快,如果使用硬件计算,速度会更快。以 AES 算法为例,如下图所示,其运算本质上来说就是位移和替换。

但是非对称加密计算一般都比较复杂,比如 RSA,它里面涉及到大数乘法、大数模等等运算。其加解密可以用下面的公式来表示:

最后更新于

这有帮助吗?