Java Base64编码与MD5数字摘要算法

前言

在实际开发中,为了账户和数据的安全,以及验证下载文件没有出错,需要对字符串进行加密。这涉及到密码学的一些知识,在这里只做简单的使用介绍和原理描述。

常见加密算法

在实际开发中常见的加密算法有: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)16C=(FEDCBA98)16D=(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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值