如何在swift中将字符串(在Java中使用加密MessageDigest)编码为Base64字符串?
在Java中,我使用了这个:
In Java, I used this:
public void encryptData() {
String data = "Hello World";
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
if (md == null) {
return;
}
md.update(data.getBytes());
String dataEncoded = Base64.encodeToString(md.digest(), 11);
return dataEncoded; //print: sQqNsWTgdUEFt6mb5y4_5Q
}
如何在Swift中获得相同的结果?
How do I do have the same results in Swift?
更新:
func test() -> Void {
var data: String = "Hello World"
data = md5(data)
data = base64Encode(data)
print("data = \(data)") //YjEwYThkYjE2NGUwNzU0MTA1YjdhOTliZTcyZTNmZTU=
}
MD5和从md5 here 和 base64 here
任何提示都会有所帮助。
Any hints will be helpful.
您的代码不会产生预期的结果,因为
引用的 md5()
函数返回消息摘要作为
十六进制编码的字符串,然后进行Base64编码。因此,而不是
Your code does not produce the expected result because the
referenced md5()
function returns the message digest as a
hex-encoded string, which is then Base64 encoded. So instead of
String -> UTF-8 data -> MD5 digest -> Base64 encoding
你正在做什么
String -> UTF-8 data -> MD5 digest -> hex encoding -> Base64 encoding
该函数的一个小修改将消息摘要
作为数据返回:
A small modification of the function returns the message digest as data:
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摘要:
Now you can compute the Base 64 encoded MD5 digest:
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==
这几乎您的期望。 Java代码显然产生
所谓的base64url变体而没有填充
(比较 https://en.wikipedia.org/wiki/Base64#Variants_summary_table )。
This is almost what you expect. The Java code apparently produces the so-called "base64url" variant without padding (compare https://en.wikipedia.org/wiki/Base64#Variants_summary_table).
因此我们必须修改两个字符并删除填充:
Therefore we have to modify two characters and remove the padding:
let base64url = base64
.stringByReplacingOccurrencesOfString("+", withString: "-")
.stringByReplacingOccurrencesOfString("/", withString: "_")
.stringByReplacingOccurrencesOfString("=", withString: "")
print("base64url = \(base64url)") // base64url = sQqNsWTgdUEFt6mb5y4_5Q
现在结果是 sQqNsWTgdUEFt6mb5y4_5Q
,并且相同于你从Java代码得到了什么
。
Now the result is sQqNsWTgdUEFt6mb5y4_5Q
, and identical to what
you got from the Java code.