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

SharedPreference에 대한 암호화/복호화

글쓴이 : 수아 날짜 : 2013-02-26 (화) 01:18 조회 : 4789
글주소 : http://www.androidside.com/B46/44823
 
  코리아정보보안IT학원 구본근
방학특강,C언어 자바 방특,개발 실무자 무료 상담받기,정보보안.IT,무료 컨설팅.
koreaiscom.com
  굿잡아카데미컴퓨터학원 강남점
방특40%할인, 취준생&직장인 국비최대100%무료, JAVA, 맞춤형취업지원
gangnamgoodjobart.com
  데브렉 자바마스터
JAVA, JSP, 스트럿츠, 스프링, MVC, 온라인 자바 동영상 교육과정.
www.devlec.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 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기