2012-07-25 3 views
4

나는 웹 서버를 기반으로하는 안드로이드 앱을 개발 중이다. 앱을 설치 한 사용자는 웹에 등록해야 로그인 할 수 있습니다. 다른 사람이 로그인하려고하면 API으로 정보를 확인합니다.안드로이드에서 세션 값을 암호화하는 방법

그래서 난 계속해서 암호 처리에 대해 궁금합니다. 값을 암호화하거나 모두 SharedPreferences에 넣어야합니까? 암호화가 필요한 경우 효율적인 방법은 무엇입니까?

마지막으로 SharedPreferences가 보안면에서 충분한가요?

감사합니다.

답변

2

물론 로그인, 비밀번호 또는 이메일과 같은 사용자 설정을 암호화해야합니다. 나는 저장을 위해 SharedPreferences을 선호하고, 그렇습니다. 보안면에서 충분합니다.

I에 유래에서이 두 가지 방법을 발견했습니다, 그것은 공정한 충분 :

protected String encrypt(String value) { 
    try { 
     final byte[] bytes = value!=null ? value.getBytes(UTF8) : new byte[0]; 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
     SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT)); 
     Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 
     pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(Settings.Secure.getString(context.getContentResolver(),Settings.System.ANDROID_ID).getBytes(UTF8), 20)); 
     return new String(Base64.encode(pbeCipher.doFinal(bytes), Base64.NO_WRAP),UTF8); 
    } catch(Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

protected String decrypt(String value){ 
    try { 
     final byte[] bytes = value!=null ? Base64.decode(value,Base64.DEFAULT) : new byte[0]; 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
     SecretKey key = keyFactory.generateSecret(new PBEKeySpec(SEKRIT)); 
     Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); 
     pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(Settings.Secure.getString(context.getContentResolver(),Settings.System.ANDROID_ID).getBytes(UTF8), 20)); 
     return new String(pbeCipher.doFinal(bytes),UTF8); 
    } catch(Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

내가 발견하면, 나는 내 대답을 편집 할 수 있습니다, 링크를 찾을 수 없습니다.

편집 : 소스를 찾았 으면 here에 대한 모든 토론을 볼 수 있습니다.

+3

물론 키를 앱에 저장하고 DES로 암호화하면 캐주얼 스누핑이 중지됩니다. 공유 된 환경 설정은 어떤 방식 으로든 앱에 개인적으로 적용되므로 실제로 저장 장치에서는별로 달성하지 못합니다. –

+0

나는 이것이 내가 무엇을 요구하고 있는지 생각한다. 잘 작동 해, 고마워. –

3

암호화는 쉽지만 실제 질문은 어떤 키입니까? 앱에서 키를 하드 코딩하거나 알려진 값에서 키를 추출하면 기기에 액세스 할 수있는 모든 사람이 해당 값을 쉽게 해독 할 수 있습니다. 당신이 달성하고있는 것은 난독 화일뿐입니다. Android에는 시스템 키 저장소에 대한 공개 API가 없으므로 실제 비밀번호를 저장해야 할 경우 할 수있는 일이별로 없습니다. 물론 사용자가 앱을 시작할 때마다 비밀번호를 입력하지 않는 한, 목적에 어긋납니다.

서버와 클라이언트를 모두 제어하는 ​​경우 다른 형태의 토큰 기반 인증을 사용하고 토큰 만 저장하면됩니다. 토큰이 만료되어 철회 될 수 있기 때문에 실제 암호 (다른 사이트에서도 사용할 수 있음)를 노출하는 것보다 토큰을 보유하는 사람의 피해가 훨씬 적습니다.

+0

감사합니다, 지금 당신이 의미하는 바를 얻었습니다. –

+0

니콜라이, 명확하고 상세한 답변을 주셔서 감사합니다. 토큰 기반 인증에 충분한 시간이 없습니다. 그러나 곧 지시대로 시스템을 업데이트 할 것입니다. –

관련 문제