+
 新版

md5的值不一样,想问下编码问题。。。

wei2013 发布于 2013/03/05 15:27
阅读 4K+
收藏 1
NSString *string = @"admin";
const char *cStr=[string cStringUsingEncoding:NSUTF16StringEncoding];
unsigned char result[32];
CC_MD5(cStr, strlen(cStr), result);
使用NSUTF8StringEncoding md5后是21232f297a57a5a743894a0e4a801fc3
NSUTF16StringEncoding 是0cc175b9c0f1b6a831c399e269772661
但是我们有个接口后台admin加密是19a2854144b63a8f7617a6f225019b12
我想问下各位大哥这个是用那个编码加密后是19a2854144b63a8f7617a6f225019b12
加载中
0
布鲁诗文

其实用NSUnicodeStringEncoding或者NSUTF16StringEncoding也是可以的(实际上objective-c里NSUTF16StringEncoding = NSUnicodeStringEncoding)...

但是似乎上述两种编码转换出来的char *会有'\0'结束符,所以导致用strlen()计算长度就会不对,改成下面这样计算长度,也是可以得到19A2854144B63A8F7617A6F225019B12的加密结果的:

+ (NSString *) md5:(NSString *)str {
    const char *cStr = [str cStringUsingEncoding:NSUTF16StringEncoding];
	unsigned char result[CC_MD5_DIGEST_LENGTH];
	CC_MD5( cStr, [str length] * 2, result );
	return [NSString
			stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
			result[0], result[1],result[2], result[3],result[4], result[5],result[6], result[7],
			result[8], result[9],result[10], result[11],result[12], result[13],result[14], result[15]
            ];
}

0
風一樣的男子
風一樣的男子

一般不会直接拿源字符串MD5加密的,大部分情况都会加盐

0
w
wei2013

就想问下admin怎么使用md5可以得到19a2854144b63a8f7617a6f225019b12哦?

0
小纯洁
小纯洁
md5算法是一样的,对admin进行md5,肯定是21232f297a57a5a743894a0e4a801fc3
0
w
wei2013

引用来自“小纯洁”的答案

md5算法是一样的,对admin进行md5,肯定是21232f297a57a5a743894a0e4a801fc3

admin的编码我试了utf-8或者utf-16后md5是不一样的,但是就是没有一个跟后台接口的一样,后台又改变不了的

0
南湖船老大
南湖船老大
我试了下常用的编码没得出这个结果,不大可能是纯MD5了,可能是md5(a+salt)了,加了salt了
0
出云之月
出云之月
应该是 salted
0
布鲁诗文

确实是编码问题,估计后台那边用的是Unicode

你可以试试这个:

+ (NSString *) md5:(NSString *)str {
	
    NSData *utf16data = [str dataUsingEncoding:NSUTF16LittleEndianStringEncoding];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5([utf16data bytes], [utf16data length], result);
    
    return [NSString
			stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
			result[0], result[1],result[2], result[3],result[4], result[5],result[6], result[7],
			result[8], result[9],result[10], result[11],result[12], result[13],result[14], result[15]
            ];
}

Log:

[Line 33] admin - 19A2854144B63A8F7617A6F225019B12




0
w
wei2013

引用来自“妖魔舞”的答案

我试了下常用的编码没得出这个结果,不大可能是纯MD5了,可能是md5(a+salt)了,加了salt了
api文档是” 明文的Unicode(UCS-16)格式经过MD5 加密后的32 位的字符串 ”,所以应该不是+salt的,有加的话文档应该会说的。。。我搜索过,c#里md5是 19a2854144b63a8f7617a6f225019b12。。
0
南湖船老大
南湖船老大

引用来自“布鲁诗文”的答案

确实是编码问题,估计后台那边用的是Unicode

你可以试试这个:

+ (NSString *) md5:(NSString *)str {
	
    NSData *utf16data = [str dataUsingEncoding:NSUTF16LittleEndianStringEncoding];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5([utf16data bytes], [utf16data length], result);
    
    return [NSString
			stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
			result[0], result[1],result[2], result[3],result[4], result[5],result[6], result[7],
			result[8], result[9],result[10], result[11],result[12], result[13],result[14], result[15]
            ];
}

Log:

[Line 33] admin - 19A2854144B63A8F7617A6F225019B12




我在本地用unicode格式保存为文件,用md5校验工具试的,也不是这个结果。。。OC不会
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部