Obj-C MD5 哈希与 Java / SQL 不匹配



我正在尝试获取一个 unicode 字符串,通过 MD5 哈希函数传递它,并将结果编码为 Base64。 我需要MSSQL,Java和Obj-C都返回相同的结果。 我同意MSSQL和Java,但是使用Obj-C无法获得相同的结果。

Java code (return "SC0RfYWqWLK/YNpIDdGi8w==")

String input = "chinese lorem ipsum 槏殟殠巘斖蘱飣偓啅撱簻臗";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] inputBytes = input.getBytes("UTF-16LE");
md.update(input.getBytes("UTF-16LE"));
byte[] enc = md.digest();
String md5Sum = new sun.misc.BASE64Encoder().encode(enc);
System.out.println(md5Sum);

MSSQL code (return "SC0RfYWqWLK/YNpIDdGi8w==")

DECLARE @Str nvarchar(200)
SET @Str = N'chinese lorem ipsum 槏殟殠巘斖蘱飣偓啅撱簻臗'
DECLARE @Bin varbinary(max)
SET @Bin = HashBytes('MD5', @Str);
DECLARE @Hash char(24)
SET @Hash = CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@Bin"))', 'NVARCHAR(MAX)')
PRINT @Hash

Obj-C code (返回 "vZRPxuE84whftlx697i/Ig==")

NSString *input = @"chinese lorem ipsum 槏殟殠巘斖蘱飣偓啅撱簻臗";
NSData *data = [input dataUsingEncoding:NSUnicodeStringEncoding allowLossyConversion:NO];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5(data.bytes, data.length, digest);
NSData *hashData = [[NSData alloc] initWithBytes:digest length: sizeof digest];
NSString *base64 = [hashData base64EncodedString];
NSLog(@"%@", base64);

请您帮助我让 Obj-C 返回与其他值相同的值。 它将在iOS应用程序中运行。 谢谢。

不是这里的专家,而只是一个猜测 - 您是否尝试过使用 NSUTF16LittleEndianStringEncoding 编码来初始化字符串中的数据?

我怀疑问题可能是Java和MSSQL没有在字符串的开头添加字节顺序标记,而dataUsingEncoding:allowLossyConversion:with NSUnicodeStringEncode。

您可以通过检查java和objective-c中实际UTF-16数据的大小(甚至可能是实际内容,如果这不是问题)来验证这一点。

最新更新