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

SharedPreference에 대한 암호화/복호화

글쓴이 : 수아 날짜 : 2013-02-26 (화) 01:18 조회 : 5032
글주소 : http://www.androidside.com/B46/44823
 
  데브렉 자바마스터
JAVA, JSP, 스트럿츠, 스프링, MVC, 온라인 자바 동영상 교육과정.
www.devlec.com
  전주 한국스마트정보교육원
전주 자바 오라클, 모바일 웹, 앱개발, 교육등 소프트웨어개발 전문교육
ksmart.or.kr
  대학인강은 역시 유니와이즈
공대생을 위한 완벽강의! 개념부터 다양한 실습까지, 자바프로그래밍은 유니와이즈에서
www.uniwise.co.kr
신청하기


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 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기