-
[Objectivc-C] SHA-256 / AES-256 ์ํธํ๐ iOS/๊ฐ๋ฐ 2023. 2. 6. 16:14
๋ฏผ๊ฐํ ๊ฐ์ธ์ ๋ณด๋ฅผ API์ ํ์ ๋ณด๋ด์ผ ํ ๋ ์ฃผ๋ก ํด๋ผ์ด์ธํธ๋จ์์ ์ํธํ ์ฒ๋ฆฌ๋ฅผ ํด์ ๋ณด๋ด๊ณค ํฉ๋๋ค. ๋ณธ ํฌ์คํ ์์๋ Objective-C๋ก SHA256๊ณผ AES256 ์ํธํ๋ฅผ ์งํํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
๐ SHA-256
SHA๋ ๋จ๋ฐฉํฅ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ด๋ฏ๋ก ๋ณตํธํ๊ฐ ๋ถ๊ฐ๋ฅํ๋ฉฐ, ๋ณตํธํ๋ฅผ ํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ๋น ๋ฅธ ์๋๊ฐ ํน์ง์ ๋๋ค. ๋น๋ฐ๋ฒํธ ์ผ์น์ฌ๋ถ ํ์ธ ๋ฑ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
SHA-256์ ์ด๋ค ๊ธธ์ด์ ๊ฐ์ ์ ๋ ฅํ๋๋ผ๋ 256bit์ ๊ณ ์ ๋ ํฌ๊ธฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ ๋ ฅ๊ฐ์ด ์กฐ๊ธ๋ง ๋ณ๋๋๋๋ผ๋ ๋ฐํ๊ฐ์ด ์์ ํ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ๋ฐํ๊ฐ์ ํ ๋๋ก ์ ๋ ฅ๊ฐ์ ์ ์ถํ๋ ๊ฒ์ด ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ํฉ๋๋ค.
#import <CommonCrypto/CommonDigest.h> - (NSString*)SHA256Hash:(NSString*)text { const char* utf8chars = [text UTF8String]; unsigned char result[CC_SHA256_DIGEST_LENGTH]; CC_SHA256(utf8chars, (CC_LONG)strlen(utf8chars), result); NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2]; for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++) { [ret appendFormat:@"%02x",result[i]]; } return ret; }
NSString *testText = [self SHA256Hash:@"testText"];
์จ๋ผ์ธ SHA-256 Hash ์์ฑ๊ธฐ์ ๋์ผ ๋ฉ์์ง๋ฅผ ์ ๋ ฅํ์ ๋, ๋์ผํ ์ถ๋ ฅ์ ์์ฑํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๐ AES-256
AES๋ ์ํธํ ๋ฐ ๋ณตํธํ ์ ๋์ผํ ํค๋ฅผ ์ฌ์ฉํ๋ ๋์นญํค ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. AES์ ์ข ๋ฅ์๋ AES-128, AES-192, AES-256์ด ์๋๋ฐ ๋ค์ ๋ถ์ ์ซ์๊ฐ ๊ฐ๊ฐ ํค์ ๊ธธ์ด(256bit=32byte)๋ฅผ ์๋ฏธํฉ๋๋ค.
AES๋ 128bit(=16byte)์ ๊ณ ์ ๋ ๋ธ๋ก ๋จ์๋ก ์ํธํ๋ฅผ ์ํํ๋๋ฐ, 128bit๋ณด๋ค ์์ ๋ธ๋ก์ด ์๊ธธ ๊ฒฝ์ฐ ๋ถ์กฑํ ๋ถ๋ถ์ ํน์ ๊ฐ์ผ๋ก ์ฑ์์ผ ํฉ๋๋ค. ์ด๋ฌํ ์์ ์ ํจ๋ฉ์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ๋ํ์ ์ผ๋ก PKCS5, PKCS7 ๋ฐฉ์์ด ์์ต๋๋ค.
์ํธํ๋ฅผ ์ํํ ๋ Block Cipher Mode๋ฅผ ์ ํํ ์ ์์ผ๋ฉฐ ๋ํ์ ์ผ๋ก CBC, ECB ๋ฑ์ด ์์ต๋๋ค. ์ฃผ๋ก CBC ๋ฐฉ์์ด ๊ถ์ฅ๋๋๋ฐ, ๋ธ๋ก์ ๊ทธ๋๋ก ์ํธํํ์ง ์๊ณ ์ด์ ์ ์ํธํํ๋ ๋ธ๋ก๊ณผ์ XOR ์ฐ์ฐ์ ์ ํํ ๋ค ์ํธํ๋ฅผ ์ํํฉ๋๋ค. ์ด ๋, ์ฒซ ๋ฒ์งธ ๋ธ๋ก์ ์ด์ ์ํธํ ๋ธ๋ก์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ ์ญํ ์ ํด ์ค IV(Initialization Vector)๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. IV๋ ๋ง์ฐฌ๊ฐ์ง๋ก 128bit(=16byte) ํฌ๊ธฐ์ฌ์ผ ํ๊ณ , IV๊ฐ์ ๊ฐ์ง๊ณ ์ฒซ ๋ฒ์งธ ๋ธ๋ก์ ์ํธํํฉ๋๋ค.
NSData ํด๋์ค์ AES256 ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ํธํ ๋ฉ์๋๋ฅผ ์์ฑํด์ฃผ์์ต๋๋ค.
#import <CommonCrypto/CommonCryptor.h> #define key @"YOUR_KEY" @implementation NSData (AES256) - (NSData *)cryptOperation:(CCOperation)operation { char keys[kCCKeySizeAES256 + 1]; bzero(keys, sizeof(keys)); [key getCString:keys maxLength:sizeof(keys) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytes = 0; // ์์๋ก ์ค์ ํ IV const char *ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; CCCryptorStatus status = CCCrypt(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keys, kCCKeySizeAES256, ivBytes, [self bytes], dataLength, /* input */ buffer, bufferSize, /* output */ &numBytes); if (status == kCCSuccess) { return [NSData dataWithBytesNoCopy:buffer length:numBytes]; } free(buffer); return nil; } - (NSData *)AES256Encrypt { return [self cryptOperation:kCCEncrypt]; } - (NSData *)AES256Decrypt { return [self cryptOperation:kCCDecrypt]; } @end
์ด ๋ฉ์๋๋ค์ ์ด์ฉํด ๋ฌธ์์ด์ ์ํธํํ๋ ๋ฉ์๋๋ฅผ ์์ฑํด์ค๋๋ค.
- (NSString *)AES256Encrypt:(NSString *)string { NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; NSData *dataEncrypted = [data AES256Encrypt]; NSString *strEncrypted = [dataEncrypted base64EncodedStringWithOptions:0]; return strEncrypted; } - (NSString *)AES256Decrypt:(NSString *)string { if([string containsString:@"\n"] || [string containsString:@"\t"]) { string = [[string componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] componentsJoinedByString:@""]; string = [string stringByReplacingOccurrencesOfString:@"\t" withString:@""]; } NSData *keyData = [[NSData alloc] initWithBase64EncodedString:string options:0]; NSData *dataDecrypted = [keyData AES256Decrypt]; NSString *receivedDataDecryptString = [[NSString alloc]initWithData:dataDecrypted encoding:NSUTF8StringEncoding]; return receivedDataDecryptString; }
์๋์ ๊ฐ์ด ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
NSString *encryptText = [self AES256Encrypt:@"testText"]; NSString *decryptText = [self AES256Encrypt:@"testText"];
์ฐธ๊ณ
https://stackoverflow.com/questions/45832991/how-to-encrypt-with-aes-256-cbc-in-objective-c
'๐ iOS > ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