在密码学上,加密和解密使用的是同一个秘钥的称为对称加密。对称加密的秘钥一般比较短,小于256kbit,
当然,秘钥越大,安全性就更强,但是加密和解密的过程耗时也就更长,其中权衡,取决于实际应用场景。
优点:计算量小,简单快速,适合于对海量数据进行加密处理;
缺点:加密人和解密人需要拥有同一把秘钥,那秘钥如果通过 不安全的通道进行传输,就存在被黑客窃听的风险,安全性丧失;
同时双方还需要好好管理秘钥,不能泄露秘钥,否则也不安全了,管理秘钥成本较高。
常见对称加密算法: DES、AES、3DES、IDEA、Blowfish、RC4、RC5、RC6
非对称加密算法需要两个密钥:公共秘钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
优点:消除了用户交换密钥的需要,安全性提高;
缺点:加密、解密耗时较长;
常见非对称加密算法:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)
ps:所以在实际应用场景中,一般把 秘钥 采用非对称加密,数据采用对称加密。
MD5和SHA。SHA又包括 SHA-1 和 SHA-2(SHA-224、SHA-256、SHA-384、SHA-512) 和SHA-3。
1、MD5直接加密 ( Message-Digest Algorithm-信息摘要算法),种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
特点:a、压缩性:任意长度的数据,可以算出固定长度;
b、不可逆:只有加密,没有对应的解密算法;
//演示下在vue项目中使用MD5
//step1 安装依赖
npm install js-md5 -S
//step2 在main.js 全局引入
import md5 from 'js-md5';
Vue.prototype.$md5 = md5;
//step3 在逻辑中使用
this.$md5('password');
//实际开发中,可能整个项目只有登录的时候会用到MD5,这时建议采用单页面引用,安装依赖之后,在登录组件引入插件
import md5 from 'js-md5';
let pw = md5('password');//使用
//在非vue项目中,下载好md5.js后使用script标签引入即可
<script src="js/md5.js" type="text/javascript"></script>
2、MD5加盐
MD5直接加密虽然不可逆,但抵不住网上大把解密网站,通过事先存储各种字符组合的 Hash 加密结果,然后提供查询;即使是两层的 md5 加密也有可能通过彩虹表的方式进行破译,所以MD5直接加密已经不够安全,这时候就需要给密码加盐,以降低被破译的风险;加盐就是人为的通过一组固定字符或随机字符与用户原密码组合形成一个新的字符。
let salt = '234gherh4jbvfdhbdfi#@$@2156&4$';//尽可能复杂
let pw = this.$md5(salt+this.password); //pw就是加盐加密后的密码
3、SHA-256
SHA256算法使用的哈希值长度是256位。这是一个抽象类。此类的唯一实现是SHA256Managed;
//step1 安装依赖
npm install js-sha256
//step2 在组件中引入
let sha256 = require("js-sha256").sha256;
//step3 在方法中使用
let pw = sha256(this.passWord)
就像运送一车泥土不需要用到战备装甲车,运送一车钞票不能用拖拉机一样,前端加密的方式还有很多,要选择怎样的加密机制需要根据实际业务需求确定,适合的才是最好的。
ps:这里简单介绍了前端加密,需要注意的是,对于用户密码而言,不能因为前端加密了,后端就直接把前端加密得到的字符串直接存储到数据库,这是很危险的,前后端都要进行加密!比如前端MD5加密之后,后端进行第二次md5加密后再把密码存进数据库,这样即使用户密码在传输过程中被窃听,黑客也无法进行登录,因为被窃听的密码和数据库存储的密码不匹配。
ps:简单记录一下,若有不恰当之后,欢迎指正!