如何将字符串(在 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 代码中得到。