-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
암호화와 보안의 기본 개념, iOS 앱 보안을 위한 방안에 대해 설명해주세요. #22
Comments
🔐 대칭키 암호화와 비대칭키 암호화의 차이1. 대칭키(Symmetric key) 암호화
2. 비대칭키(Asymmetric Key) 암호화
3. 그래서 드디어 차이점 정리..!
4. 서명
5. 덧붙여 iOS의 대칭키/비대칭키 활용 사례
1) iOS 에서의 RSA 암호화
2) iOS에서 제공하는 암호화 프레임워크 'CryptoKit'
let privateKey = Curve25519.Signing.PrivateKey() // 개인키 생성
let publicKey = privateKey.publicKey // 공개키 생성
let signature = try privateKey.signature(for: messageDigest) // 서명
publicKey.isValidSignature(signature, for: messageDigest) // 검증 🔐 해시 함수의 개념과 활용 사례1. 해시함수
1) 암호화 해시 함수
2) 순환 중복 검사(CRC, cyclic redundancy check)
2. 해시 - 알고리즘
1) MD(Message-Digest Algorithm)
2) SHA(Secure Hash Algorithm)
3. iOS에서의 활용 사례들
1) 대상 통으로 해시 생성![]() CC_MD5함수를 이용하여 해시 값을 구할 수 있음 CC_MD5함수와 CC_SHA256함수는 unsigned char * 를 리턴하고 있으나, 일반적으로 아래 예시처럼 리턴 값을 사용하고 있지 않지만 리턴 값은 md파라미터를 통해 전달된 포인터를 반환함
#import <CommonCrypto/CommonDigest.h>
NSString *md5(NSString *str) {
const char *cStr = [str UTF8String];
unsigned char result[CC_MD5_Digest_LENGTH];
CC_MD5(cStr, strlen(cStr), result);
return [NSString stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1],
result[2], result[3],
result[4], result[5],
result[6], result[7],
result[8], result[9],
result[10], result[11],
result[12], result[13],
result[14], result[15],
];
}
NSString *digest = md5(@"test");
NSLog(@"MD5 TEST %@", digest); 이 코드는 MD5 해싱소스 코드임. 여기서 MD5를 SHA256으로 치환하고, result의 배열인덱스를 0~ 31 까지 받아내면 SHA256소스가 된다. 2) 버퍼를 이용하여 해시 생성예를 들어 크기가 큰 파일의 해시 값을 구한다고 가정할 때, 위의 방법을 이용하면 파일 전체를 메모리에 올려야 하기때문에 저사양 단말에서는 큰 부담을 가지게 될 수 있음! 따라서 파일의 일부를 버퍼를 이용하여 해시 값을 업데이트함으로써, 메모리사용량을 줄 일 수 있다고 함 static int md5useUpdate(char* data, long len, char** outData)
{
unsigned char hashBuf[BUF_LEN] = {0,}; //업데이트에 사용할 버퍼
long curSize = 0; //현재 까지 읽은 데이터 사이즈
long remainSize = len; //남아있는 데이터 사이즈
//md5 컨텍스트 선언 및 초기화
CC_MD5_CTX md5;
CC_MD5_Init(&md5);
//더 읽어야할 데이터가 남아있다면
while(curSize < len) {
if(remainSize < BUF_LEN){ //남은 사이즈가 버퍼보다 작을 경우, 남아있는 사이즈만큼만 메모리 복사 및 해시 업데이트
memcpy(hashBuf, (char *)data, remainSize);
CC_MD5_Update(&md5, hashBuf, (CC_LONG)remainSize);
}
else { //일반적인 경우 버퍼사이즈(1024)만큼 메모리 복사 및 해시 업데이트
memcpy(hashBuf, (char *)data, BUF_LEN);
CC_MD5_Update(&md5, hashBuf, (CC_LONG)BUF_LEN);
}
data += BUF_LEN; //메모리 읽은 후 포인터 이동
curSize += BUF_LEN; //현재까지 읽은 사이즈 계산
remainSize -= BUF_LEN; //남아있는 사이즈 계산
}
unsigned char digest[CC_MD5_DIGEST_LENGTH] = {0,};
CC_MD5_Final (digest, &md5);
char *tmpOut = *outData;
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
{
sprintf(tmpOut, "%02x", digest[i]);
tmpOut += 2;
}
return 0;
} 정의한 함수 md5useUpdate는 해싱할 데이터와 사이즈, 해싱한 문자열을 기록할 데이터의 포인터를 입력받는다. 3) CryptoKit을 사용한 암호화
/// 리터럴 값을 해싱하면 hash value이 나온다. /// haser로 만든 hash value는 계산할 때마다 다른 값이 나온다.
func hashItem(item: String) -> Int {
var hasher = Hasher()
item.hash(into: &hasher)
return hasher.finalize()
}
let hashvalue = hashItem(item: "brown fox")
digest로 데이터 무결성을 확인할 수 있음 import CryptoKit /// 이미지 데이터를 받아온다.
func getData(for item: String, of type: String) -> Data {
let filePath = Bundle.main.path(forResource: item, ofType: type)!
return FileManager.default.contents(atPath: filePath)!
}
let data = getData(for: "Baby", of: "png")
UIImage(data: data)
/// 256-bit의 digest를 만든다.
let digest = SHA256.hash(data: data)
// 송신자는 'data'와 'digest'를 수신자에게 보낸다.
// 수신자는 'data'를 cryptographic hashing한 값과 'digest'를 비교한다. 같다면 데이터는 무결한 상태이다.
let receivedDataDigest = SHA256.hash(data: data)
if digest == receivedDataDigest {
print("보낸 data == 받은 data")
}
CrytoKit이 제공하는 암호화나 인증방식이 꽤나 다양하기 때문에 여기에서 필요할 때 공부하는 걸 추천한다 ㅎㅎ 참고 |
The text was updated successfully, but these errors were encountered: