'암호화'에 해당되는 글 2건

  1. 2013.01.16 [iPhone]keychain 을 이용한 id, password 저장
  2. 2012.08.26 aes-128을 사용한 app과 server의 통신 1
iOS2013. 1. 16. 15:27

NSUserDefaults 에 사용자 정보를 저장하기에는 그렇고 별도로 암호화/복호화 하기도 번거롭고 해서
중요한 정보인 사용자 id, password를 저장해놓고 사용하기 위해 keychain을 사용하였다.


//애플 래퍼런스 문서 (해당 셈플코드에서 KeychainItemWrapper 클래스 소스를 가져다 쓰기바람 )


// framework 에 Security.framework 추가.

NSString *idKey = @"id";
NSString *pwKey = @"password";

KeychainItemWrapper * idKeychain = [[KeychainItemWrapper alloc] initWithIdentifier:idKey accessGroup:nil];
[idKeychain setObject:idValue forKey:(id)kSecAttrAccount];
KeychainItemWrapper * pwKeychain = [[KeychainItemWrapper alloc] initWithIdentifier:pwKey accessGroup:nil];
[pwKeychain setObject:pwValue forKey:(id)kSecValueData];
//[idKeychain resetKeychainItem];
//[pwKeychain resetKeychainItem];
NSLog(@"id  :  %@",[idKeychain objectForKey:(id)kSecAttrAccount]);
NSLog(@"pw :  %@",[pwKeychain objectForKey:(id)kSecValueData]);
[idKeychain release];
[pwKeychain release];

위와 같이 사용할 경우 id, pw를 저장 할 수 있으며 resetKeychainItem을 사용하여 초기화 시킬 수 도 있다.
해당 key(kSecAttrAccount,kSecValueData) 값당 하나의 데이터 밖에 저장할 수 없는 구조인거 같다.
자세한 내용은 문서와 셈플 코드를 참조...

Posted by 다오나무
iOS2012. 8. 26. 13:02

안녕하세요. 팬텀입니다. 
첨부된 파일은 이번 정모에 발표했던 'App과 Server의 은밀한 대화'에 리뷰했던 코드 예제 입니다.
그날 리뷰했던 코드에 urlencoding / urldecoding 관련된 부분이 추가되었습니다.

첨부된 파일을 xcode에서 실행시키면, 뷰에 버튼이 하나 있습니다. 
이 버튼이 parameter와 security token을 만들고, 서버로 request를 보내고,
서버로부터의 결과를 콘솔에 남기는 일을 합니다. 콘솔에서 다음과 같이 확인할 수 있습니다.

 [Session started at 2010-07-21 00:57:01 +0900.]
 -------------------------------------------
[app]
1) param : id=2&point=450&name=%EB%A7%A5%EB%B6%80%EA%B8%B0&nonce=16807
2) st : PysueoNho2uhis%2B8%2FQjpWuSuYdGYA0m4HM969zadxBZIMNwe%2BJle
 -------------------------------------------
[server]
1) result : id=2&point=450&name=맥부기&nonce=16807

endpoint는 코드에 들어있는 http://rockk.org/mcbugi/test.php 입니다. 2주 정도 열어 놓도록 할께요.
서버쪽 코드는 다음과 같구요. 간단하게 st를 복호화 한 값을 그대로 echo 합니다.
app과 key값을 꼭 맞춰주어야 합니다. 아래 붉게 강조된 부분에요. '123456789abcdef'

 <?php
// base64 decode st
$tmp_st = base64_decode(urldecode($_POST['st']));

// decrypt st (key is '123456789abcdef')
$st = urldecode(trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, '123456789abcdef', $tmp_st, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND))));

// echo decrypted data
echo $st;
exit;
?>


실제로 사용할 땐, $st 값을 &로 파싱하고, key & value로 활용하면 되지 않을까 싶습니다.

CryptoHelper 관련 참고 url은 아래와 같구요.
http://pastie.org/297563.txt
http://stackoverflow.com/questions/1235171/iphone-how-to-encrypt-a-string

php의 mcrypt와 padding을 다루는 부분에서 차이가 있어CryptoHelper.m의 다음 부분에 kCCOptionECBMode를 추가했습니다.
참고하세요.

 // Create and Initialize the crypto reference.
    ccStatus = CCCryptorCreate(    encryptOrDecrypt, 
                               kCCAlgorithmAES128, 
                               kCCOptionPKCS7Padding | kCCOptionECBMode
                               (const void *)[theSymmetricKey bytes], 
                               kCCKeySizeAES128, 
                               (const void *)iv, 
                               &thisEncipher
                               );


혹시나 해서 발표자료도 공유합니다- :D

App과 Server의 은밀한 대화
View more presentations from rockk.




한글 잘림현상- 아래수정 부분 확인해서 사용하삼
- (NSString*)encryptString:(NSString*)string
{
NSRange fullRange;
fullRange.length = [string length];
fullRange.location = 0;

uint8_t buffer[[string length]];

[string getBytes:&buffer maxLength:[string length] usedLength:NULL encoding:NSUTF8StringEncoding options:0 range:fullRange remainingRange:NULL];

// NSData *plainText = [NSData dataWithBytes:buffer length:[string length]];// 한글 잘림
NSData *plainText = [string dataUsingEncoding:NSUTF8StringEncoding];

NSData *encryptedResponse = [self doCipher:plainText key:symmetricKey context:kCCEncrypt padding:&pad];

return [self base64EncodeData:encryptedResponse];
}

Posted by 다오나무