本文共 2186 字,大约阅读时间需要 7 分钟。
哈希算法,哈希函数,散列是一个东西
Hash的特点:
1.算法是公开的 2.对相同数据运算,不同平台上,用的同样的算法,得到的结果是一样的。 3.对不同的数据进行运算,如MD5得到的结果都是32个字符长度的字符串。‘123456’加密后32个字符。一张图片,一个电影的数据加密后也是32个字符。 4.这玩意儿没法逆运算 5.信息摘要。信息”指纹“,是用来做数据识别的。 Hash后的数据只有32位,(是16进制)能表示的数据只有16的32次方种。但是原始数据是无限种可能。 两个不一样的数据拥有相同的Hash值的时候,称为散列碰撞。必然会发生散列碰撞。 终端MD5:md5 -s '1234'0x80x10xd…
1.用户密码的加密
MD5, SHA1/256/512 ( 256,512 是加密强度的不同) HMAC是一个加密方案,关于hash RSA是非对称,不属于hash 2.收索引擎 3.版权 4.数字签名密码-》服务器
几乎所有的用户都会绑定手机号,支付宝+微信,用户有个习惯,很多地方用的密码是一样的。用户在这丢失的数据,可能导致用户其他的经济损失。 密码肯定不能明文发给服务器。 服务器如何验证收到的加密的密码 //1.服务器保存的密码, 使用同样的加密算法,对用户密码(123456)进行加密然后匹配(e10adc3949ba59abbe56e057f20f883e) //2.第二种,服务器直接保存hash值,进行匹配。使用第二种。服务器不允许保存用户的密码。万一服务器数据库被黑。以前APP有找回密码,现在只有重置密码了。 //AES,RSA,都是加密过后进行解密的。不适合做用户密码的加密。 但是hash加密后也有可能会被暴力破解出来。如图 https://www.cmd5.com这个网站并不是把密文解密,因为hash是不可逆的这是不可能的,只是通过穷举字符组合的方式试出来的加盐的方式也不安全,所以出现了HMAC.
NSString *pwd=[@"123456" hmacMD5StringWithKey:@"hank"];//HMAC NSLog(@"现在的密码是:%@",pwd);
HMAC用一个密钥进行加密,并且做两次散列(MD5)
实际开发中,密钥key是来自服务器的。每一个账号对应一个key值,在注册的时候随机生成的,开发者也不知道这个值。所以账号不能重复。 服务器保存HMAC加密后保存的密码。 服务器需要保存1.账号,2.key 3.HMAC key可以保存到本地沙盒,本地客户端保存key的时候按账号保存。更换手机后,本地没有key,向服务器要,(需要之前的手机授权,就是设备锁功能),给了之后再登陆。 没有黑客对key感兴趣,拿key去碰撞出密码,成本太高,而且key是可以更换的 key值可以更换,长期未登陆,需要重新登陆一下,当用户下一次登陆的时候,用旧的匹配登陆上,更换KEy,记录新的HMAC。删除APP后也是重新更换key. 可能用到第三方库的时候,iOS 和安卓的加密结果不一样。那么就用终端加密看结果。严格意义上hash不是加密算法,因为不能解密。
有个问题,知道账号和hash值,往服务器模拟发送,依然可以登陆。
所以发给服务器端的不能是原始的HMAC. 客户端:201907012111是服务器返回的时间戳 1.用户输入密码 2.(HMAC(密码)+‘201907012111’).md5。发给服务器服务器:
1.(HMAC(密码)+‘201907012112’).md5 1.(HMAC(密码)+‘201907012111’).md5 两种情况只要匹配到一个成功就登陆成功。只匹配到2次。如果延迟超过2分钟,2分钟都登陆不上,其实超过8秒钟就应该提示:你的网络不好。(参考高德,永远不会提示自己的服务器不好,而是提示你的网络不好) 如图: 永远都是相对安全。 用iOS自带的加密算法,也是会有安全隐患的。 比如iOS逆向工程–》技术 ,分析APP源码。破解,插件开发,比如破解版不付费。 动态调试–〉HOOK拦截到比如 CC_MD5(str, (CC_LONG)strlen(str), buffer);拦截到这些函数的参数。那么这些数据在加密之前是裸奔的。 所以出现了很多第三方安全公司。 那么怎么防护呢? 1.反调试,2.加固(混淆)3.反重签 4.越狱检测 5.白名单检测等将元素数据-》hash-〉RSA-》(将元始数据和元始数据的hash再RSA的数据发给服务器)服务器
这样中间黑客就最多篡改元素数据是不可能改hash,RSA后的数据的。 服务器验证:把元素数据的hash值算出来,然后RSA解密hash,RSA后的数据。对比是否一致。https://github.com/ShaeZhuJiu/ios-hash-HMAC.git
转载地址:http://diwin.baihongyu.com/