您的位置:首页 > 编程语言 > Java开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: