2016-09-07 72 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端解碼時,它給了我奇怪的結果...請幫助我 –

相關問題