2017-01-17 1 views
2

하나의 애플리케이션에서 Android KeyStore를 사용합니다. 전체 KeyStore 및 각 암호 입력에 대한 암호를 설정했습니다. 이러한 암호는 문자열이므로 코드의 문자열 구성원에 저장됩니다.Android KeyStore 비밀번호를 안전하게 저장하는 방법

잠재적으로 공격자가 apk를 디 컴파일하여 앱에서 하드 코드 된 암호를 얻을 수 있기 때문에 앱을 게시하고 싶어도 안전하지 않습니다.

내 질문은 : 위의 시나리오에서

  1. : 공격자가 파일 만 내 응용 프로그램에서 액세스 할 수 있습니다 (루팅 해제 전화에) 내 키 스토어 파일 또는 읽을 수있을 것이다 그래야 혼자 암호 충분하지 않아?
  2. KeyStore 암호를 처리하는 가장 좋은 방법은 무엇입니까? 나는 주변을 둘러 보았지만 이것을 어떻게 처리 할 지 명확한 답을 찾지 못했습니다. clearification에 대한

편집 : 앱 서명에 대해 있지만 암호로 보호 된 안드로이드 키 스토어에서 암호화 키를 저장에 대해 얘기하지 않습니다. 앱은 런타임 중에 키 항목을 검색하기 위해 비밀번호에 대한 액세스 권한을 가져야합니다. 현재 코드의

예 :

String keyStorePwd = "password1"; 
String keyEntryPwd = "password2"; 

FileInputStream fis = getApplicationContext().openFileInput("sms.keystore"); 
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 

ks.load(fis, keyStorePwd.toCharArray()); 

SecretKey key = (SecretKey) ks.getKey("aes_key_sms_notifier", keyEntryPwd.toCharArray()); 
fis.close(); 
+0

어쩌면 당신은 https://github.com/scottyab/secure-preferences – Prexx

+1

@Prexx 나쁜 아이디어를 사용할 수 있습니다 . 하나는 왜 모든 것을 안전하게하기 위해 무덤에있는 무작위 라이브러리를 신뢰하겠습니까? 잠시 동안 보안 기본 설정을 암호화하려면 키가 필요합니다. 열쇠 란 앱에 키가 있음을 의미합니다. 그래서 무의미한 스피드 범프가됩니다. –

+0

grade.properties를 사용하고 있습니다. 거기에 패스를 저장하십시오. – ZeroOne

답변

1

당신의 APK에 암호를 저장하지 않는 것이 좋습니다. 우리가 키 스토어 암호를 말할 때 훨씬 더. 예, 공격자는 암호를 읽을 수있는 방법을 찾을 수 있습니다. 무작위로 포함 된 암호를 APK에 읽으십시오. gradle을 사용한다고 가정 할 때 키 스토어 비밀번호를 저장하는 방법에 대해 gradle을 사용하여 지정된 방법이 있습니다. 당신이 당신의 암호를 포함하는 파일 인 keystore.properties를 제외하기 위해 .gitignore 파일을 수정, 버전 컨트롤을 사용하는 경우

특성은
파일. 그런 다음 repo로 밀어 넣으십시오. 이렇게하면 공유 프로젝트의 다른 개발자가 키 저장소 세부 정보를 알 수 없습니다. 이제 프로젝트의 루트에 실제 keystore.properties 파일을 만들 수 있습니다. 당신의 keystore.properties 파일을 설정 한 후

keyAlias yourKeyAlias 
keyPassword yourKeyPassword 
storeFile pathOfYourKeyStoreFile 
storePassword passwordOfYourKeyStoreFile 

Gradle을
같은 당신의 android { ... } 절 외부 변수 등록 정보를 정의하여 모듈 수준 Gradle을 빌드 파일을 수정 :이 파일은 다음을 포함해야

def keystorePropertiesFile= rootProject.file("keystore.properties") 
def keystoreProperties = new Properties() 
keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 

android { ... } 
android { ... } 내부

선언 signingConfigs { ... } 등이 :

android { 
    signingConfigs { 
    config { 
     keyAlias keystoreProperties['keyAlias'] 
     keyPassword keystoreProperties['keyPassword'] 
     storeFile file(keystoreProperties['storeFile']) 
     storePassword keystoreProperties['storePassword'] 
    } 
    } 

    ........... 

} 

마지막으로 여전히 모듈 수준의 gradle 빌드 파일 안에 debug { ... }release { ... } 구성을 기본값으로 포함하는 buildTypes { ... } 절이 있어야합니다. release 구성을 수정 같은 것을 : 당신이 당신의 APK에 키 스토어 암호를 저장하지 않고 릴리스 빌드,이 모든 것을 만들도록 선택할 때마다 자동으로 APK에 서명 할 수 release { ... }에서 signingConfig signingConfigs.config 정의

buildTypes { 
    debug { 
     *insert debug configs here* 
    } 
    release { 
     *insert release configs here* 

     signingConfig signingConfigs.config 
    } 
    } 

. 건배!

+0

키 저장소를 사용하여 AES 암호화 용 키를 저장하고 앱에서 KeyStore 비밀번호에 액세스해야하는 경우 어떻게해야합니까? 이 grad 솔루션으로 가능합니까? – JoeFox

+0

@JoeFox 당신이 달성하고자하는 것이 무엇인지를 설명 할 수 있습니까? 제 생각에는 AES 키가 실제로 필요한 것이 아닙니다. – divegeek

+0

데스크톱 컴퓨터와 앱간에 안전한 통신을 구현하고자했습니다. 이를 달성하기 위해 키 저장소에 키와 인증서를 저장하려고했습니다. 내 생각은 아무도 키 저장소 비밀에 액세스 할 수 없도록이 키 저장소에 암호를 안전하게 저장하는 방법이었습니다. – JoeFox

1

안드로이드 애플리케이션 (.apk 파일)의 비밀번호를 보호하기위한 절대적인 솔루션을 만드는 것은 불가능합니다. 그러나 다음과 같이 보호 할 수 있습니다 :

  • 소스 코드를 난독 화합니다. 다른 사람들은 당신이 정보를 보호하기 위해 사용했던 방법을 찾기 위해 많은 시간을 할애 할 것입니다.
  • 소스 코드의 모든 문자열을 난독 처리하십시오. 모든 일반 텍스트 문자열은 숨겨져있어 누구도 쉽게 볼 수 있습니다.

두 가지 방법으로 그것을 할 수 있습니다 :

  1. 당황하게 모든 문자열을 수동으로 다음 소스 코드를 난독에 대한 Proguard와를 사용합니다.
  2. 사용 : Bg+ Anti Decompiler/Obfuscator. 그것은, 검사, 난독 숨어, 날조 안드로이드 자바 소스를 보호하기위한 새로운 솔루션 인 것 ... 기술은
관련 문제