Android字符串MD5加密

MD5概述

MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

128位二进制等于32位十六进制。每一位0~F。

方法

从掘金那篇文章复制的代码,加上了转换大写字母。


    public static String md5(String string) {
        if (TextUtils.isEmpty(string)) {
            return "";
        }
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
            byte[] bytes = md5.digest(string.getBytes());
            String result = "";
            for (byte b : bytes) {
                String temp = Integer.toHexString(b & 0xff);
                if (temp.length() == 1) {
                    temp = "0" + temp;
                }
                result += temp;
            }
            return result.toUpperCase();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

分析

“test”用getBytes()转换得到{116, 101, 115, 116}

顺序:

0:t=116

1:e=101

2:s=115

3:t=116

字符串的尾端在内存的高地址,就是高尾端,也叫大端。

MessageDigest转换成MD5后得到byte数组{9, -113, 107, -51, 70, 33, ……},总共16个字节。经过Integer.toHexString转换得到098F6BCD4621D373CADE4E832627B4F6。

用在线工具计算得到的MD5是098F6BCD4621D373CADE4E832627B4F6,这是32位的十六进制数字,于我的计算结果一致。

为什么-113对应8F?

解:

正数可以直接计算十六进制

113=0X71=0111 0001

正数取反,再加1得到负数

-113=0X8F=1000 1111

加起来刚好等于0。

参考

Android 数据加密之 MD5 加密 - Android - 掘金 https://juejin.im/entry/57e3256aa3413100623c6ec2

Android 加密算法 - 简书 https://www.jianshu.com/p/c7ec2b8d103b

MD5_百度百科 https://baike.baidu.com/item/MD5

Android常用加密手段之MD5加密(字符串加密和文件加密) - frank 的专栏 - CSDN博客 https://blog.csdn.net/briblue/article/details/52984551

java的md5算法中,为什么要将每个字节都&0xff? - yulongkuke的博客 - CSDN博客 https://blog.csdn.net/yulongkuke/article/details/46607127

MD5在线加密/解密/破解 - 站长工具 http://tool.chinaz.com/tools/md5.aspx

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容