Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数
HASH的特点:
1.算法是公开的
2.对相同数据运算,得到的结果是一样的
3.对不同数据运算,如MD5得到的结果默认是128位固定的长度,32个字符(16进制标识)
4.没法逆运算(无限的数据得到有限的数据,那么一定会存在一个或者多个相同的HASH值表示不同的数据,专业术语叫做散列碰撞)
5.信息摘要,信息“指纹”,是用来做数据识别的HASH的用途:
•用户密码的加密
•搜索引擎
•版权
•数字签名
聊一聊:
服务器数据库直接存放用户密码可以吗?
答:不行,其一:这样的话数据库泄漏了,麻烦就大了,用户的所有信息都泄漏了,其二:用户密码明文,开发人员、运营人员等等,大家都知道用户的隐私信息,不安全。
结论:用户密码保存在数据库里需要进行加密!!用RSA加密可以吗?
RSA安全性来说确实比较安全,传输的时候不怕被破译,但是,保存在数据库里的还是明文,数据库被攻破了,还是会泄漏,有的小伙伴肯定又会说,那么保持在数据库的用密文不就行了吗?这样都是密文,就算数据库被攻破了,也无法获取用户的真实密码,这样不就安全了吗?答案是否定的,只要有公钥public key,私钥private key,我就有办法解密获取明文,开发人员都有,运营人员也有,只要有公钥私钥,就能获取明文,不安全。-
那么要怎么样做,才能保证保存在数据库里面的密码是相对安全的呢?
用HASH,不可逆运算,但是不能用简单的HASH,例如md5,因为有个网站https://www.cmd5.com/ 记录了很多简单的md5值解密等等,那么给一个加盐可以吗,加盐可以,但是也不是很安全,看下图,这个网站已经把常用的一些加密方式给记录起来了,把无聊做到了极致,就是牛!!
最终方案,用HMAC,两次散列运算,第一次明文进行md5,然后第二次拿到key,这个key通过后台服务器接口获取,密文拼接上key在进行一次md5,两次md5,key的传输过程中可以用RSA加密,保证传输的安全性,这个一个用户对应一个key,每个用户拿到的key都是不一样的,相对安全。 那么问题来了,我不用破解你的密码,我直接抓包获取你加密的数据,然后模拟你的登录请求不就行了吗?
是的,密码安全性保证了,但是别人不破解也能用,模拟登录,那么我们还需要进行进一步的处理,就是刚刚两次md5的HMAC在拼接上一个时间,这个时间是服务器返回的时间,格式可以是yyyy-MM-HHhh-mm-ss,然后再进行md5加密,这样,当我们登录请求的时候,服务端接受到我们的请求,客户端和服务端协商好一个时间范围,在这个时间范围内,都认为是成功的,超过这个约定的时间,就都失败,服务端拿到当前时间,加上数据库保存的密码HMAC进行md5,然后进行对比,如果一样登录成功,否则,在约定的时间范围内继续尝试,如果对比都匹配不上,就返回登录失败。数字签名
验证内容的真实性
发送端,发送内容,然后用RSA加密内容的HASH值,然后进行网络传输,RSA加密安全系数比较高,很难破译,接受端接受到内容的时候,首先使用RSA解密获取到HASH值,然后再把接受到的内容获取一下HASH值,然后吧解密出来的HASH值和内容HASH值进行对比,如果一样,说明是没有被篡改过的,否则,就是被修改过,不安全。对称加密:
AES(高级密码标准)
DES(数据加密标准(用得少,因为强度不够)
3DES(使用3个密钥,对相同的数据执行3次加密,强度增强)
应用模式:
•ECB(Electronic Code Book):电子密码本模式。每一块数据,独立加密。
最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。
•CBC(Cipher Block Chaining):密码分组链接模式。使用一个密钥和一个初始化向量[IV]对数据执行加密。
明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。
•CBC可以有效的保证密文的完整性,如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密。
终端命令
//aes-128-ecb加密
echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
//aes-128-ecb解密
echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d
//aes-128-cbc加密
echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
//aes-128-cbc解密
echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt -d