如何在swift中将字符串(在Java中使用加密MessageDigest)编码为Base64字符串?

在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和base64

任何提示都会有所帮助。

您的代码不会产生预期的结果,因为引用的md5()函数将消息摘要作为hex编码的字符串返回,然后进行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 =  // 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代码中获得的结果相同。