MD5

2020-09-22  本文已影响0人  江河湖海琴瑟琵琶

最近接触java,需要用md5加密一个字符串,找了半天没找到现成的方法,
自己实现 #(错误示例)

        String str = "1234567890";//目标
        MessageDigest instance;
        try {
            //获取 MD5实例
            instance = MessageDigest.getInstance("MD5");
            //str.getBytes() 获取目标的字节数组
            //instance.digest() 加密方法 ,会返回一个有16个元素的字节数组
            byte[] byteArray = instance.digest(str.getBytes());
            
            StringBuffer result = new StringBuffer();
            //遍历加密结果
            for (byte b : byteArray) {
                //每个字节转成两个十六进制数
                result.append(Integer.toHexString(b & 0xFF));
            }
            System.out.println(result);
            //结果 e87f1fcf82d132f9bb018ca6738a19f
            //正确 e807f1fcf82d132f9bb018ca6738a19f
            
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

坑爹的输出结果竟然是31位,明显不对

分析

问题出在把字节转成两个十六进制数的时候.
转换后十六进制的 07 在拼接时 0 会被舍去. 所以少了一位.

解决

转换时判断长度,小于2位在前边补0
最终代码如下

public void test() {

        String str = "1234567890";
        MessageDigest instance;
        try {
            
            instance = MessageDigest.getInstance("MD5");
            byte[] byteArray = instance.digest(str.getBytes());
            StringBuffer result = new StringBuffer();
        
            for (byte b : byteArray) {
                result.append(
                         //小于2位在前边补0
                         (Integer.toHexString(b & 0xFF).length() == 2 ) ?
                                 Integer.toHexString(b & 0xFF) :
                                    '0' + Integer.toHexString(b & 0xFF)  
                        );
            }
            System.out.println(result);
            //e807f1fcf82d132f9bb018ca6738a19f
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

php中只要调用一个方法

<?php
echo md5('1234567890').PHP_EOL;
//结果 e807f1fcf82d132f9bb018ca6738a19f
#PHP是世界上最好的语言!
上一篇下一篇

猜你喜欢

热点阅读