총 게시물 0건, 최근 0 건 안내 RSS 글쓰기
검색목록 목록 글쓰기
[유용한TIP]

SharedPreference에 대한 암호화/복호화

글쓴이 : 수아 날짜 : 2013-02-26 (화) 01:18 조회 : 5441
글주소 : http://www.androidside.com/B46/44823
 
  아이티윌JAVA 이동균
JAVA, 교육비 전액 국비지원, 프로젝트 수행, 취업지원실 운영으로 취업지원
www.itwillplus.com
  GOODEE Academy
가산역, 자바취업반, 자바취업률 82%, 전액국비지원, 최대 월 41만원 지원.
www.mesedu.co.kr
  코리아정보보안IT학원 김길중
JAVA, 방학특강 50%할인, 100%국비지원, 취업지원, 수강료조회
코리아정보보안it.com/
신청하기


sharedPreference를 다들 많이 이용하시죠?
근데 만일 여기에 로그인정보같은 중요한 정보를 저장한다면 위험하겠죠?
루팅된 폰에선 금방 읽을수 있으니까요..
이걸 막을수 있는것이 바로 암호화입니다.

import java.util.Map;
import java.util.Set;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

import android.content.Context;
import android.content.SharedPreferences;
import android.provider.Settings;
import android.util.Base64;

public class ObscuredSharedPreferences implements SharedPreferences {
protected static final String UTF8 = "utf-8";
private static final char[] SEKRIT = "ninelab.co.kr".toCharArray(); // INSERT
// A
// RANDOM
// PASSWORD
// HERE.
// Don't use anything you wouldn't want to
// get out there if someone decompiled
// your app.

protected SharedPreferences delegate;
protected Context context;

public ObscuredSharedPreferences(Context context, SharedPreferences delegate) {
this.delegate = delegate;
this.context = context;
}

public class Editor implements SharedPreferences.Editor {

protected SharedPreferences.Editor delegate;

public Editor() {
this.delegate = ObscuredSharedPreferences.this.delegate.edit();
}

@Override
public Editor putBoolean(String key, boolean value) {
delegate.putString(key, encrypt(Boolean.toString(value)));
return this;
}

@Override
public Editor putFloat(String key, float value) {
delegate.putString(key, encrypt(Float.toString(value)));
return this;
}

@Override
public Editor putInt(String key, int value) {
delegate.putString(key, encrypt(Integer.toString(value)));
return this;
}

@Override
public Editor putLong(String key, long value) {
delegate.putString(key, encrypt(Long.toString(value)));
return this;
}

@Override
public Editor putString(String key, String value) {
delegate.putString(key, encrypt(value));
return this;
}

@Override
public void apply() {
delegate.apply();
}

@Override
public Editor clear() {
delegate.clear();
return this;
}

@Override
public boolean commit() {
return delegate.commit();
}

@Override
public Editor remove(String s) {
delegate.remove(s);
return this;
}

@Override
public android.content.SharedPreferences.Editor putStringSet(
String arg0, Set<String> arg1) {
// TODO Auto-generated method stub
return null;
}
}

public Editor edit() {
return new Editor();
}

@Override
public Map<String, ?> getAll() {
throw new UnsupportedOperationException(); // left as an exercise to the
// reader
}

@Override
public boolean getBoolean(String key, boolean defValue) {
final String v = delegate.getString(key, null);
return v != null ? Boolean.parseBoolean(decrypt(v)) : defValue;
}

@Override
public float getFloat(String key, float defValue) {
final String v = delegate.getString(key, null);
return v != null ? Float.parseFloat(decrypt(v)) : defValue;
}

@Override
public int getInt(String key, int defValue) {
final String v = delegate.getString(key, null);
return v != null ? Integer.parseInt(decrypt(v)) : defValue;
}

@Override
public long getLong(String key, long defValue) {
final String v = delegate.getString(key, null);
return v != null ? Long.parseLong(decrypt(v)) : defValue;
}

@Override
public String getString(String key, String defValue) {
final String v = delegate.getString(key, null);
return v != null ? decrypt(v) : defValue;
}

@Override
public boolean contains(String s) {
return delegate.contains(s);
}

@Override
public void registerOnSharedPreferenceChangeListener(
OnSharedPreferenceChangeListener onSharedPreferenceChangeListener) {
delegate.registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);
}

@Override
public void unregisterOnSharedPreferenceChangeListener(
OnSharedPreferenceChangeListener onSharedPreferenceChangeListener) {
delegate.unregisterOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);
}

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);
}
}

@Override
public Set<String> getStringSet(String arg0, Set<String> arg1) {
// TODO Auto-generated method stub
return null;
}

}

이 클래스를 정의해주고요..
SharedPreferences mSPref = new ObscuredSharedPreferences(mContext,
mContext.getSharedPreferences(SETTING_TABLE_NAME, 0)); 로 이용하시면 됩니다.

아주 유용할거예욤..





추천/비추천 클릭하면 추천받으신 분, 추천하신 분 모두에게 포인트가 지급됩니다.

카이로 2013-02-26 (화) 07:41
오호호호호~ 감사합니다.^^
댓글주소 추천 0
     
     
안사지킴이 2013-02-26 (화) 07:41
축하드립니다. ;)
카이로님은 럭키라이팅에 당첨되어 9 포인트 지급되었습니다.
nicehee 2013-02-26 (화) 08:14
써먹어 봐야징...
댓글주소 추천 0
12lch 2013-02-26 (화) 10:08
감사합니다.
댓글주소 추천 0
nicehee 2013-02-28 (목) 10:52
그런데 디컴파일러로 apk를 까보면 스트링으로된 키값을 읽을 수가 있잖아요..
이건 어케하실꺼임...
댓글주소 추천 0
     
     
수아 2013-02-28 (목) 11:44
글쎄..키는 알아도 실지 값은 모르자나요? 키문자열은 내용이 알려오지 않게 해야죠..
댓글주소 추천 0
          
          
권태영 2013-03-05 (화) 00:03
키와, 암호화된 값이있으면 복호화가 가능하지요
댓글주소 추천 0
               
               
수아 2013-03-05 (화) 00:09
아~ 이자 보니까...그 키를 두고 하는 말이였구낭..ㅋㅋ 난또...설정값의 키값인줄...
하긴 apk까면 글겠네요.. 그럼..머.. 초기에 서버통신해서 키값을 받아오는 수밖에 없죠..
댓글주소 추천 0
너보노부리야 2013-03-12 (화) 11:34
감사합니다~~
댓글주소 추천 0
안드로22드 2013-03-20 (수) 14:18
좋은 내용 감사합니다.
댓글주소 추천 0
이전이후 2013-04-03 (수) 18:55
정말 감사합니다 ^^
댓글주소 추천 0
chrees 2013-04-08 (월) 13:59
좋은 글 감사합니다
댓글주소 추천 0
실버개발자 2013-05-03 (금) 18:18
감사합니다.
댓글주소 추천 0
제이모카 2013-05-19 (일) 21:08
잘보고갑니다!!!
댓글주소 추천 0
빛나 2013-10-02 (수) 12:38
굿 입니다. ^^
댓글주소 추천 0
김병희라고요 2016-04-25 (월) 08:50
감사합니다.
http://blog.daum.net/andro_java/139
제 블로그에 올렸습니다.
댓글주소 추천 0
hi
검색목록 목록 글쓰기

총 게시물 0건, 최근 0 건 안내 RSS
번호 분류 제목 글쓴이 날짜 비추천 조회
게시물이 없습니다.
목록
 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기