적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

초보 iOS 개발자의 일상/개발 업무

[Swift iOS] How to convert a string to an MD5 hash

hongssup_ 2021. 8. 2. 17:53
반응형

MD5란? 

MD5 (Message-Digest algorithm 5) : 128비트 암호화 해시 함수

주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용된다. 암호화 결함 때문에 MD5알고리즘을 보안 관련 용도로 쓰는 것은 권장하지 않는다. 

임의의 길이의 메시지(variable-length message)를 입력받아, 128비트짜리 고정 길이의 출력값을 낸다. 

해시 함수(hash function) : 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수. 

암호화 해시 함수(cryptographic hash function) : 매핑된 해시 값만을 가지고는 원래 입력값을 알아내기 힘들다는 성질(역상 저항성) 의해 사용될 있다. 

 

참고 : https://ko.wikipedia.org/wiki/MD5

 

String을 MD5 해시 값으로 변환하는 법

1. 문자열에서 md5 데이터 생성

2. md5 데이터를 16진수 문자열로 변환

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
    }

let md5Data = MD5(string:"2021080205")
print(md5Data)

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

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

이런 식으로 구현할 수 있지만, 위와 같이 CommonCrypto를 사용하여 복잡하게 구현하지 않고도
iOS 13 부터는 CryptoKit framework를 사용하여 다음과 같이 더욱 간단하게 사용할 수 있도록 만들어졌다고 한다. 👏🏻👏🏻👏🏻

import Foundation
import CryptoKit

func MD5(string: String) -> String {
    let digest = Insecure.MD5.hash(data: string.data(using: .utf8) ?? Data())

    return digest.map {
        String(format: "%02hhx", $0)
    }.joined()
}

print(MD5(string: "2021080205"))

 

참고 : https://stackoverflow.com/questions/32163848/how-can-i-convert-a-string-to-an-md5-hash-in-ios-using-swift/32166735

728x90
반응형