嘿嘿,上面我们这样直接把账号密码保存到sp里,如果没root的手机,别的应用倒无法访问手机,如果root了,然后数据给其他应用获取到,然后造成了一些后果,这...就不怪我们了,哈哈,谁叫你root了~,这锅我们不背,的确是这样!但是作为一名有责任心的APP开发人员,我们总不能这样是吧,我们可以使用一些加密算法对用户密码进行加密,另外我们一般加密的都是用户密码!下面我们简画个简单的图帮助大家理解下加密的处理的流程:
1.简单的加密处理流程
流程图如下:
流程图解析:
- Step 1.用户注册账号密码,账号密码校验后(账号是否重复,密码位数 > 6位等),即账号密码有效,注册成功后,我们提交给服务器的账号,以及本地加密过的密码!
- Step 2.服务器端将用户提交的账号,加密过的密码保存到服务端的数据库中,也就是服务端并不会保存我们的明文密码(原始)密码!
- Step 3.说回客户端,如果注册成功或者登陆成功,你想保存账号密码到SP中,保存的的密码也需要走一趟加密流程!即明文密码——>加密,再保存!如果不保存,每次请求的时候,明文密码也要走一趟家里流程,然后拿着加密后的密码来请求服务器!
- Step 4.服务器验证账号以及加密密码,成功,分配客户端一个session标识,后续客户端可以拿着这个session来访问服务端提供的相关服务!
嘿嘿,理解了吧,加密的方法有很多种,小猪也不是这方面的高玩,以前使用过的加密方法是MD5加密,本节也给大家简单介绍一下这个MD5加密,以及演示下用法~
2.MD5简单介绍:
1)MD5是什么鬼?:
答:Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护——摘自《百度百科》简单点说就是一种加密算法,可以将一个字符串,或者文件,压缩包,执行MD5加密后,就可以生产一个固定长度为128bit的串!这个串基本唯一!另外我们都知道:一个十六进制需要用4个bit来表示,那么对应的MD5的字符串长度就为:128 / 4 = 32位了!另外可能你看到一些md5是16位的,只是将32位MD5码去掉了前八位以及后八位!不信么,我们来试试百度一下:md5在线解密,第一个:http://www.cmd5.com/
2)MD5能破解吗?
答:MD5不可逆,就是说没有对应的算法,无法从生成的md5值逆向得到原始数据!当然暴力破解除外,简单的MD5加密后可以查MD5库~
3)MD5值唯一吗?
答:不唯一,一个原始数据只对应一个MD5值,但是一个MD5值可能对应多个原始数据!
3.MD5加密实现例子:
其实网上有很多写好的MD5的例子,百度或者谷歌一搜一大堆,这里提供下小猪用的MD5加密工具类!
Md5Util.java:
/** * Created by Jay on 2015/9/2 0002. */ 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:
复制界面网站上:
好的,装B成功~