在项目中当我们提交用户的隐私数据时,比如:登陆密码、银行账号等,一定要使用POST
请求提交用户的这些隐私数据。因为GET
请求的所有参数都直接暴露在URL
中。同时请求的URL
一般会记录在服务器的访问日志中,服务器的访问日志是黑客攻击的重点对象之一。
仅仅用POST
请求提交用户的隐私数据,还是不能完全解决数据安全的问题,我们可以利用软件(比如Charles)设置代理服务器,拦截查看手机的请求数据。因此:提交用户的隐私数据时,一定不要明文提交,要加密处理后再提交。
另外,我们也不应该在本地保存用户的隐私数据的明文
。
常见的加密算法:MD5 \ SHA \ DES \ 3DES \ RC2和RC4 \ RSA \ IDEA \ DSA \ AES。
针对上述加密算法,我把目前流行的几种加密方式做下分类:
哈希(散列)函数
对称加密算法
非对称加密算法
重点说一下散列函数的特点:
利用这些特点,我们在项目中的应用:
加密密码
:服务器并不需要知道用户真实的密码!
搜索
:比如你要搜索“张老师 杨老师 苍老师”和“苍老师 张老师 杨老师”,其实这两个要搜索的内容所表达的意思是一样的,但是我们应该如何判断呢。我们可以对搜索的每个关键字进行散列,得到三个相对应的结果,按位相加结果如果是一样的,那搜索的内容就是一样的!
张老师 1bdf605991920db11cbdf8508204c4eb
杨老师 2d97fbce49977313c2aae15ea77fec0f
苍老师 692e92669c0ca340eff4fdcef32896ee
版权
: 版权保护,文件识别。例如可以对文件内容进行MD5,然后可以根据该MD5串判断文件内容是否被修改过。我以前做IM的文件上传功能就是这样判断的,如果文件内容的MD5相同,表示该文件已经在服务器存在了,就不用再次上传了。
由于MD5
加密算法具有较好的安全性,而且免费,因此该加密算法被广泛使用。不过遗憾的是该加密算法已经被暴力破解了,http://www.cmd5.com该网站记录超过24万亿条,共占用160T硬盘 的密码数据,通过对海量数据的搜索得到的结果!
不过我们可以通过提升MD5加密的安全性,加大被破解的难度。
1
. 加“盐”(佐料)。2
. HMAC:给定一个”秘钥”,对明文进行加密,并且做”两次散列”!-> 得到的结果,还是 32 个字符。
RSA算法中,每个通信主体都有两个钥匙,一个公钥一个私钥。就是有2把钥匙:使用publicKey可以对数据进行加密,使用Key才能对数据进行解密。
特点:单方向传输
用公钥加密的数据,只有私钥能解开(可用于加密);
同时,使用私钥加密的数据,只有公钥能解开(签名)。但是速度很慢(比私钥加密慢100到1000倍);
公钥与私钥:
1.权威数字认证机构(CA)给所有通信主体(个人或组织)颁发公钥和私钥,彼此配对,分别唯一。
2.私钥好比数字指纹,同时具有解密和加密功能。个人保管,不公开。
3.公钥好比安全性极高的挂号信箱地址,公开。
举例:若甲有一份需保密的数字商业合同发给乙签署。经过如下步骤:
从以上步骤,我们知道:
1.Base64简单说明:
描述:Base64可以成为密码学的基石,非常重要。
特点:可以将任意的二进制数据进行Base64编码
结果:所有的数据都能被编码为并只用65个字符就能表示的文本文件。
65字符:A~Z a~z 0~9 + / =
对文件进行base64编码后文件数据的变化:编码后的数据~=编码前数据的4/3,会大1/3左右。
2.命令行进行Base64编码和解码:
编码:base64 123.png -o 123.txt
解码:base64 123.txt -o test.png -D
3.Base64编码原理:
1)将所有字符转化为ASCII
码;
2)将ASCII码转化为8
位二进制;
3)将二进制3
个归成一组(不足3
个在后边补0
)共24
位,再拆分成4
组,每组6
位;
4)统一在6
位二进制前补两个0
凑足8
位;
5)将补0
后的二进制转为十进制;
6)从Base64编码表获取十进制对应的Base64编码;
处理过程说明:
a.转换的时候,将三个byte的数据,先后放入一个24bit
的缓冲区中,先来的byte占高位。
b.数据不足3byte
的话,于缓冲区中剩下的bit用0补足。然后,每次取出6
个bit,按照其值选择查表选择对应的字符作为编码后的输出。
c.不断进行,直到全部输入数据转换完成。
d.如果最后剩下两个输入数据,在编码结果后加1
个“=”;
e.如果最后剩下一个输入数据,编码结果后加2
个“=”;
f.如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
4.在项目中的应用:
1)从iOS7.0 开始,苹果就提供了base64的编码和解码支持
2)如果是老项目,则还能看到base64编码和解码的第三方框架,如果当前不再支持iOS7.0以下版本,则建议替换。
代码实现:
//给定一个字符串,对该字符串进行Base64编码,然后返回编码后的结果
-(NSString *)base64EncodeString:(NSString *)string
{
//1.先把字符串转换为二进制数据
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
//2.对二进制数据进行base64编码,返回编码后的字符串
return [data base64EncodedStringWithOptions:0];
}
//对base64编码后的字符串进行解码
-(NSString *)base64DecodeString:(NSString *)string
{
//1.将base64编码后的字符串『解码』为二进制数据
NSData *data = [[NSData alloc]initWithBase64EncodedString:string options:0];
//2.把二进制数据转换为字符串返回
return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}
$ echo -n A | base64
$ echo -n QQ== |base64 -D