前段时间写了一个外包项目,其中有一个地方甲方要求使用加密编码,将请求的参数用 MD5 加密然后转 base64 发送过去 其实这么看是一个很简单的操作,于是乎便复制粘贴上了代码

const char *cStr = [input UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
    [output appendFormat:@"%02x", digest[i]];
NSData *data = [output dataUsingEncoding:NSUTF8StringEncoding];
NSData *base64Data = [data base64EncodedDataWithOptions:0];
NSString *baseString = [[NSString alloc]initWithData:base64Data encoding:NSUTF8StringEncoding];
return baseString;
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSData *base64Data = [data base64EncodedDataWithOptions:0];
NSString *baseString = [[NSString alloc]initWithData:base64Data encoding:NSUTF8StringEncoding];
return  baseString;

然鹅……请求接口之后告诉我加密的参数不对 于是乎便去问甲方爸爸,然后他说:byte[] -> md5 -> base64,其中 MD5 转完还是 byte[] 鉴于甲方是有安卓和 Java 后台的原因 然后我就……

OS:这是啥?这玩应怎么弄?MD5 转完还是 byte[] 是个什么鬼? 于是去了解了一下 byte[] 是个啥,然后又找了朋友研究一下这个问题,了解到 Java 的话都是直接操作的 byte[],他们就没往 string 转(正确来讲是 Java 的 MD5 只能用 byte[]) 紧接着我们又顺便百度解了一下 MD5 原理:

直到这时,Java 基友看出了一些端倪题:

紧接着,通过对比 OC 代码,返现了一个小小的端倪:

于是乎从此着手,log 打印 digest,发现他就是 byte[] ,至此,第一步探索成功:

其实到此为止主要的问题就已经讲完了,其实 MD5 加密就是对要加密的数据先转换成 byte[] 数组 然后再加密成最终的 MD5 的字符串 我们要根据实际情况的需要来决定取 byte[] 数组(即:unsigned char digest)还是 MD5 字符串 之后便是后续进行 base64 加密了,附上完整代码:

学习至此,与君共勉