MD5

作者: 江河湖海琴瑟琵琶 | 来源:发表于2020-09-22 18:01 被阅读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是世界上最好的语言!
    

    相关文章

      网友评论

          本文标题:MD5

          本文链接:https://www.haomeiwen.com/subject/fcnwyktx.html