五、Android中的实现
1.核心算法
1.1 计算字符串的MD5值
public static String encrypt(String src) throws Exception{ MessageDigest md5 = MessageDigest.getInstance("MD5"); //得到加密后的字节数组 byte[] bytes = md5.digest(src.getBytes()); StringBuilder result = new StringBuilder(); //将字节数组转换成16进制式的字符串 for (byte b : bytes) { //1个byte为8个bit,一个hex(16)进制为16bit,故1个byte可以用2个hex表示 String temp = Integer.toHexString(b & 0xff); //不足2长度的用0来补充 if (temp.length() == 1) { temp = "0" + temp; } result.Append(temp); } //返回最终的字符串 return result.toString();}1.2 计算文件的MD5值
public static String getFileMD5(File file){ if(file == null||!file.exists()) return ""; FileInputStream in = null; byte[] buffer = new byte[1024]; StringBuilder res = new StringBuilder(); int len; try { MessageDigest messageDigest = MessageDigest.getInstance("MD5"); in = new FileInputStream(file); while ((len=in.read(buffer))!=-1){ //计算文件时需要通过分段读取多次调用update来将数据更新给MessageDigest对象 messageDigest.update(buffer,0,len); } //真正计算文件的MD5值 byte[] bytes = messageDigest.digest(); //将字节数组转换成16进制的字符串 for(byte b:bytes){ String temp = Integer.toHexString(b&0xff); if(temp.length()!=2){ temp = "0"+temp; } res.append(temp); } //返回最终的字符串 return res.toString(); } catch (Exception e) { e.printStackTrace(); } finally { if(null!=in){ try { in.close(); }catch (Exception e){ e.printStackTrace(); } } } return res.toString(); }2.实际应用
2.1 密码认证
密码认证估计是MD5在Android中运用最广泛的地方了 。如今 , 正常的App都少不了注册登录的功能 , 而注册登录必不可少的就是密码 , 密码是用户在Android设备注册时需要向服务器发送密码 , 然后服务器将密码保存 。这样就存在一种问题 , 如果密码以明文发送的的话 , 很可能在中途被恶意截取 。又或者保存在服务器的密码被泄漏 , 也会造成很大的危害 , 于是为了用户的安全 , 一般会采用MD5对密码进行加密 , 然后将加密后的密码 , 其实就是密码的MD5值发送给服务器 , 这样即使MD5值泄漏 , 不法分子也很难得出正确的密码 。而登录判定时 , 只需判断输入的密码的MD5值与服务器中的MD5值是否相同即可 。口说无凭!我们先来看看下面微信公众平台 , 来证明很多平台的密码是经过MD5加密的 。
微信公众平台
首先我们在微信公众平台网页端输入账号和密码
文章插图
然后我们通过fiddler4爬取请求的接口 , 通过请求头我们可以找到username和pwd的字段 , 可以断定是账号和密码 , 接着核对账号 , 确认是我们刚刚输入的请求 , 然后核对pwd字段 , 结果发现是32位的字符串 , 我们可以断定这个32位字符串应该是MD5值 , 因为我们知道MD5值长度固定为128位 , 然后用16进制表示的话 , 就是32个16进制数字(128/4)
文章插图
接着我们使用 Wan Android中的MD5加密工具 来验证此字符串是否为123456的MD5值 。可以对比上下两张图 , 可以发现两者的字符串是一样的 , 所以我们可以断定当我们登录微信公众平台时 , 其密码是经过MD5加密后发送给服务器 , 然后服务器对比数据库中账号所对应的密码MD5值 , 由于不相同 , 所以返回了错误信息
文章插图
2.2 一致性验证
一致性验证就是文件MD5值的应用 , MD5加密时 , 将整个文件当作一个大文本信息 , 通过字符串变换算法 , 产生了唯一的MD5值 。在Android中最常用的莫过于文件下载 , 比如首先服务器会预先给一个完整的文件提供一个MD5值 , 用户下载该文件后 , 重新计算文件的MD5值 , 如果相同 , 证明文件已经被成功的下载了 。如果不相同 , 则证明文件下载出错或者当前文件还在下载中 。在Android中使用计算文件的MD5值需要注意要将该操作放在子线程中操作 , 因为计算文件MD5值属于耗时操作 , 不能在主线程运行 , 否则会出现OOM的情况 。
推荐阅读
- java 9 10 11 12 13新特性,这里为你总结全了
- 超全面的Linux应急响应技巧
- hash 算法原理及应用漫谈
- SEO全揭秘,这里独一份,适合各阶段人群
- T-POT 19.03.1 安全工具:开源蜜罐部署和使用
- 网络分段的安全优势是什么?
- 安溪茶业标准化牢筑茶叶安全防火墙
- 办公室风水禁忌大全最新总结
- 金沙江两岸露天茶摊多 20日前拟全部搬迁
- 紫砂收藏快速升温 全国紫砂门店逾万家