Java Base64编码与MD5数字摘要算法
2016-01-04 13:20
330 查看
前言
在实际开发中,为了账户和数据的安全,以及验证下载文件没有出错,需要对字符串进行加密。这涉及到密码学的一些知识,在这里只做简单的使用介绍和原理描述。常见加密算法
在实际开发中常见的加密算法有:BASE64 、MD5、SHA、RSA、DES;根据学术性的说法,这里面前四种都不能称之为能加密算法。各种加密算法又根据,可逆性,分为可逆加密和不可逆加密;根据秘钥的对称性,分为对称加密和非对称性加密。BASE64 严格地说,属于编码格式,而非加密算法
MD5(Message Digest algorithm 5,信息摘要算法),严格的说,MD5只是一个摘要算法,而不是加密算法;
SHA(Secure Hash Algorithm,安全散列算法)
DES(Data Encryption Standard,数据加密算法)
RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
这里面,MD5,SHA是不可逆加密;BASE64 、DES、RSA是可逆性加密;DES、RSA属于非对称加密;
各算法使用及原理
1.Base64
1.1Base64原理上边这个图,准确的描述清楚了base64的工作原理。(有同学看到这张表说,中文不可以使用base64,明显没有中文的编码呀?我只能说,那真的是一知半解啦,行不行,试试,自己在摸索下);
1.2Base64使用
这里使用Android 提供的base64来加密
String str=Base64.encodeToString("test".getBytes(),Base64.DEFAULT);//"博客园" String res=new String(Base64.decode(str,Base64.DEFAULT));//Base64.NO_WRAP解决换行 Log.i("base_64_test","encode:"+str+"\n"+"decode:"+res);
result
encode:dGVzdA== decode:test ****************下面是中文*********************** encode:5Y2a5a6i5Zut decode:博客园
1.2.1使用场景:图片、的编码和解码;
1.2.2注意:
1.2.2.1.Base64处理的时候,当字符串过长(一般超过76)时会自动在中间加一个换行符,字符串最后也会加一个换行符。
1.2.2.2.编码中文的时候,注意编码方式,否则会乱码;
2.MD5
2.1.MD5概述MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2、MD3和MD4发展而来。MD5算法的使用不需要支付任何版权费用。 MD5功能:
输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
不同的输入得到的不同的结果(唯一性);
根据128位的输出结果不可能反推出输入的信息(不可逆);
MD5不属于加密算法:
认为不属于的人是因为他们觉得不能从密文(散列值)反过来得到原文,即没有解密算法,所以这部分人认为MD5只能属于算法,不能称为加密算法;
认为属于的人是因为他们觉得经过MD5处理后看不到原文,即已经将原文加密,所以认为MD5属于加密算法;
2.2.MD5原理
MD5概述:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
第一步、填充:如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的长度就为N*512+448(bit); 第二步、记录信息长度:用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N*512+448+64=(N+1)*512位。 第三步、装入标准的幻数(四个整数):标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定义应该是(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)。有点晕哈,其实想一想就明白了。 第四步、四轮循环运算:循环的次数是分组的个数(N+1)
2.3MD5数值摘要算法使用
public String getMD5(String info) { try { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(info.getBytes("UTF-8")); byte[] encryption = md5.digest(); StringBuffer strBuf = new StringBuffer(); for (int i = 0; i < encryption.length; i++) { if (Integer.toHexString(0xff & encryption[i]).length() == 1) { strBuf.append("0").append(Integer.toHexString(0xff & encryption[i])); } else { strBuf.append(Integer.toHexString(0xff & encryption[i])); } } return strBuf.toString(); } catch (NoSuchAlgorithmException e) { return ""; } catch (UnsupportedEncodingException e) { return ""; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String str="hello word"; Log.i("test_md5:","encode:"+str+"\n"+"result"+"getMD5(str));//32位 Log.i("test_md5:","encode:"+str+"\n"+"result"+"getMD5(str).subString(8,24));//16位 }
结果:
32位:13574ef0d58b50fab38ec841efe39df4 13位:d58b50fab38ec841
相关文章推荐
- -Djava.library.path
- java反射详解
- Windows配置JDK环境
- Java——基本语法
- eclipse插件egit安装使用
- Eclipse中如何清除EGit记住的GitHub用户名和密码
- (转)java中String的常见用法
- JavaWeb四个域
- java spring mvc 上传
- Java数字相关
- Java-Blob-取出来插入另一个数据库[导库程序]
- Java多线程碎碎念
- Spring定时任务的几种实现
- android studio项目如何导入到eclipse中
- Eclipse打开时“发现了以元素'd:skin'”开头的无效内容。此处不应含有子元素的解决方法
- eclipse最有用快捷键整理 by 戎码一生
- Struts2 集成 sitemesh配置
- java.net.UnknownHostException
- java中判断一个字符串是否“都为数字”和“是否包含数字”和“截取数字”
- AndroidStudio介绍,代理配置,特性,技巧及从eclipse迁移到as