文章目录
  1. 1. 数据安全
  2. 2. 加密方法
  3. 3. RSA加密算法
  4. 4. Base64补充

数据安全


在项目中当我们提交用户的隐私数据时,比如:登陆密码、银行账号等,一定要使用POST请求提交用户的这些隐私数据。因为GET请求的所有参数都直接暴露在URL中。同时请求的URL一般会记录在服务器的访问日志中,服务器的访问日志是黑客攻击的重点对象之一。

仅仅用POST请求提交用户的隐私数据,还是不能完全解决数据安全的问题,我们可以利用软件(比如Charles)设置代理服务器,拦截查看手机的请求数据。因此:提交用户的隐私数据时,一定不要明文提交,要加密处理后再提交。

另外,我们也不应该在本地保存用户的隐私数据的明文

加密方法


常见的加密算法:MD5 \ SHA \ DES \ 3DES \ RC2和RC4 \ RSA \ IDEA \ DSA \ AES。

针对上述加密算法,我把目前流行的几种加密方式做下分类:

  • 哈希(散列)函数

    • MD5(Message Digest Algorithm 5,译为“消息摘要算法第5版”)
    • SHA1
    • SHA256
  • 对称加密算法

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

    • RSA

重点说一下散列函数的特点:

  • 算法是公开的;
  • 对相同的数据加密,得到的结果是一样的;
  • 对不同的数据加密,得到的结果是定长的。例如:MD5对不同的数据进行加密,得到的结果都是32个字符长度的字符串;
  • 信息摘要,信息”指纹”,是用来做数据识别的!比如:搜索;
  • 不能反算的,即是不可逆的。

利用这些特点,我们在项目中的应用:

加密密码:服务器并不需要知道用户真实的密码!

搜索:比如你要搜索“张老师 杨老师 苍老师”和“苍老师 张老师 杨老师”,其实这两个要搜索的内容所表达的意思是一样的,但是我们应该如何判断呢。我们可以对搜索的每个关键字进行散列,得到三个相对应的结果,按位相加结果如果是一样的,那搜索的内容就是一样的!
张老师 1bdf605991920db11cbdf8508204c4eb
杨老师 2d97fbce49977313c2aae15ea77fec0f
苍老师 692e92669c0ca340eff4fdcef32896ee

版权: 版权保护,文件识别。例如可以对文件内容进行MD5,然后可以根据该MD5串判断文件内容是否被修改过。我以前做IM的文件上传功能就是这样判断的,如果文件内容的MD5相同,表示该文件已经在服务器存在了,就不用再次上传了。

由于MD5加密算法具有较好的安全性,而且免费,因此该加密算法被广泛使用。不过遗憾的是该加密算法已经被暴力破解了,http://www.cmd5.com该网站记录超过24万亿条,共占用160T硬盘 的密码数据,通过对海量数据的搜索得到的结果!

不过我们可以通过提升MD5加密的安全性,加大被破解的难度。

1. 加“盐”(佐料)。
2. HMAC:给定一个”秘钥”,对明文进行加密,并且做”两次散列”!-> 得到的结果,还是 32 个字符。

RSA加密算法


RSA算法中,每个通信主体都有两个钥匙,一个公钥一个私钥。就是有2把钥匙:使用publicKey可以对数据进行加密,使用Key才能对数据进行解密。

特点:单方向传输
用公钥加密的数据,只有私钥能解开(可用于加密);
同时,使用私钥加密的数据,只有公钥能解开(签名)。但是速度很慢(比私钥加密慢100到1000倍);

公钥与私钥:

1.权威数字认证机构(CA)给所有通信主体(个人或组织)颁发公钥和私钥,彼此配对,分别唯一。
2.私钥好比数字指纹,同时具有解密和加密功能。个人保管,不公开。
3.公钥好比安全性极高的挂号信箱地址,公开。

举例:若甲有一份需保密的数字商业合同发给乙签署。经过如下步骤:

  1. 甲用乙的公钥对合同加密。
  2. 密文从甲发送到乙。
  3. 乙收到密文,并用自己的私钥对其解密。
  4. 解密正确,经阅读,乙用自己的私钥对合同进行签署。
  5. 乙用甲的公钥对已经签署的合同进行加密。
  6. 乙将密文发给甲。
  7. 甲用自己的私钥将已签署合同解密。
  8. 解密正确,确认签署。

从以上步骤,我们知道:

  1. 用公钥加密的密文能且只能用与其唯一配对的私钥才能解开。
  2. 如果某份密文被解开,那么肯定是密文的目标信息主体解开的。
  3. 私钥因其唯一标识所有者的属性,被用于数字签名,具有法律效力。

Base64补充


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以下版本,则建议替换。

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//给定一个字符串,对该字符串进行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];
}

终端测试命令:

1
2
$ echo -n A | base64			
$ echo -n QQ== |base64 -D
文章目录
  1. 1. 数据安全
  2. 2. 加密方法
  3. 3. RSA加密算法
  4. 4. Base64补充