2016-09-07 33 views
1

在Java中,我用这个:如何在swift中将字符串(使用Java中的加密MessageDigest)编码为Base64字符串?

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 
} 

我该怎么做在斯威夫特同样的结果?

更新时间:

func test() -> Void { 
    var data: String = "Hello World" 
    data = md5(data) 
    data = base64Encode(data) 
    print("data = \(data)") //YjEwYThkYjE2NGUwNzU0MTA1YjdhOTliZTcyZTNmZTU= 
} 

MD5和md5 here使用base64Encode功能和base64 here

任何提示会有所帮助。因为 引用md5()函数返回消息摘要作为 十六进制编码的串,然后将其Base64编码

+0

MD5函数是在这里例如:http://stackoverflow.com/questions/32163848/how-to-convert-string-to-md5-hash-using-ios-swift,和Base64在这里:http:///stackoverflow.com/questions/34406024/swift-base64-format。您可以通过搜索'[swift] md5'或'[swift] base64'轻松找到更多信息。 - 顺便说一句,MD5是*不是*加密。 –

+0

我试过md5和base64,但结果在java中是不同的。结果是:YjEwYThkYjE2NGUwNzU0MTA1YjdhOTliZTcyZTNmZTU = –

+0

显示您的尝试。输入,输出和预期输出。我们无法猜测你做错了什么。 –

回答

0

你的代码不会产生预期的结果。因此,而不是

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== 

这是差不多你期望的。 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代码了。

+0

完美!这就是我想要的。非常感谢! : - * –

+0

不适合我。当我尝试在java端解码时,它给了我奇怪的结果...请帮助我 –

相关问题