您的代码不会产生预期的结果,因为
引用的md5()
函数将消息摘要返回为
十六进制编码的字符串,然后进行 Base64 编码。所以而不是
String -> UTF-8 data -> MD5 digest -> Base64 encoding
你正在做
String -> UTF-8 data -> MD5 digest -> hex encoding -> Base64 encoding
对函数的一个小修改返回消息摘要
作为数据:
func md5(string string: String) -> NSData {
var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0)
let data = string.dataUsingEncoding(NSUTF8StringEncoding)! // Conversion to UTF-8 cannot fail
CC_MD5(data.bytes, CC_LONG(data.length), &digest)
return NSData(bytes: digest, length: digest.count)
}
现在您可以计算 Base 64 编码的 MD5 摘要:
let string = "Hello World"
// Compute MD5 message digest:
let md5data = md5(string: string)
print("md5data = \(md5data)") // md5data = <b10a8db1 64e07541 05b7a99b e72e3fe5>
// Convert to Base 64 encoded string:
let base64 = md5data.base64EncodedStringWithOptions([])
print("base64 = \(base64)") // base64 = sQqNsWTgdUEFt6mb5y4/5Q==
This is almost你所期望的。 Java 代码显然会产生
所谓的“base64url”变体,没有填充
(比较https://en.wikipedia.org/wiki/Base64#Variants_summary_table https://en.wikipedia.org/wiki/Base64#Variants_summary_table).
因此我们必须修改两个字符并删除填充:
let base64url = base64
.stringByReplacingOccurrencesOfString("+", withString: "-")
.stringByReplacingOccurrencesOfString("/", withString: "_")
.stringByReplacingOccurrencesOfString("=", withString: "")
print("base64url = \(base64url)") // base64url = sQqNsWTgdUEFt6mb5y4_5Q
现在的结果是sQqNsWTgdUEFt6mb5y4_5Q
,并且与什么相同
你从Java代码中得到的。