2013-02-04 1 views
4

Android 앱에서 데이터를 암호화하고 싶습니다. 나는 안드로이드에 대한 암호화의 현재 상태에 대해 거의 경험이 없다. 저는 수년 전에 미국에 소프트웨어 회사가 강력한 암호화 기술을 수출하는 것을 금지하는 법률이 있음을 기억합니다. 안드로이드가 오픈 소스 코드라는 점을 감안하면 그 중 어떤 것이 적용 가능할지 모르겠습니다.Android에서 데이터 암호화

내가 원하는 것은 사용자가 암호 만 사용하여 데이터를 암호화 할 수있게하려는 것입니다. 개인/공개 키를 사용하는 것을 선호하는 이유는 아마도이 두 키를 사용자가 입력해야하기 때문입니다. 내 응용 프로그램에서 사용자는 암호를 사용하여 데이터를 암호화/해독 할 수 있어야합니다. 그들의 데이터는 하나의 모바일 장치에서 다른 모바일 장치로 보내질 것이고, 암호를 알지 못하면 수신 측에서의 데이터를 해독 할 수 없어야합니다. 데이터를 보낼 때 SSL을 사용하지만 데이터가 수신 장치로 릴레이되기 전에 서버에서 암호화 된 상태로 유지되어야하므로 충분하지 않습니다. 해커가 내 서버에 액세스 할 수 있다면 잠재적으로 데이터를 읽을 수 있습니다. 이런 이유로, 나는 그것을 송신 장치에서 암호화하고 그것을 수신 장치에서 해독하기를 원한다.

내가 해결해야 할 문제의 수 :

  1. 나를 그냥 암호를 사용하여 암호화가 아닌 경우, 그때는 공개/개인 키를 사용하는 것을 고려하겠습니다하게됩니다 암호화 API가 있습니다.
  2. 내가 현재 사용할 수있는 암호화 알고리즘은 무엇이며 국제적으로 사용할 수 있습니까? 아니면 미국이 암호화 알고리즘을 사용하는 데 제한을 두는가?
  3. 나만의 맞춤 암호화 알고리즘을 만드는 것이 좋으며 해커가 쉽게 변조하지 못하도록 수정하는 것이 좋을까요? 아니면 이것을 낙담시킬 것입니까? 그렇다면 왜? 알고리즘을 정기적으로 변경하면 알고리즘의 현재 버전을 해독 할 수 있는지 여부를 해독 코드가 인식 할 수 있도록 알고리즘 ID를 데이터에 포함해야합니다.

나는 "매우 어렵다"알고리즘을 찾고 있지는 않지만 적절한 알고리즘을 찾고 있습니다. 저장되는 데이터의 종류는 이미지, 비디오, 오디오 및 GPS 데이터입니다. 솔루션이 Android 2.2 이상에서 작동하면 좋을 것입니다. 왜 알고리즘은 OS와 독립적이어야하기 때문에이 버전에서 어떤 알고리즘이 작동하지 않아야하는지 모르겠습니다. 그럼에도 불구하고 안드로이드는 특정 버전에 대해서만 내장 알고리즘을 사용합니까?

편집 : 나는 내 응용 프로그램에서 몇 가지 기본적인 내부 암호화를 위해 지금 사용하고

코드는 다음과 같다,하지만 충분한 충분 올시다 :

import java.security.SecureRandom; 
import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.SecretKeySpec; 

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
Cipher cipher = Cipher.getInstance("AES"); 
cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
byte[] encrypted = cipher.doFinal(clear); 

원래 위의 줄을했다 :

SecureRandom.getInstance("SHA1PRNG") 

그러나 Google에서 4.0을 변경했는데 이로 인해 코드가 깨졌습니다. 이전 코드로 암호화 된 항목은 더 이상 4.0 용 기본 API로 해독 할 수 없습니다. 개인적으로 호환성 문제가 발생하여 Google과 관련된 주요 문제를 발견했습니다. 앞으로이 문제가 다시 발생하지 않도록하려면 어떻게해야합니까? 내 암호화/암호 해독은 Google의 호환성 중단 선택에 달려있을 수 없습니다.

