1.保存和讀取本地SharedPreferences
上面這張圖就概括了SharedPreferences的用法,所以這里就不細講了,這里需要注意的一點是editor.putString(key,value),不僅可以設置string,還可以設置boolean,long等
2.讀取其他應用的SharedPreferences
核心: 獲得其他app的Context,而這個Context代表訪問該app的全局信息的接口,而決定應用的唯一標識 是應用的包名,所以我們可以通過應用包名獲得對應app的Context 另外有一點要注意的是:其他應用的SP文件是否能被讀寫的前提就是SP文件是否指定了可讀或者 可寫的權限,我們上面創建的是MODE_PRIVATE的就不可以了~所以說你像讀別人的SP里的數據, 很難,另外,一些關鍵的信息,比如密碼保存到SP里,一般都是會做加密的,所以只能自己寫自己玩~ 等下會講下常用的MD5加密方法!
實現流程圖:
代碼示例:
運行效果圖:
代碼實現:
我們讀取SP的操作放在MainActivity.java中完成,點擊按鈕后讀取SP,并通過Toast顯示出來:
public class MainActivity extends AppCompatActivity {
private Context othercontext;
private SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnshow = (Button) findViewById(R.id.btnshow);
btnshow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//獲得第一個應用的包名,從而獲得對應的Context,需要對異常進行捕獲
try {
othercontext = createPackageContext("com.jay.sharedpreferencedemo", Context.CONTEXT_IGNORE_SECURITY);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
//根據Context取得對應的SharedPreferences
sp = othercontext.getSharedPreferences("mysp", Context.MODE_WORLD_READABLE);
String name = sp.getString("username", "");
String passwd = sp.getString("passwd", "");
Toast.makeText(getApplicationContext(), "Demo1的SharedPreference存的\n用戶名為:" + name + "\n密碼為:" + passwd, Toast.LENGTH_SHORT).show();
}
});
}
}
3.使用MD5對SharedPreference的重要數據進行加密
1.簡單的加密處理流程
流程圖如下:
流程圖解析:
Step 1.用戶注冊賬號密碼,賬號密碼校驗后(賬號是否重復,密碼位數 > 6位等), 即賬號密碼有效,注冊成功后,我們提交給服務器的賬號,以及本地加密過的密碼!
Step 2.服務器端將用戶提交的賬號,加密過的密碼保存到服務端的數據庫中,也就是服務 端并不會保存我們的明文密碼(原始)密碼!
Step 3.說回客戶端,如果注冊成功或者登陸成功,你想保存賬號密碼到SP中,保存的的密碼 也需要走一趟加密流程!即明文密碼——>加密,再保存!如果不保存,每次請求的時候,明文密碼 也要走一趟家里流程,然后拿著加密后的密碼來請求服務器!
Step 4.服務器驗證賬號以及加密密碼,成功,分配客戶端一個session標識,后續客戶端可以拿著 這個session來訪問服務端提供的相關服務!
2.MD5簡單介紹:
1)MD5是什么鬼?:
答:Message Digest Algorithm MD5(中文名為消息摘要算法第五版)為計算機安全領域廣泛 使用的一種散列函數,用以提供消息的完整性保護——摘自《百度百科》 簡單點說就是一種加密算法,可以將一個字符串,或者文件,壓縮包,執行MD5加密后, 就可以生產一個固定長度為128bit的串!這個串基本唯一!另外我們都知道:一個十六進制 需要用4個bit來表示,那么對應的MD5的字符串長度就為:128 / 4 = 32位了!另外可能 你看到一些md5是16位的,只是將32位MD5碼去掉了前八位以及后八位!
2)MD5能破解嗎?
答:MD5不可逆,就是說沒有對應的算法,無法從生成的md5值逆向得到原始數據! 當然暴力破解除外,簡單的MD5加密后可以查MD5庫~
3)MD5值唯一嗎?
答:不唯一,一個原始數據只對應一個MD5值,但是一個MD5值可能對應多個原始數據!
3.MD5加密實現例子:
其實網上有很多寫好的MD5的例子,百度或者谷歌一搜一大堆
Md5Util.java:
public class MD5 {
public static String getMD5(String content) {
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(content.getBytes());
return getHashString(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
private static String getHashString(MessageDigest digest) {
StringBuilder builder = new StringBuilder();
for (byte b : digest.digest()) {
builder.append(Integer.toHexString((b >> 4) & 0xf));
builder.append(Integer.toHexString(b & 0xf));
}
return builder.toString();
}
}
MainActivity.java直接調用getMD5這個靜態方法:
Log.e("HeHe", MD5.getMD5("呵呵"));
我們可以看到Logcat上打印出:
這就是加密過后的呵呵了,我們可以把這串密文拷貝到上面這個md5的在線解密網站:
嘿嘿,果然,只是這樣加密一次,就直接破解了,有點不安全的樣子,那就加密100次咯, 就是將加密后的字符串再加密,重復100次,我們在原先的基礎上加個加密一百次的方法:
public static String getMD5x100(String content){
String s1 = content;
for(int i = 0;i < 100;i++){
s1 = getMD5(s1);
}
return s1;
}
然后調用下,發現打印這個的Log:
復制界面網站上: