博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 密码学二
阅读量:3731 次
发布时间:2019-05-22

本文共 2186 字,大约阅读时间需要 7 分钟。

文章目录

用户登陆密码需要加密
加密算法-》运用-〉安全

Hash

哈希算法,哈希函数,散列是一个东西

在这里插入图片描述

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.数字签名

密码加密(Hash)

密码-》服务器

几乎所有的用户都会绑定手机号,支付宝+微信,用户有个习惯,很多地方用的密码是一样的。用户在这丢失的数据,可能导致用户其他的经济损失。
密码肯定不能明文发给服务器。
在这里插入图片描述
服务器如何验证收到的加密的密码
//1.服务器保存的密码, 使用同样的加密算法,对用户密码(123456)进行加密然后匹配(e10adc3949ba59abbe56e057f20f883e)
//2.第二种,服务器直接保存hash值,进行匹配。使用第二种。服务器不允许保存用户的密码。万一服务器数据库被黑。以前APP有找回密码,现在只有重置密码了。
//AES,RSA,都是加密过后进行解密的。不适合做用户密码的加密。
但是hash加密后也有可能会被暴力破解出来。如图
在这里插入图片描述
https://www.cmd5.com这个网站并不是把密文解密,因为hash是不可逆的这是不可能的,只是通过穷举字符组合的方式试出来的

加盐

在这里插入图片描述

这时候就不可能被试出来了。
在这里插入图片描述
盐,越长,越复杂越好,不能随便写,web,andord,服务器端这个盐都必须是一样的。
开发者都会知道这个盐。如果盐写死,一旦泄漏,而且泄漏的可能性很大。
后来出现了HMAC

HMAC

加盐的方式也不安全,所以出现了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后的数据。对比是否一致。

Hash代码

https://github.com/ShaeZhuJiu/ios-hash-HMAC.git

转载地址:http://diwin.baihongyu.com/

你可能感兴趣的文章
汇编 输入输出指令
查看>>
汇编语言 外部中断
查看>>
汇编语言 判断学生成绩是否及格
查看>>
汇编语言 ORG伪指令
查看>>
Xshell 连接 Ubuntu
查看>>
智能指针学习笔记
查看>>
MySQL8.0.19 Windows10安装
查看>>
Centos7 Docker安装
查看>>
SpringBoot2.x整合MyBatis
查看>>
Linux安装JDK1.8
查看>>
SpringBoot-Package打包
查看>>
Redis常用基础指令
查看>>
MySQL使用insert语句时查询最大值作为ID插入!
查看>>
解决MySQL8.0X中函数过程未能正常创建报错 1418等
查看>>
IDEA启动Java项目GC异常处理
查看>>
获取MySQL中所有的数据列类
查看>>
JS操作地址栏参数
查看>>
吃透JAVA中异常处理机制
查看>>
实现一个带有动效的 React 弹窗组件
查看>>
一觉醒来,竟发现自己看不懂 JS 了?
查看>>