如何将字符串(在 Java 中使用加密 MessageDigest)编码为 swift 中的 Base64 字符串?
How to encode string (use encrypt MessageDigest in Java) to Base64 string in swift?
在Java中,我使用了这个:
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 中获得相同的结果?
已更新:
func test() -> Void {
var data: String = "Hello World"
data = md5(data)
data = base64Encode(data)
print("data = \(data)") //YjEwYThkYjE2NGUwNzU0MTA1YjdhOTliZTcyZTNmZTU=
}
md5 和 base64Encode 函数使用自 and base64 here
任何提示都会有所帮助。
您的代码没有产生预期的结果,因为
引用 md5()
函数 returns 消息摘要作为
十六进制编码的字符串,然后进行 Base64 编码。所以而不是
String -> UTF-8 data -> MD5 digest -> Base64 encoding
你正在做
String -> UTF-8 data -> MD5 digest -> hex encoding -> Base64 encoding
函数的小修改returns消息摘要
作为数据:
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==
这几乎您所期望的。 Java 代码显然产生
没有填充的所谓 "base64url" 变体
(比较 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 代码中得到。
在Java中,我使用了这个:
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 中获得相同的结果?
已更新:
func test() -> Void {
var data: String = "Hello World"
data = md5(data)
data = base64Encode(data)
print("data = \(data)") //YjEwYThkYjE2NGUwNzU0MTA1YjdhOTliZTcyZTNmZTU=
}
md5 和 base64Encode 函数使用自
任何提示都会有所帮助。
您的代码没有产生预期的结果,因为
引用 md5()
函数 returns 消息摘要作为
十六进制编码的字符串,然后进行 Base64 编码。所以而不是
String -> UTF-8 data -> MD5 digest -> Base64 encoding
你正在做
String -> UTF-8 data -> MD5 digest -> hex encoding -> Base64 encoding
函数的小修改returns消息摘要 作为数据:
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==
这几乎您所期望的。 Java 代码显然产生 没有填充的所谓 "base64url" 变体 (比较 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 代码中得到。