//Bridging-Header.h 추가
#import <CommonCrypto/CommonDigest.h>
// 알고리즘 종류별 해시값 생성
enum ALGORITHM: String {
case MD2
case MD4
case MD5
case SHA1
case SHA224
case SHA256
case SHA384
case SHA512
}
func hash(algorithm: ALGORITHM, data:Data) -> Data? {
let algos = ["MD2": (CC_MD2, CC_MD2_DIGEST_LENGTH),
"MD4": (CC_MD4, CC_MD4_DIGEST_LENGTH),
"MD5": (CC_MD5, CC_MD5_DIGEST_LENGTH),
"SHA1": (CC_SHA1, CC_SHA1_DIGEST_LENGTH),
"SHA224": (CC_SHA224, CC_SHA224_DIGEST_LENGTH),
"SHA256": (CC_SHA256, CC_SHA256_DIGEST_LENGTH),
"SHA384": (CC_SHA384, CC_SHA384_DIGEST_LENGTH),
"SHA512": (CC_SHA512, CC_SHA512_DIGEST_LENGTH)]
guard let (hashAlgorithm, length) = algos[algorithm.rawValue] else { return nil }
var hashData = Data(count: Int(length))
// Swift > 5.0
hashData.withUnsafeMutableBytes { (digestBytes) in
let digest = digestBytes.bindMemory(to: UInt8.self).baseAddress
data.withUnsafeBytes { messageBytes in
let message = messageBytes.baseAddress
_ = hashAlgorithm(message, CC_LONG(data.count), digest)
}
}
return hashData
}
func hash(algorithm: ALGORITHM, string:String) -> Data? {
let data = string.data(using:.utf8)!
return hash(algorithm: algorithm, data: data)
}
[사용방법]
let clearString = "clearData0123456"
let clearData = clearString.data(using:.utf8)!
print("clearString: \(clearString)")
print("clearData: \(clearData as NSData)")
//String 값 SHA256 해시 생성
let hashSHA256 = hash(algorithm: .SHA256, string:clearString)
print("hashSHA256: \(hashSHA256! as NSData)")
//Data 값 MD5 해시 생성
let hashMD5 = hash(algorithm: .MD5, data:clearData)
print("hashMD5: \(hashMD5! as NSData)")
// Data -> HexEncodedString
let stringMD5 = hashMD5?.hexEncodedString()
print("\(stringMD5)")
// HexEncodedString -> Array
print("\(stringMD5?.bytes)")'Swift > 문법' 카테고리의 다른 글
| [SWIFT]Tuples (0) | 2023.07.25 |
|---|---|
| [SWIFT]Array (0) | 2023.07.25 |
| [SWIFT]String -> Data, Data -> String 변환 (0) | 2023.07.20 |
| [SWIFT]문자열 String 관련 함수들 (0) | 2023.07.13 |
| [SWIFT]enum 함수 파라메터 타입으로 사용하기 (0) | 2023.07.05 |