zoukankan      html  css  js  c++  java
  • 使用JAVA进行MD5加密后所遇到的一些问题

      前言:这几天在研究apache shiro如何使用,这好用到了给密码加密的地方,就碰巧研究了下java的MD5加密是如何实现的,下面记录下我遇到的一些小问题。

      使用java进行MD5加密非常的简单,代码如下:

      public static void main(String[] args) throws Exception
        {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            String password = "wodemima";
            byte[] bytes = md5.digest(password.getBytes());
        }

      但是,当我将bytes直接转换成字符串并且存入数据库的时候我发现了问题,怎么显示的是个乱码呢,显示的是如下乱码:

    �'D���:�@�
    ��&

      我顿时感觉这真是加密了,肯定妥妥的破解不了,但是一般加密后显示的是32位16进制字符串,为什么我这显示乱码了呢。原来是还有一个步骤,就是需要将byte数组转换成16进行,代码如下:

      public static void main(String[] args) throws Exception
        {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            String password = "wodemima";
            byte[] bytes = md5.digest(password.getBytes());
            String result = "";
            for(byte b : bytes)
            {
                result = result + Integer.toHexString(b);
            }
            System.out.println(result);
        }
      //输出显示:fffffffb2744ffffffd1ffffffe419ffffff813affffffde40ffffffefaffffff97ffffffc5261f

      这下子算是像模像样了,但是貌似不是32位,并且有好多fff,原来是返回的byte数组当中有负数,但是有负数为什么会造成这样的结果呢,于是乎我就复习了下java当中的基本类型。

      基本类型表如下:
    数据类型            大小                  范围                                             默认值 
    
    byte(字节)          8                 -128 - 127                                            0
    shot(短整型)        16               -32768 - 32767                                         0
    int(整型)           32            -2147483648 - 2147483647                                  0
    long(长整型)        64    -9233372036854477808-9233372036854477807                          0        
    float(浮点型)       32          1.4E-45 - 3.40292347E+38                                0.0f
    double(双精度)      64       4.9E-324 - 1.79769313486231570E+308                      0.0d
    char(字符型)        16            ‘ u0000 - uffff ’                                   ‘u0000 ’
    boolean(布尔型)     1                 true/false                                          false

       我原来上大学的时候一直在困惑为什么占8位最大值不是128,后来我发现原来还有个0呢。。不知道算不算是顿悟。。。。。

      于Integer.toHexString(b);方法传入的值是int类型的,所以当我传入byte的时候就会自动转换成int类型,又由于byte类型只占8位并且int类型占32位,所以会进行补位,如果byte是整数的话没什么影响,因为前面补的是0。

      但是如果是负数的话就会出现问题了,例如byte b = -112; byte的2进制表示为:1001 0000,java中是以补码的形式进行表示的。(补码我就不介绍了,可以百度查阅。)这样前面补满22位个1的时候就会出现很多f。

      于是我把代码改成下面这个样子:

      public static void main(String[] args) throws Exception
        {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            String password = "wodemima";
            byte[] bytes = md5.digest(password.getBytes());
            String result = "";
            for(byte b : bytes)
            {
                result = result + Integer.toHexString(b & 0xff);
           //b &
    0xff 是为了取低8位
         } 
         System.out.println(result);
      }
      //输出显示:fb2744d1e419813ade40efa97c5261f
     

       这次更像那么回事了,但是我查了一下31位。为什么会少一位,原来byte数组中有的值可能小于16,所以转换成16进制的时候用1位就可以表示了。这个时候我们应该在前面加上个0。

      代码如下:

      public static void main(String[] args) throws Exception
        {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            String password = "wodemima";
            byte[] bytes = md5.digest(password.getBytes());
            String result = "";
            for(byte b : bytes)
            {
                String temp = Integer.toHexString(b & 0xff);
                if(temp.length() == 1)
                {
                    temp = "0" + temp;
                }
                result = result + temp;
            }
            System.out.println(result);
        }
      //输出显示:fb2744d1e419813ade40ef0a97c5261f
     

       好了,这次正确了。这就是我记录的一些问题,有些细节不注意还真不知道怎么回事。

  • 相关阅读:
    .Net Core使用Options模式来使用配置项
    git忽略已经提交的文件(git忽略文件不起作用)
    AirTest
    VSCode搭建rust开发环境
    动态编译和加载java代码
    JavaScript动态应用代码(有点像Java里的drools)
    Win10 Rust 编译报错: linking with `link.exe` failed: exit code: 1181
    git 拉取仓库的单个目录
    dart里实现类似Java里的--classpath的功能
    Rust离线安装
  • 原文地址:https://www.cnblogs.com/renchunxiao/p/3411370.html
Copyright © 2011-2022 走看看