对称加密
在对称加密算法中,加密使用的密钥和解密使用的密钥是相同的。也就是说,加密和解密都是使用的同一个密钥。
对称加密的缺点
1、密钥的数目难于管理。因为对于每一个合作者都需要使用不同的密钥,很难适应开放社会中大量的信息交流;
2、对称加密算法一般不能提供信息完整性的鉴别。它无法验证发送者和接受者的身份;
3、对称密钥的管理和分发工作是一件具有潜在危险的和烦琐的过程。对称加密是基于共同保守秘密来实现的,采用对称加密技术的贸易双方必须保证采用的是相同的密钥,保证彼此密钥的交换途径必须是安全可靠的,同时还要设定防止密钥泄密和更改密钥的程序。
常用算法:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES
非对称加密
指加密和解密使用不同密钥的加密算法。非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey)。
公钥与私钥是一对存在,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用密钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
非对称加密的缺点
1、算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。
2、就是由于像RSA这种非对称加密算法相对于对称加密算来说效率较低,通常RSA算法用来加密小数据,如对称加密使用的密钥等。
常用算法:RSA、ECC(椭圆曲线加密算法)、Diffie-Hellman、El Gamal、DSA(数字签名用)
前端向服务器传递加密数据
前端向服务器传递加密数据比较容易,对于原文数据,直接使用服务器的非对称加密公钥对数据进行加密,然后使用ajax把密文提交即可。
服务器向前端传递加密数据
前端可以先生成一个随机对称密钥A,然后用服务器的非对称加密公钥对密钥A进行加密,然后密文提交服务器。服务器使用私钥解析出密钥A,然后用A对待返回数据加密,之后返回。前端则使用密钥A对数据解析,拿到原文,实现思路基本如此。
非对称加密的使用
<!--引入jsrsasign库-->
<script src="https://cdn.bootcss.com/jsrsasign/8.0.12/jsrsasign-all-min.js"></script>
<script type="text/javascript">
//公钥pubK,密钥对一般用工具生成
let pubK = '-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqKe4qcEmS+pZECaYTi8Zu+La0JZXCO9yJX6GvqX/gAQgq/8NYiqY0LLM5jlYOomj2mSEovp/kbe5OSnQyfaewbbww0RhyV1muTMQ6GLFskTHfSe3dbRmom3Wa3VC8YmQ4fedSWI2RkneLgBl5NXKJuIfL1ErBvmf9r8Y8oT1R/QIDAQAB-----END PUBLIC KEY-----';
//私钥priK
let priK = '-----BEGIN PRIVATE KEY-----MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKop7ipwSZL6lkQJphOLxm74trQllcI73Ilfoa+pf+ABCCr/w1iKpjQsszmOVg6iaPaZISi+n+Rt7k5KdDJ9p7BtvDDRGHJXWa5MxDoYsWyRMd9J7d1tGaibdZrdULxiZDh951JYjZGSd4uAGXk1com4h8vUSsG+Z/2vxjyhPVH9AgMBAAECgYEAobWxUYFeWiBr9wKYYlDd5g3US0TAmlKbFa3dEPvquy0f3wUqVpWEt2aXeCYNIGE1kMwbWAY4GzRhWOOmo2kIlrP/UXSMYN0McDcUIKS63TxMzrlJMGDATKnLecm25RriRmRk8RMNqfftbiwUI67hYaN4jl0FddbeIbrgNUWYyt0CQQDXQmgGylWQ47ocvU3Q3u/x5dvmVaQHd2fPOrid4O6pWS+HpKEIjxQvAIP9YTpCphNSD2mSu/lzKre1pNWRsDL/AkEAyl6VfSZBmTyjJyrvc0Rfto65mDdje9GoHMO6oYZK2CpfICX0cpzs2Q/bmejJX9fiF+tuOSPu3Ed16JAYWfhHAwJAdtdsw0L11pZDbBZ/Xa+XXT+AFjx14MFliJ1sy40hdlGM0iBr32POytxIAp2pIp65z/Y+XQp2f8S3xAsK9fIHVQJAV76rEpiD2O1x0InNSS1cUsuPrXBWslk1i0NSqLaRvSiiFk5er1NbXsKBdTp6FhSE89og8KWj698QQMY5yMjeAQJADefUHbEFgM1rZAbc3hOVMWTRgjpYucRXBYTK8iPn4XKn9k6DboAOX39qDCRipsylvA1VSvjqe5LLnXXSCHVNvQ==-----END PRIVATE KEY-----';
//原文
let src = '你好世界';
// 使用公钥加密,得到密文enc
var pub = KEYUTIL.getKey(pubK);
var enc = KJUR.crypto.Cipher.encrypt(src, pub);
// 使用私钥解密enc
var prv = KEYUTIL.getKey(priK);
var dec = KJUR.crypto.Cipher.decrypt(enc, prv);
console.log(dec);//你好世界
</script>
对称加密的使用
<!--引入crypto-js库-->
<script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
<script type="text/javascript">
//密钥,十六位十六进制数
const key = CryptoJS.enc.Utf8.parse("1234123412ABCDEF");
//密钥偏移量,十六位十六进制数
const iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412');
//解密方法
function decrypt(str, key, iv) {
let encryptedHexStr = CryptoJS.enc.Hex.parse(str);
let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
let decrypt = CryptoJS.AES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
//加密方法
function encrypt(str, key, iv) {
let srcs = CryptoJS.enc.Utf8.parse(str);
let encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.ciphertext.toString().toUpperCase();
}
</script>
网友评论