Android -base64/md5
来源:互联网 发布:金庸群侠传 人物 数据 编辑:程序博客网 时间:2024/06/04 23:58
参考:
MD5 简介,及其在 Java 中的实现方式
MD5 具有如下特点:
压缩性:任意长度的原数据,其 MD5 值都是固定的,即 128 位;
易计算:计算原数据的 MD5 值是一个比较容易的过程;
抗修改:原数据的任意改动,所得到的 MD5 值都是迥然不同的;
防碰撞:这一点要特别介绍一下。MD5 使用的是散列函数(也称哈希函数),一定概率上也存在哈希冲突(也称哈希碰撞),即多个不同的原数据对应一个相同的 MD5 值。不过,经过 MD4、MD3 等几代算法的优化,MD5 已经充分利用散列的分散性高度避免碰撞的发生。
MD5 是一种不可逆的算法,也就说,你无法通过得到的 MD5 值逆向算出原数据内容。正是凭借这些特点,MD5 被广泛使用。
比如,客户端与服务器的 HTTP 通信,通信双方可以将报文内容做一个 MD5 计算,并将计算所得 MD5 值一并传递给彼此,这样,接收方可以通过对报文内容再次做 MD5 计算得到一个 MD5 值,与传递报文中的 MD5 值做比较,验证数据是否完整,或者是否中途被拦截篡改过。
再比如,网络云盘中的文件秒传功能也运用到 MD5 算法。服务器存储文件的时候,同时记录每一个文件的 MD5 值,不同文件对应着不同的 MD5 值。这样,遇到用户上传文件时,将上传文件的 MD5 值与服务器上所有存储的 MD5 值做比较,如果相同,则说明用户上传的文件已经在服务器存有。这样,只需要在数据库表中添加一个记录,映射到对应的文件,而不用重复上传,实现所谓秒传的功能。
package com.example.administrator.imagethirdcache.utils;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/** * Created by Administrator on 2017/5/4. */public class MD5Encoder { public static String encode(String pwd) { StringBuffer sb = new StringBuffer(); try { MessageDigest digest = MessageDigest.getInstance("MD5"); byte[] bytes = digest.digest(pwd.getBytes("UTF-8")); for (int i = 0; i < bytes.length; i++) { String s = Integer.toHexString(0xff & bytes[i]); if (s.length() == 1) { sb.append("0" + s); } else { sb.append(s); } } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return sb.toString(); }}
package com.example.administrator.imagethirdcache.utils;import java.io.ByteArrayOutputStream;/** * Created by Administrator on 2017/5/4. */public class Base64Util { private static final char[] base64EncodeChars = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; private static byte[] base64DecodeChars = new byte[]{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1}; /** * 将字节数组编码为字符串 * * @param data */ public static String encode(byte[] data) { StringBuffer sb = new StringBuffer(); int len = data.length; int i = 0; int b1, b2, b3; while (i < len) { b1 = data[i++] & 0xff; if (i == len) { sb.append(base64EncodeChars[b1 >>> 2]); sb.append(base64EncodeChars[(b1 & 0x3) << 4]); sb.append("=="); break; } b2 = data[i++] & 0xff; if (i == len) { sb.append(base64EncodeChars[b1 >>> 2]); sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); sb.append(base64EncodeChars[(b2 & 0x0f) << 2]); sb.append("="); break; } b3 = data[i++] & 0xff; sb.append(base64EncodeChars[b1 >>> 2]); sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]); sb.append(base64EncodeChars[b3 & 0x3f]); } return sb.toString(); } /** * 将base64字符串解码为字节数组 * * @param str */ public static byte[] decode(String str) { byte[] data = str.getBytes(); int len = data.length; ByteArrayOutputStream buf = new ByteArrayOutputStream(len); int i = 0; int b1, b2, b3, b4; while (i < len) { /* b1 */ do { b1 = base64DecodeChars[data[i++]]; } while (i < len && b1 == -1); if (b1 == -1) { break; } /* b2 */ do { b2 = base64DecodeChars[data[i++]]; } while (i < len && b2 == -1); if (b2 == -1) { break; } buf.write((int) ((b1 << 2) | ((b2 & 0x30) >>> 4))); /* b3 */ do { b3 = data[i++]; if (b3 == 61) { return buf.toByteArray(); } b3 = base64DecodeChars[b3]; } while (i < len && b3 == -1); if (b3 == -1) { break; } buf.write((int) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2))); /* b4 */ do { b4 = data[i++]; if (b4 == 61) { return buf.toByteArray(); } b4 = base64DecodeChars[b4]; } while (i < len && b4 == -1); if (b4 == -1) { break; } buf.write((int) (((b3 & 0x03) << 6) | b4)); } return buf.toByteArray(); }}
使用:
//待加密字符串 String str = "123abc中国"; /*--------------------------------------------------------------------*/ //md5加密 String md5 = MD5Encoder.encode(str); Log.e("MainActivity", "md5========" + md5); /*--------------------------------------------------------------------*/ /*base64工具类*/ //base64加密 String baseEncodeStr = ""; try { baseEncodeStr = Base64Util.encode(str.getBytes("UTF-8")); Log.e("MainActivity", "baseEncodeStr========" + baseEncodeStr); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //base64解密 String baseDecodeStr = null; try { baseDecodeStr = new String(Base64Util.decode(baseEncodeStr), "UTF-8"); Log.e("MainActivity", "baseDecodeStr========" + baseDecodeStr); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } /*base64系统自带 import android.util.Base64; */ try { //base64加密 String encodeResult = Base64.encodeToString(str.getBytes("UTF-8"), Base64.DEFAULT);//编码 Log.e("MainActivity", "encodeResult========" + encodeResult); //base64解密 String decodeResult = new String(Base64.decode(encodeResult, Base64.DEFAULT));//解码 Log.e("MainActivity", "decodeResult========" + decodeResult); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
0 0
- Android -base64/md5
- Android 加密 MD5和Base64简单介绍
- Android Base64 Md5 SHA1 编码解码 解析
- Android---MD5+BASE64+DES3加密解密
- android中的MD5、Base64、DES/3DES/ADES加解密
- Android DES MD5 UTF—8 BASE64 加密解密
- Android MD5加密类和Base64编解码类
- Android 加密解密 DES BASE64 MD5 UTF-8
- Android 加密解密 DES BASE64 MD5 UTF-8
- MD5与Base64
- Md5(base64)
- Base64、MD5、DES工具
- MD5+SHA+BASE64加密
- Base64和MD5加密
- MD5和Base64
- MD5 SHA1 BASE64加密算法
- BASE64、MD5、SHA
- Unity中md5,base64
- CMake和Make——make makefile cmake qmake都是什么,有什么区别?
- java中四种引用类型
- 图的割点、桥和双连通分支的基本概念
- Mike and gcd problem Codeforces Round #410 (Div. 2)
- fcgi程序两种编写风格
- Android -base64/md5
- 构造函数,析构函数,虚函数等易错混淆点
- 对于python的egg安装的理解
- 设计模式之---命令模式
- thinkphp模板中,if条件的两个变量相等,判断结果却是不等
- AES 128 加密补充
- APP安全报告第十八期:热门棋牌手游的最高安全得分也只有55分!
- 【C语言常识】MDK各种Section分析
- Fragment中,RecyclerView遇到notifyDataSetChanged无效情况说明