Base64
Base64
要求把每三个8Bit
的字节转换为四个6Bit
的字节(3*8 = 4*6 = 24)
,然后把6Bit
再添两位高位0,组成四个8Bit
的字节,也就是说,转换后的字符串理论上将要比原来的长1/3
。base64
编码构成 :a-z, A-Z, 0-9, +/
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,需要解码后才能阅读。
转换实例:
转换前 11111111, 11111111, 11111111 (二进制)
转换后 00111111, 00111111, 00111111, 00111111 (二进制)
上面的三个字节是原文,下面的四个字节是转换后的Base64编码,其前两位均为0。
转换后,我们用一个码表来得到我们想要的字符串(也就是最终的Base64编码),这个表是这样的:(摘自RFC2045)
在 Objective-C 中使用 base64 编码解码:
- (NSString )base64:(NSData )data { return [data base64EncodedStringWithOptions:0]; }
- (NSData )base64:(NSString )string { return [[NSData alloc] initWithBase64EncodedString:string options:0]; }哈希(散列)算法
算法公开;
- 对不同数据加密结构是定长的! 32位字符!!
- 加密后的数据是不可逆的,
-
MD5
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
MD5算法具有以下特点:
- 1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
- 2、容易计算:从原数据计算出MD5值很容易。
- 3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
- 4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人**前被”压缩“成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。
- 原理:
对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。 - 使用: 通常我们习惯对 MD5 加密的数据进行 base64编码后输出. ```objectivec
(NSData )md5WithData:(NSData )hashData { unsigned char *digest; digest = malloc(CC_MD5_DIGEST_LENGTH);
CC_MD5([hashData bytes], (CC_LONG)[hashData length], digest);
NSData *md5Data = [NSData dataWithBytes:digest length:CC_MD5_DIGEST_LENGTH]; free(digest); return md5Data; } ```
SHA
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
- SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2。SHA-1在许多安全协定中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的杂凑函数)的后继者。但SHA-1的安全性如今被密码学家严重质疑;虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的杂凑算法。
应用:
SHA-1, SHA-224, SHA-256, SHA-384 和 SHA-512都被需要安全杂凑算法的美国联邦政府所应用,他们也使用其他的密码算法和协定来保护敏感的未保密资料。FIPS PUB 180-1也鼓励私人或商业组织使用SHA-1 加密。Fritz-chip将很可能使用SHA-1 杂凑函数来实现个人电脑上的数位版权管理。
首先推动安全杂凑算法出版的是已合并的数位签章标准。
SHA杂凑函数已被做为SHACAL分组密码算法的基础。+ (NSData *)sha1WithData:(NSData *)hashData
{
unsigned char *digest;
digest = malloc(CC_SHA1_DIGEST_LENGTH);
CC_SHA1([hashData bytes], (CC_LONG)[hashData length], digest);
NSData *sha1Data = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
free(digest);
return sha1Data;
}
HMAC
HMAC Hash-based Message Authentication Code, 哈希消息认证码.
HMAC是相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个和一个消息为输入,生成一个消息摘要作为输出。就是所谓的加盐 !
- 运算作用定义HMAC需要一个加密用散列函数(表示为H,可以是MD5或者SHA-1)和一个**K。我们用B来表示数据块的字节数。(以上所提到的散列函数的分割数据块字长B=64),用L来表示散列函数的输出数据字节数(MD5中L=16,SHA-1中L=20)。鉴别的长度可以是小于等于数据块字长的任何正整数值。应用程序中使用的长度若是比B大,则首先用使用散列函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的。一般情况下,推荐的最小[](https://link.jianshu.com/?t=https%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E5%25AF%2586%25E9%2592%25A5)K长度是L个[字节](https://link.jianshu.com/?t=https%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E5%25AD%2597%25E8%258A%2582)。
- 验证TPM接受的授权数据和认证数据;
- 确认TPM接受到的命令请求是已授权的请求,并且,命令在传送的过程中没有被改动过。
算法表示
算法公式 : HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M)) [1]
H 代表所采用的HASH算法(如SHA-256)
K 代表认证密码
Ko 代表HASH算法的密文
M 代表一个消息输入
B 代表H中所处理的块大小,这个大小是处理块大小,而不是输出hash的大小
如,SHA-1和SHA-256 B = 64
SHA-384和SHA-512 B = 128
L 表示hash的大小
Opad 用0x5c重复B次
Ipad 用0x36重复B次
Apad 用0x878FE1F3重复(L/4)次HMAC的应用
hmac主要应用在身份验证中,它的使用方法是这样的:在这个过程中,可能遭到安全攻击的是服务器发送的随机值和用户发送的hmac结果,而对于截获了这两个值的黑客而言这两个值是没有意义的,绝无获取用户密码的可能性,随机值的引入使hmac只在当前会话中有效,大大增强了安全性和实用性。大多数的语言都实现了hmac算法,比如php的mhash、python的hmac.py、java的MessageDigest类,在web验证中使用hmac也是可行的,用js进行md5运算的速度也是比较快的。- (1) 客户端发出登录请求(假设是浏览器的GET请求)
- (2) 服务器返回一个随机值,并在会话中记录这个随机值
- (3) 客户端将该随机值作为**,用户密码进行hmac运算,然后提交给服务器
- (4) 服务器读取用户数据库中的用户密码和步骤2中发送的随机值做与客户端一样的hmac运算,然后与用户发送的结果比较,如果结果一致则验证用户合法.
认证流程
(1) 先由客户端向服务器发出一个验证请求。
(2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端。
(3) 客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的**进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。
(4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户**进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户
+ (NSData *)hmacSha1WithData:(NSData *)hashData hmacKey:(NSString *)key
{
unsigned char *digest;
digest = malloc(CC_SHA1_DIGEST_LENGTH);
const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), [hashData bytes], [hashData length], digest);
NSData *hmacData = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
free(digest);
cKey = nil;
return hmacData;
}
对称加密算法
- 类型: DES(数据加密标准), 3DES, AES(高级密码标准)
- ECB(Electronic Codebook,电码本)模式是分组密码的一种最基本的工作模式。在该模式下,待处理信息被分为大小合适的分组,然后分别对每一分组独立进行加密或解密处理。
ECB模式作为一种基本工作模式,具有操作简单,易于实现的特点。同时由于其分组的独立性,利于实现并行处理,并且能很好地防止误差传播。 另一方面由于所有分组的加密方式一致,明文中的重复内容会在密文中有所体现,因此难以抵抗统计分析攻击。 因此,ECB模式一般只适用于小数据量的字符信息的安全性保护,例如**保护。 - CBC(Cipher Block Chaining)/密文分组链接方式.
它的实现机制使加密的各段数据之间有了联系。其实现的机理如下:加密步骤如下:
1)首先将数据按照8个字节一组进行分组得到D1D2……Dn(若数据不是8的整数倍,用指定的PADDING数据补位)
2)第一组数据D1与初始化向量I异或后的结果进行DES加密得到第一组密文C1(初始化向量I为全零)
3)第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2
4)之后的数据以此类推,得到Cn
5)按顺序连为C1C2C3……Cn即为加密结果。 解密是加密的逆过程,步骤如下:
1)首先将数据按照8个字节一组进行分组得到C1C2C3……Cn
2)将第一组数据进行解密后与初始化向量I进行异或得到第一组明文D1(注意:一定是先解密再异或)
3)将第二组数据C2进行解密后与第一组密文数据进行异或得到第二组数据D2
4)之后依此类推,得到Dn
5)按顺序连为D1D2D3……Dn即为解密结果。
这里注意一点,解密的结果并不一定是我们原来的加密数据,可能还含有你补得位,一定要把补位去掉才是你的原来的数据。
- CFB
- OFB