192 비트와 256 비트 지원이 반드시 모든 장치에서 사용할 수있는 것은 아니기 때문에 나는 또한 128 비트 암호화를 사용해야합니다.

+0

"암호를 모르면 수신 측에서 데이터를 해독 할 수 없어야합니다."이 부분이 없습니다. 공격자가 수신 측과 동일한 작업을 수행하고 메시지를 복구 할 수 없습니까? – Henry

+0

물론 해커가 될 수 있습니다. 해커가 먼저 인터넷을 통해 데이터를 해킹해야합니다. 즉, SSL과 암호화 된 데이터를 모두 해킹하거나 내 서버에서 데이터를 해킹해야합니다. 그들이 인터넷 데이터를 지나치거나 내 서버에 액세스 할 수없는 경우 데이터를 수신하는 모바일 장치에 대한 액세스 권한이 있어야합니다. 접근하기가 훨씬 더 어렵습니다. 암호화는 100 % 안전하지 않지만 내 서버에 암호화되지 않은 데이터를 남기고 SSL에만 의존하는 것은 나쁜 실수입니다. 본질적으로 나는 데이터를 해독하기가 매우 어렵도록 이중 암호화를 원한다. – AndroidDev

+1

미안하지만, 나는 그 문장에서 "안"을 간과했다. – Henry

답변

9

암호 만 사용하여 암호화 할 수있는 암호화 API가 있습니까? 그렇다면 개인/공개 키 사용을 고려해 보겠습니다.

저는 256 비트 AES를 사용하여 암호로 데이터를 암호화하는 오픈 소스 Java 라이브러리를 작성했습니다. GitHub에서 찾을 수 있습니다 : JNCryptor. 이는 iOS 용 RNCryptor 프로젝트와 호환됩니다.

Android에서 나에게 맞는 코드가 무엇인지 확인하고 필요에 따라 코드를 적용 할 수 있습니다. (원하는대로 작동하지 않는다면 문제를 제기하고 라이브러리를 조정하십시오.) 내가 사용할 수있는 현재의 암호화 알고리즘을하고 그들이 국제적 또는 사용할 수있는

미국이 그들을 사용에 일부 제한을 넣어합니까?

사용할 수있는 알고리즘은 다양하지만 AES와 같은 매우 표준적인 것을 사용하면 문제가 없습니다.

내가 아는 한, 미국은 여전히 ​​256 비트 AES 키 크기를 사용하는 소프트웨어를 내보내는 것을 금지하고 있습니다. 다른 국가에서도 다른 제한 사항이있을 수 있습니다. 그러나 저는 변호사가 아닙니다.

나는 내 자신의 사용자 정의 암호화 알고리즘을 만들어 더 좋을 것이고 쉽게 을 파괴에서 해커를 방지하기 위해 수시로 수정? 아니면 이것을 낙담시킬 것입니까?

금지하지 마세요. 광범위한 피어 리뷰를 거친 잘 알려진 알고리즘을 항상 사용하십시오. 알고리즘이 손상된 것으로 알려진 경우가 아니면 알고리즘의 선택을 정기적으로 변경할 필요가 없습니다.

+4

Java가 표시기 인 경우 제한은 여러 관할 지역 (예 : "테러 국가")에만 적용됩니다. AES 256의 사용은 확실히 금지되어 있지 않으며, 제한은 미국으로부터의 수출만을위한 것입니다. AES-192 및 AES-256에는 이러한 제한이 있습니다. 물론 제한은 카프카스케 철저합니다. AES1-28은 우리가 알고있는 한 파손될 수 없으며, "악의적 인"관할권이 조금은 신경 쓰지 않는다는 것을 확신 할 수 있습니다. 참고 : 나는 변호사가 아니며 법적 조언이 아닙니다. –

+0

@owlstead 좋은 코멘트, 나는 미국 수출 통제에 관한 나의 말을 조정했다. –