iOS 常见信息编码 加密的各种方法
来源:互联网 发布:java基础面试题2017 编辑:程序博客网 时间:2024/05/21 12:44
一.base64
1.1 简介
Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个“=”。例:将对ABC进行BASE64编码首先取ABC对应的ASCII码值。A(65)B(66)C(67)。再取二进制值A(01000001)B(01000010)C(01000011),然后把这三个字节的二进制码接起来(010000010100001001000011),再以6位为单位分成4个数据块并在最高位填充两个0后形成4个字节的编码后的值(00010000)(00010100)(00001001)(00000011)。蓝色部分为真实数据。再把这四个字节数据转化成10进制数得(16)(20)(19)(3)。最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D)。这里的值实际就是数据在字符表中的索引。
注:BASE64字符表:包括大写 A-Z 小写 a-z 数字 0-9 和+ /解码过程就是把4个字节再还原成3个字节再根据不同的数据形式把字节数组重新整理成数据.
1.2 base64的加密原则base64加密原则: 6 bit(原8bit) 一个字节. 不足的位数 用0 补齐.两个0 用一个 = 表示.
1.3 加密特点:数据加密之后,数据量会变大,变大 1/3 左右.
1.4 使用步骤加密:
1> 将要加密的数据转为二进制的NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
2> 进行base64 加密
NSString *base64String = [data base64EncodedStringWithOptions:0];
3> 写入文件:
解密
1> 将要解密的文件转为二进制数据 NSData *baseData = [[NSData alloc] initWithBase64EncodedString:base64String options:0];
2> 将解密后产生的二进制数据转为字符串
NSString *baseStr = [[NSString alloc] initWithData:baseData encoding:NSUTF8StringEncoding];
3> 写入文件
二.散列算法
散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。
散列算法可以用来加密token生成签名, 以便token信息不暴露在网络同时还能验证登录的有效性。
2.1 MD5简介MD5的全称是Message-DigestAlgorithm 5,Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一定长的大整数。请注意我使用了"字节串"而不是"字符串"这个词,是因为这种变换只与字节的值有关,与字符集或编码方式无关。 MD5将任意长度的"字节串"变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。
MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被"篡改"。举个例子,你将一段话写在一个叫readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的"抵赖",这就是所谓的数字签名应用。
MD5还广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不"知道"用户的密码是什么。
注: MD5加密是不可逆的,也就是说, MD5加密后是不能解密的,所谓的解密只是用大数据的”试用”,来测出结果的.
加密方式 NSString *password = @"zhang";
password = [password md5String];
注:单纯的 MD5加密是不安全的,因此要用到 MD5加盐的方式
2.3
MD5加盐
1 盐值:MD5加盐的值,加的盐值越高越好.(盐值可以随意添加)
2 试用步骤:
1> 生成盐值NSString *salt = @”盐值”;
2> 拼接盐值password = [password stringByAppendingString:salt];
3> 加密password = password.md5String;
2.4 SHA-1
全名: 安全哈希算法(Secure Hash Algorithm)输出: 160bit
与Md5比较
相同点:因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似。不同点:1. 对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。2. 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。3. 速度:在相同的硬件上,SHA-1的运行速度比MD5慢。
三. 时间戳/动态密码
1> 实现目标用户的密码是一定的,但是每次发送给网络的密码都不同.相同的密码相同的加密算法,每次获得的值不同.客户端和服务器端的时间是相同的.
2> 原理客户端和服务器端依时间为基准采用相同的加密算法
3> 实现细节客户端和服务器端要求时间一致时间精度越高,越安全客户端:发送网络请求的时候依当前时间为基准进行加密.服务器端:以接收到时间为基准进行加密.还要以接收到的时间的前一分钟时间为基准进行加密.服务器端:判断这两次的密码和客户端发送的密码是否一致.
4> 实现步骤
// 1. 当前密码 NSString *password = @"zhang"; // 2. hmacKey值,是对“WangPengfei” 进行 MD5加密之后的值(动态生成的) NSString *hmacKey = @"d3bba33b51acaa0a272de7a2f6dfa233";
// 1. 第一次加密:第一次 HMAC 运算 password = [password hmacMD5StringWithKey:hmacKey]; // 2.1 获得当前的时间 NSDate *date = [NSDate date]; // 2.2 获得当前时间的字符串 // 实例化时间格式器 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // 设置时间格式 formatter.dateFormat = @"yyyy-MM-dd HH:mm"; // 获取当前时间(要和服务器保持一致) NSString *dateStr = [formatter stringFromDate:date];
// 3. 将第一次加密后的密码与当前时间的字符串拼接在一起 password = [password stringByAppendingString:dateStr]; // 4. 进行第二次 HMAC 加密 password = [password hmacMD5StringWithKey:hmacKey];
四.钥匙串存储--SSKeychain 第三方框架>
钥匙串:可以在钥匙串中直接写入明文密码,钥匙串比较安全钥匙串的存储
1> 要写入的密码 NSString *password = @"zhang";
2> 取出应用的唯一标示符NSString *bundleID = [NSBundle mainBundle].bundleIdentifier;
3> 写入[SSKeychain setPassword:password forService:bundleID account:kUserNameKey]
钥匙串的读取:
根据钥匙串的唯一标示符取出密码
NSString *password = [SSKeychain passwordForService:bundleID account:kUserNameKey];
五.Cookie
是一个网络信息块,用来存储信息
cookie 会自动登录,会将 cookie 中保存的数据自动发给服务器
查看 cookie 中信息:注: NSHTTPCookieStorage中保存了cookie 的所有信息
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
取出storage 中的cookie 信息storage.cookies enumerateObjectsUsingBlock:^(NSHTTPCookie * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSHTTPCookie *cookie = obj;
NSLog(@"cookie:%@",cookie);
}];
}
六.对称加密算法优点:算法公开、计算量小、加密速度快、加密效率高、可逆缺点:双方使用相同钥匙,安全性得不到保证现状:对称加密的速度比公钥加密快很多,在很多场合都需要对称加密,相较于DES和3DES算法而言,AES算法有着更高的速度和资源使用效率,安全级别也较之更高了,被称为下一代加密标准 nECB :电子代码本,就是说每个块都是独立加密的nCBC :密码块链,使用一个密钥和一个初始化向量 (IV)对数据执行加密转换 ECB和CBC区别:CBC更加复杂更加安全,里面加入了8位的向量(8个0的话结果等于ECB)。在明文里面改一个字母,ECB密文对应的那一行会改变,CBC密文从那一行往后都会改变。 ECB终端命令:$ openssl enc -des-ecb -K 616263 -nosalt -in msg1.txt -out msg1.binCBC终端命令:$ openssl enc -des-cbc -K 616263 -iv 0000000000000000 -nosalt -in msg1.txt -out msg2.bin
DES
DES是Data Encryption Standard(数据加密标准)的缩写。DES是一个分组加密算法,他以64位为分组对数据加密。同时DES也是一个对称算法:加密和解密用的是同一个算法。它的密匙长度是56位(因为每个第8位都用作奇偶校验),密匙可以是任意的56位的数,而且可以任意时候改变。其中有极少量的数被认为是弱密匙,但是很容易避开他们。所以保密性依赖于密钥。
DES对64(bit)位的明文分组M进行操作,M经过一个初始置换IP置换成m0,将m0明文分成左半部分和右半部分m0=(L0,R0),各32位长。然后进行16轮完全相同的运算,这些运算被称为函数f,在运算过程中数据与密匙结合。经过16轮后,左,右半部分合在一起经过一个末置换,这样就完成了。在每一轮中,密匙位移位,然后再从密匙的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位,并通过一个异或操作替代成新的32位数据,在将其置换换一次。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,其结果成为新的右半部分,原来的右半部分成为新的左半部分。将该操作重复16次,就实现了。
解密过程:在经过所有的代替、置换、异或盒循环之后,你也许认为解密算法与加密算法完全不同。恰恰相反,经过精心选择的各种操作,获得了一个非常有用的性质:加密和解密使用相同的算法。DES加密和解密唯一的不同是密匙的次序相反。如果各轮加密密匙分别是K1,K2,K3….K16那么解密密匙就是K16,K15,K14…K1
七.RSA加密RSA非对称加密算法非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密特点:非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了
优点:
- RSA是目前最有影响力的公钥加密算法
- RSA的安全性依赖于大数分解,所以安全性很高
- 今天只有短的RSA钥匙才可能被强力方式解破,安全
缺点:
- 产生密钥很麻烦
- 速度太慢.速度一直是RSA的缺陷。一般来说只用于少量数据加密。
- RSA的速度比对应同样安全级别的对称密码算法要慢1000倍左右。
基本加密原理:(1)找出两个“很大”的质数:P & Q(2)N = P * Q(3)M = (P – 1) * (Q – 1)(4)找出整数E,E与M互质,即除了1之外,没有其他公约数(5)找出整数D,使得E*D除以M余1,即 (E * D) % M = 1经过上述准备工作之后,可以得到:E是公钥,负责加密D是私钥,负责解密N负责公钥和私钥之间的联系加密算法,假定对X进行加密(X ^ E) % N = Yn根据费尔马小定义,根据以下公式可以完成解密操作(Y ^ D) % N = X 但是RSA加密算法效率较差,对大型数据加密时间很长,一般用于小数据。常用场景:分部要给总部发一段报文,先对报文整个进行MD5得到一个报文摘要,再对这个报文摘要用公钥加密。然后把报文和这个RSA密文一起发过去。总部接收到报文之后要先确定报文是否在中途被人篡改,就先把这个密文用私钥解密得到报文摘要,再和整个报文MD5一下得到的报文摘要进行对比 如果一样就是没被改过。
0 0
- iOS 常见信息编码 加密的各种方法
- iOS 常见的加密方法
- iOS的各种加密方法使用简介
- iOS的各种加密方法使用简介
- iOS里常见的加密方法
- iOS常见的几种加密方法
- iOS常见的几种加密方法
- ios常见加密解密方法
- ios常见加密解密方法
- ios常见加密解密方法
- ios常见加密解密方法
- ios常见加密解密方法
- IOS常见的加密方法,常用的MD5和Base64
- IOS常见的加密方法,常用的MD5和Base64
- IOS常见的加密方式
- 各种常见编码的转换算法
- iOS里常见的几种信息加密步骤简单总结
- iOS最常见的MD5加密
- C语言编写注释风格转换
- C++11比C++98(普通C++)的新特性
- task_struct源码
- 浮动专题
- GIT篇之常用git命令
- iOS 常见信息编码 加密的各种方法
- 欢迎使用CSDN-markdown编辑器
- Android 学习资源链接
- Java 注解那些事儿
- tableau中关于聚合函数的汇总(目的通过EXCEL表转置成--预算岗组薪资明细)
- Interesting drink
- 线段树练习题三
- PHP在windows和Linux下安装redis扩展
- hdu2181哈密顿绕行世界问题