2011-10-05 26 views
1

내 아이폰 앱에서 ASP 서버 페이지로 사용자 이름과 비밀번호를 보내야합니다. 다음을 사용하여 암호화합니다 : http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html. ASP 페이지에서 이러한 문자열의 암호를 해독하는 가장 좋은 방법은 무엇입니까? 몇 가지 예제를 발견했지만 암호화가 완전히 관련이없는 두 가지 측면에서 발생하기 때문에 키를 양면에 하드 코딩해야하며 사용 된 키가없는 예제를 찾을 수 없습니다.ASP에서 AES256 암호화 및 해독

감사합니다.

답변

2

예, 키 관리는 큰 문제입니다. 양쪽에 키가 있어야합니다. iOS에서는 키 체인에 키를 저장할 수 있습니다. 보안은 유지되지만 보안을 유지하는 과정이 더 어렵습니다.

다른 주요 문제는 양쪽에서 모든 매개 변수를 동일하게 만드는 것입니다. 특히 관심

  1. 암호화 키 값과 크기는
  2. 모드 : CBC, ECB 등
  3. 초기화 벡터 (당신은 아마 CBC를 사용한다) (IV) 대부분의 모드에 필요한
  4. 패딩 방법 : PKCS7 등 (AES는 블록 사이퍼과 블록 크기의 배수에 입력 필요)
+0

감사합니다. 이러한 문제를 해결하는 방법에 대한 제안 사항이 있으십니까? – Aaron

+0

처음에는 간단한 테스트 데이터를 선택 했으므로이를 얻고보다 복잡한 상황으로 이동하십시오. 예 : 처음에는 모든 0, CBC, 패딩없이 정확히 한 블록 크기의 데이터를 iv로 선택합니다. 그것이 작동 할 때 더 많은 복잡성이 추가됩니다. 어쨌든, 당신이 진짜 보안을 원하는 경우 노련한 전문가가 코드를 검토하도록하십시오. 보안이 쉽지 않습니다. 암호화 부분은 쉬운 부분입니다. 또는 SSL을 사용하십시오. 오, 도움이된다면 대답을 받아들입니다. – zaph

0

왜 SHA1으로 데이터베이스에 암호를 저장하지, 다음 클라이언트 지정된 키에 HMAC를 사용 통신을 위해서?

서버가 임의의 키를 생성하여 로그인 요청과 함께 보내도록하십시오. 클라이언트는 암호의 SHA1 해시를 계산 한 다음 서버 지정 키를 사용하여 해시의 HMAC SHA1 해시를 계산합니다. 그런 다음 서버는 결과가 올바른지 검증합니다. 클라이언트 측에

: 서버 측에

// password is the plaintext password 
// keyb64 is a random key specified by the server, encoded in base64. 
string ComputeSecureHash(string password, string keyb64) 
{ 
    byte[] data = Encoding.UTF8.GetBytes(password); 
    byte[] key = Convert.FromBase64String(keyb64); 
    byte[] hash; 
    byte[] machash; 
    // compute a plain SHA1 hash of the specified data 
    using (SHA1Managed sha1 = new SHA1Managed()) 
    { 
     hash = sha1.ComputeHash(data); 
    } 
    // now compute a HMAC hash of that hash, using the random key. 
    using (HMACSHA1 sha1mac = new HMACSHA1(key)) 
    { 
     machash = sha1mac.ComputeHash(hash); 
    } 
    return Convert.ToBase64String(machash); 
} 

는 :

// hash is the string produced by the function above 
// realHash is the SHA1 hash of the real password, which you've fetched from the db 
// key is the key you generated for this login session 
bool VerifyHash(string hash, byte[] realHash, byte[] key) 
{ 
    byte[] machash; 
    using (HMACSHA1 sha1mac = new HMACSHA1(key)) 
    { 
     machash = sha1mac.ComputeHash(realHash); 
    } 
    return (Convert.ToBase64String(machash) == hash); 
} 

이것은 당신이 금이 암호를하지 않고 일반 텍스트 매체를 통해 인증 할 수 있습니다.

+1

자신의 구성표를 굴리는 것은 눈물로 끝나는 경향이 있습니다. 대부분의 개발자는 TLS/SSL과 같은 검증 된 기술을 고집하는 것이 좋습니다. – Levi

+0

이것은 "내 자신의 구성표"가 아니며 잘 알려진 MAC 인증 형식입니다. – Polynomial

+1

나는 그것을 깨닫는다. 그러나 그것은 서버가 아니라 클라이언트를 인증한다. 이 체계는 예를 들어 MITM을 방지하지 못합니다. TLS와 같은 기술은 이전 권장 사항과 동일합니다. – Levi