MD5:
MD5全称为信息-摘要算法(哈希算法),是计算机安全领域的散列函数,用于确保消息的完整性。另外摘要算法还有SHA1,具体请度娘。MD5是一种单向加密,它的加密不可逆,它将任意长度的字符串,经过算法计算后生成固定长度的数据,一般为16位表示 。这种加密方式最简单同时也最直接
**过程:**创建账号时,将账号对应密码的MD5存储数据库,登录时,对用户输入的密码进行MD5加密传送到服务器端,根据账号从数据库查询出该账号对应的MD5值进行对比,判断是否相同。MD5也是弱加密
**缺点:**字典表很大。在https://www.cmd5.com ,存储超过90万亿个密码,很快速查询到一些密码强度不复杂的密码。
vue项目使用:
npm安装:
npm install --save js-md5
引用:
1,局部使用
npm install --save js-md5
2,全局引用:
import md5 from 'js-md5';
Vue.prototype.$md5 = md5;
使用:
import md5 from 'js-md5'
password: md5.encrypt('需要加密得字符'),// md5.encrypt()方法进行加密
AES:
高级加密标准(AES - Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的),这种加密相对md5更复杂一些,在项目使用中也稍微复制一点点。
过程: 秘钥固定在客户端代码和后端代码中,登录时使用固定密码将明文密码加密传输到后端,后端使用相同的固定秘钥解密,然后查询用户存储在数据库的密码,进行对比认证。
缺点: 秘钥硬编码于客户端代码中,存在泄漏风险。
对称加密算法与非对称加密算法的区别:
1:对称加密算法
加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。
缺点是密钥的传输比较麻烦。
2:非对称加密算法
加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。
优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。
实际中:一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。
vue项目使用:
npm安装:
npm install crypto-js --save-dev
引用:
npm install --save js-md5
使用:这里需要进行加工一层,封装一些方法使得我们项目使用更方便。
在项目中定义如下方法,我这里是单独放在
import CryptoJS from 'crypto-js'
export default {
//随机生成指定数量的32进制key
generatekey(num) {
const library = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
let key = ''
for (let i = 0; i < num; i++) {
let randomPoz = Math.floor(Math.random() * library.length)
key += library.substring(randomPoz, randomPoz + 1)
}
return key
},
//加密
encrypt(word, keyStr) {
// 判断是否存在keyStr,不存在就用默认的keyStr(注意:这个keyStr必需要前后端统一,不然双方加密解密后会不相同。)
keyStr = keyStr ? keyStr : '前后端规定一个秘钥默认值,可以从keyStr传入不传取默认值'
const key = CryptoJS.enc.Utf8.parse(keyStr)
const srcs = CryptoJS.enc.Utf8.parse(word)
const encrypted = CryptoJS.AES.encrypt(srcs, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
})
return encrypted.toString()
},
//解密
decrypt(word, keyStr) {
keyStr = keyStr ? keyStr : '前后端规定一个秘钥默认值,可以从keyStr传入不传取默认值'
const key = CryptoJS.enc.Utf8.parse(keyStr)
const decrypt = CryptoJS.AES.decrypt(word, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
})
return CryptoJS.enc.Utf8.stringify(decrypt).toString()
},
}
具体使用:这里使用也很简单,在使用到得地方局部引入,可以在全局引入,这里只有一个页面用到就使用了局部引入使用。
import aes from '@/util/aes'
password: aes.encrypt('需要加密得字符'), // aes.encrypt就是我们定义的加密方法
参考博客:https://blog.csdn.net/qq_28205153/article/details/55798628