RSA和AES结合使用
接上篇的RSA和AES算法加密之后,AES对称算法对数据量大的加密比较快,而RSA公私钥加密的话会影响加密效率,但是AES的加密与解密的密钥是一致的,导致密钥不能外泄,密钥在网络传输过程中,很有可能会导致密钥外泄。
由此可以将RSA和AES两种结合起来,让RSA来加密AES密钥,AES加密内容,这样效率和安全性都能得到保障。
以下是一个流程图和流程说明。
1.服务端产生RSA密钥对,把公钥发给客户端
2.客户端的明文文用AES密钥加密生成密文,然后通过RSA公钥加密AES密钥,就生成了key和info
3.把这两个发送给服务端,用RSA私钥解密得到AES密钥
4.再用AES密钥去解密密文,得到明文
注册登录时的密码加密
MD5加盐
这是一篇比较详细的关于MD5的原文链接:https://blog.csdn.net/china_jeffery/article/details/78789108
MD5是MD5消息摘要算法的简称(英语:MD5 Message-Digest Algorithm),是一种广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(即哈希值),用于确保信息传输的完整性。MD5由罗纳德·李维斯特设计,于1992年公开,用以取代MD4算法。这套算法的程序在RFC 1321 中被加以规范。
将数据(如一段文字)运算变为另一固定长度值,是散列算法的基础原理。
MD5已经被证实可以被碰撞破解。对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。
只要明文相同,那么MD5加密后的密文就相同,于是攻击者就可以通过撞库的方式来破解出明文。 https://www.cmd5.com/ 这是一个破解MD5的网站,是收集了大量的MD5密文和明文的一个库,所以现在的MD5并不安全。
这是我构想的一个密码传输的流程:(如果有哪里不对或者有更好的欢迎交流)
这时候就需要加点佐料,让它变变味儿啦。
加盐的算法有很多,考虑到加盐的目的(防止拥有系统底层权限的人员),想做到绝对不可反查是很困难的,需要有其他软件或者硬件的协助,在很多场景下的实用性比较差。如果只是想增加反查的难度,倒是有很多方法可以选择,一种便利的方法是md5(Password+UserName),即将用户名和密码字符串相加再MD5,这样的MD5摘要基本上不可反查。但有时候用户名可能会发生变化,发生变化后密码即不可用了(验证密码实际上就是再次计算摘要的过程)。
所以要MD5加盐了,“盐”指的是计算机动态生成的随机码,这个随机码会与密码一起被MD5进行散列计算,再与生成序列一同存进数据库。再次进行登录验证密码时,由于经过散列计算处理的数据不可逆向恢复,所以需通过对输入密码结合随机码进行散列计算,将得到的值再去数据库进行匹配
MD5是不可逆的,所以就算是管理员打开数据库中的数据时也是经过加密的,这样更保障了数据的安全性,在我们日常中需要忘记密码了,也是只能改密码并不能获取到原来的密码。
因此我们做了一个非常简单的算法,每次保存密码到数据库时,都生成一个随机16位数字,将这16位数字和密码相加再求MD5摘要,然后在摘要中再将这16位数字按规则掺入形成一个48位的字符串。在验证密码时再从48位字符串中按规则提取16位数字,和用户输入的密码相加再MD5。按照这种方法形成的结果肯定是不可直接反查的,且同一个密码每次保存时形成的摘要也都是不同的。
或者 可以往密码中加盐的时候,固定加的位置,比如说从第三位到第六位是盐等等,使得其他人获取不到真正的密码。