密码学之散列

【哈希(散列函数)】

MD5
SHA1
SHA256(512)

【对称加密算法】

DES
3DES
AES(高级密码标准,美国国家安全局使用的加密算法)

Ps:苹果内部的钥匙串访问用的就算AES。

【非对称加密算法 】

RSA



散列

特点:

1、数据不可反算(不可逆运算)。
2、算法公开。
3、对相同的数据加密,得到的结果是一样的。
4、对不同的数据加密得到的结果是定长。 (MD5 -> 32个字符。10G电影->32个字符)
5、信息摘要,信息“指纹”。

用途

【用途一:密码安全方面】

服务器的逻辑:
1、服务器只会保存用户加密之后的32位的字符串!!
2、服务器在用户注册的那一刻就保存了明文密码加密之后的字符串!!

如果服务器保存的原始密码,请啪啪打脸你们的后台。

方法一:直接MD5加密

网站进行加密

https://md5jiami.51240.com/

终端进行加密

终端可以直接md5

pwd = pwd.md5String

非常不安全。三岁小孩都能破。
更别说传明文密码了。真的是要死。
什么?不会破?
给你个链接:http://www.cmd5.com/
24万亿条数据来给你对比。

方法二:加盐

早期的一种方式。

盐要足够复杂。(shift+数字键盘,胡乱的拍~)

拼接字符串加盐,然后md5,就相对比较安全。

static NSString * salt = @"lkajsd;flj)(*@$!#(*&OJKD(*&)291IOJPOIHOIDS@#$U(*)_Q#R()IJD*(F_U";

pwd = [pwd stringByAppendingString:salt].md5String

但是有个问题哈,如果某一天这个程序员搞事情,有矛盾,这哥们把盐泄露了。就GG了。

那你说,离职了改盐啊,那你低版本的用户请问如何登录?
强制用户都重置密码啊!
那你就666了。

所以说盐一旦写死,就不可更改了。

方式三:HMAC加密

目前非常流行,而且很多大公司在用。

使用一个密钥加密,做两次散列!

    pwd = [pwd hmacMD5StringWithKey:@"key"];

在真实的开发中,这个key从服务器获取。

啥时候获取?
获取验证码返回或者登录前多做一次网络请求啊,根据需求来搞。

【使用HMAC加密的流程】

注册:
1、发送账号给服务器。
2、然后服务器随机生成一个密钥key返回给客户端。
3、客户端把这个key保存在本地。(推荐钥匙串)
4、输入密码 HMAC加密,服务器保存一个密码。

换了手机后:
1、先判断本地有没有密钥。
2、没有密钥,服务器返回密钥

那么就会出现个问题,我每次拿个新手机,登录下别的手机号,你就把密钥给我岂不是不安全?然后我再拼拼凑凑密码,试一试,搞一搞。
所以,类似于设备锁的东西就出来了。

设备锁的问题:
用了新手机,服务器向老设备发送请求,是否同意新手机登录,同意了,后台给新设备发送key。这样就可以大部分的避免胡乱下发key。

如果没有类似设备锁的东西,可以通过手机验证码,邮箱等等,确定是否发送key给新设备。

总之,下面验证这步,要尽量安全就可以了。

【有些黑客是拦截网络请求,不需要知道你的real pwd,而是模拟登录进行操作。】

我们的目标:每次登录的请求的字符串都不一样!!!

//密码hmac + 时间 ,然后md5
(密码.HMAC + "201703182138" ).md5

请求的时候,一般都是返回服务器的时间戳。避免用户手机时间不对。
在合适的地方网络请求得到服务器的时间。

服务器保存的是 密码.HMAC
然后后台对比现在的时间,然后 .md5
如果现在对比不成功,继续对比上一次的时间 然后.md5
对比两次是留下网络延迟的时间。
两次验证都不成功,则失败。

黑客一般都是获取了大量的用户数据后,统一进行破解操作,所以加个时间限制,更安全。

【用途二:搜索问题】

在使用搜索引擎的时候,几个关键字不管我们如何颠倒关键字,得到的搜索的结果都是一致的。

原理:
比方说,搜索的时候,有两个关键字 A & B。

不管A和B的位置如何,只要A 的MD5值 和B的MD5值 相加,和是一样的,搜索出来的结果就是一样的。

A + B = B + A = result

【用途三:版权问题】

比如说有两个图片:一个是原图A,一个是截屏原图得到的图片B。

虽然二者看起来差不多,肉眼不那么容易识别,但是正版A和盗版B的md5值是完全不同的。(和文件名无关、和后缀名无关)

MD5是根据文件内容的二进制进行加密的,但是文件内容稍微有些不同,md5后的结果也是非常大的。所以通过MD5后的结果很容易看出来哪个是假的。

但是如果是复制,把磁盘的二进制进行复制,得到的内容是一致的,这个时候就判断不出来了。但是我们市面看的都是作者源文件进行更改后发布的,源文件是进行备案的,所以源文件只有作者知道。只要对比MD5,和备案的一匹配结果就出来了。

Tips:
文件压缩后,md5的值是不一样的。
解压缩后,md5的值和源文件是一样的。

【用途四:百度云以及360】

百度云有个秒传功能。

原理:
对比文件的MD5值!!只要二者文件的MD5值相同,就会秒传。

如何更改文件的MD5值呢?

方法1、压缩一下。你的MD5值就变了。

方法2、采取一种编码方式改变MD5。
推荐用base64(base64是可以反算的)。

base64 皮卡丘.png -o 芈月传.txt

base64 芈月传.txt -o 皮卡丘.png -D

如果我们想保存我们个人比较安全的资料,我们可以自定义个算法,修改这个芈月传.txt里面的内容,然后保存。

取出的时候,运用这个算法,得到正确的芈月传.txt内容,然后base64回来原来的皮卡丘.png.

查看文件的MD5值。

WiKs-Air:Desktop WiKi$ md5 /Users/apple/Desktop/iOS新技术.png 
MD5 (/Users/apple/Desktop/iOS新技术.png) = 7e2c1e5a0f19a301902465cf2f362716

WiKs-Air:Desktop WiKi$ md5 iOS新技术.png 
MD5 (iOS新技术.png) = 7e2c1e5a0f19a301902465cf2f362716

闲谈:是否可以用指纹登陆?

当然不可以啦!

指纹:判断这个人是否是手机的主人
密码:判断这个人是否是账号的主人

你可能感兴趣的:(IT)