一、哈希算法
验证数据完整性可以用哈希算法。对发送数据和接收数据的哈希值进行比对,如果一致,证明接收数据与发送数据一致,及数据完整。
SDK提供了哈希算法有关的API,支持MD2、MD4、MD5、SHA-1、SHA224、SHA256、SHA384、SHA512算法。方法声明在< CommonCrypto/CommonDigest.h >
举例:MD5算法API使用方法
MD5加密,结果为32位十六进制数(一个字符8位,一个十六进制数4位,所以1个字符的位置可以装2个十六进制数,因此32位十六进制数可以用16个字符的数组来装)。
(1)加密字符串:
extern unsigned char *CC_MD5(const void *data, CC_LONG len, unsigned char *md)
第一个参数为明文;
第二个参数为明文的长度,要把长度强制转换成CC_LONG类型;
第三个参数为用来承接密文的字符数组,数组长度就是16,可以用宏定义CC_MD5_DIGEST_LENGTH表示。
(2)加密任意对象:
先将对象转换成NSData类型(可以先将对象转换成文件,再从文件读`出NSData)
NSData *data = DataFromCertainObject。。。
需要一个类型为CC_MD5_CTX的伴随指针:
CC_MD5_CTX c;
需要一个用来承接密文的unsigned char数组:
unsigned char dataEncrypted[CC_MD5_DIGEST_LENGTH];
然后执行加密流程:
CC_MD5_Init(&c);
CC_MD5_Update(&c, data.bytes, (CC_LONG)data.length);
CC_MD5_Final(dataEncrypted,&c);
注意以上方法的参数类型。
(3) 要把unsigned char数组转换成十六进制字符串输出,就把char
数组的字符一个个地以%2X的格式输出。
for (int i=0; i<CC_MD5_DIGEST_LENGTH; i++) {
NSLog(@“%02X”,charArray[i]);
}
二、基于哈希算法的身份验证hmac
客户端用服务器发送来的随机数加用户密码一起计算哈希值(hash1),并发送给服务器。服务器用其发送给客户端的随机数以及收到的用户密码一起计算哈希值(hash2),与从客户端收到的哈希值进行比对,如果一致(hash1=hash2)则通过验证。
SDK提供了算法,方法声明在< CommonCrypto/CommonHMAC.h >中。