1. ホーム
  2. ios

[解決済み] iOSでSwiftを使ってStringをMD5ハッシュに変換するにはどうすればいいですか?

2022-07-11 08:57:09

質問

abc"のような文字列をMD5ハッシュに変換したいです。私はこれをiOSとSwiftで行いたいと思います。私は以下の解決策を使用しようとしましたが、彼らは私のために働いていませんでした。

SwiftフレームワークでCommonCryptoをインポートする

Swift言語でCC_MD5メソッドを使用する方法。

http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-swift/

より明確にするために、私はSwiftでこのPHPコードの出力と同様の出力を達成したいです。

$str = "Hello";

echo md5($str);

出力します。8b1a9953c4611296a827abf8c47804d7

どのように解決するのですか?

2つのステップがあります。

1. 文字列からmd5データを作成する

2. md5データを16進文字列に変換する

Swift 2.0です。

func md5(string string: String) -> String {
    var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0)
    if let data = string.dataUsingEncoding(NSUTF8StringEncoding) {
        CC_MD5(data.bytes, CC_LONG(data.length), &digest)
    }

    var digestHex = ""
    for index in 0..<Int(CC_MD5_DIGEST_LENGTH) {
        digestHex += String(format: "%02x", digest[index])
    }

    return digestHex
}

//Test:
let digest = md5(string:"Hello")
print("digest: \(digest)")

出力します。

をダイジェストで表示します。8b1a9953c4611296a827abf8c47804d7

Swift 3.0です。

func MD5(string: String) -> Data {
    let messageData = string.data(using:.utf8)!
    var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))

    _ = digestData.withUnsafeMutableBytes {digestBytes in
        messageData.withUnsafeBytes {messageBytes in
            CC_MD5(messageBytes, CC_LONG(messageData.count), digestBytes)
        }
    }

    return digestData
}

//Test:
let md5Data = MD5(string:"Hello")

let md5Hex =  md5Data.map { String(format: "%02hhx", $0) }.joined()
print("md5Hex: \(md5Hex)")

let md5Base64 = md5Data.base64EncodedString()
print("md5Base64: \(md5Base64)")

出力します。

md5Hex: 8b1a9953c4611296a827abf8c47804d7

md5Base64: ixqZU8RhEpaoJ6v4xHgE1w==

Swift 5.0です。

import Foundation
import var CommonCrypto.CC_MD5_DIGEST_LENGTH
import func CommonCrypto.CC_MD5
import typealias CommonCrypto.CC_LONG

func MD5(string: String) -> Data {
        let length = Int(CC_MD5_DIGEST_LENGTH)
        let messageData = string.data(using:.utf8)!
        var digestData = Data(count: length)

        _ = digestData.withUnsafeMutableBytes { digestBytes -> UInt8 in
            messageData.withUnsafeBytes { messageBytes -> UInt8 in
                if let messageBytesBaseAddress = messageBytes.baseAddress, let digestBytesBlindMemory = digestBytes.bindMemory(to: UInt8.self).baseAddress {
                    let messageLength = CC_LONG(messageData.count)
                    CC_MD5(messageBytesBaseAddress, messageLength, digestBytesBlindMemory)
                }
                return 0
            }
        }
        return digestData
    }

//Test:
let md5Data = MD5(string:"Hello")

let md5Hex =  md5Data.map { String(format: "%02hhx", $0) }.joined()
print("md5Hex: \(md5Hex)")

let md5Base64 = md5Data.base64EncodedString()
print("md5Base64: \(md5Base64)")

出力します。

md5Hex: 8b1a9953c4611296a827abf8c47804d7

md5Base64: ixqZU8RhEpaoJ6v4xHgE1w==

注意事項

#import <CommonCrypto/CommonCrypto.h> は、Bridging-Header ファイルに追加する必要があります。

Bridging-Headerの作成方法については このSOの答え .

一般的に、MD5は新しい作品に使用すべきではありません。SHA256が現在のベストプラクティスです。

非推奨のドキュメントセクションからの例です。

MD2、MD4、MD5、SHA1、SHA224、SHA256、SHA384、SHA512 (Swift 3 以上)

<ブロッククオート

これらの関数は、8つの暗号ハッシュアルゴリズムのうちの1つで、StringまたはDataの入力をハッシュ化します。

nameパラメータは、ハッシュ関数の名前を文字列で指定します。

サポートされている関数は、MD2、MD4、MD5、SHA1、SHA224、SHA256、SHA384、SHA512です。 a この例では、Common Cryptoが必要です。

プロジェクトにブリッジングヘッダーが必要です。

#import <CommonCrypto/CommonCrypto.h>

プロジェクトにSecurity.frameworkを追加します。



この関数は、ハッシュ名とハッシュ化するStringを受け取り、Dataを返します。

name: ハッシュ関数名(String)  
文字列 ハッシュ化される文字列  
returns: データとしてハッシュ化された結果  

func hash(name:String, string:String) -> Data? {
    let data = string.data(using:.utf8)!
    return hash(name:name, data:data)
}

let clearString = "clearData0123456"
let clearData   = clearString.data(using:.utf8)!
print("clearString: \(clearString)")
print("clearData: \(clearData as NSData)")

let hashSHA256 = hash(name:"SHA256", string:clearString)
print("hashSHA256: \(hashSHA256! as NSData)")

let hashMD5 = hash(name:"MD5", data:clearData)
print("hashMD5: \(hashMD5! as NSData)")

出力します。

clearString: clearData0123456
clearData: <636c6561 72446174 61303132 33343536>

hashSHA256: <aabc766b 6b357564 e41f4f91 2d494bcc bfa16924 b574abbd ba9e3e9d a0c8920a>
hashMD5: <4df665f7 b94aea69 695b0e7b baf9e9d6>