前言:这几天在研究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 - u\ffff ’ ‘\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
 

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

使用JAVA进行MD5加密后所遇到的一些问题的更多相关文章

  1. java字符串MD5加密后再转16进制

    话不多说上码 pom.xml <!-- MD5 --> <dependency> <groupId>org.apache.commons</groupId&g ...

  2. java加密算法--MD5加密和哈希散列带秘钥加密算法源码

    package com.ompa.common.utils; import java.security.MessageDigest; import java.security.NoSuchAlgori ...

  3. Java生成MD5加密字符串代码实例

    这篇文章主要介绍了Java生成MD5加密字符串代码实例,本文对MD5的作用作了一些介绍,然后给出了Java下生成MD5加密字符串的代码示例,需要的朋友可以参考下   (1)一般使用的数据库中都会保存用 ...

  4. java 实现md5加密的三种方式与解密

      java 实现md5加密的三种方式 CreateTime--2018年5月31日15点04分 Author:Marydon 一.解密 说明:截止文章发布,Java没有实现解密,但是已有网站可以免费 ...

  5. Java实现MD5加密及解密的代码实例分享

    链接:http://www.jb51.net/article/86027.htm Java实现MD5加密及解密的代码实例分享 作者:厦门大学陈黎栋 字体:[增加 减小] 类型:转载 时间:2016-0 ...

  6. Java的MD5加密和解密

    链接:http://www.cnblogs.com/android-blogs/p/5305598.html Java的MD5加密和解密 简单demo: import  java.security.* ...

  7. Java 实现MD5加密

    说到MD5,那我们首先要知道什么是MD5,开始吧 MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改.比如,在UNIX下有很多软件在下载的时候都有 ...

  8. Java C# MD5 加密串一致性

    Java C# MD5 加密串一致性   Java public final static String md5(String s) { char hexDigits[] = { '0', '1',  ...

  9. js MD5加密后的字符串

    js MD5加密后的字符串 <script language="JavaScript"> /************************************** ...

随机推荐

  1. div中显示某个网页

    原文:div中显示某个网页 1.<iframe>方法 2.ajax方法 ajax+流实现无框架限制块刷新: 主框架index页面: js: $(function(){ $("#d ...

  2. 它们的定义app.config中间section节点和在执行中使用

    如果现在我们需要在app.config一个节点的在下面的例子中,定义,我们需要如何进行操作? <configSections> <section name="integra ...

  3. HTML5 Canvas简简单单实现手机九宫格手势密码解锁

    原文:HTML5 Canvas简简单单实现手机九宫格手势密码解锁 早上花了一个半小时写了一个基于HTML Canvas的手势解锁,主要是为了好玩,可能以后会用到. 思路:根据配置计算出九个点的位置,存 ...

  4. IOS中UIDatePicker

    UIDatePicker 1.常见属性 /* 样式 UIDatePickerModeTime,时间 UIDatePickerModeDate,日期 UIDatePickerModeDateAndTim ...

  5. loadrunner常用函数总结

    事务函数:lr_end_sub_transaction 标记子事务的结束以便进行性能分析lr_end_transaction 标记 LoadRunner 事务的结束lr_end_transaction ...

  6. ActionScript GifPlayer的修改

    ActionScript不能播放gif格式的图片,在做as项目的时候如果需要用到加载gif动画图片时,就需要引入第三方包. 常用的第三方包是GifPlayer,在github上可以找到该项目的源代码C ...

  7. 在windows server里,对于同一个账号,禁止或允许多个用户使用该账户,同时登录

    开始 -> 运行 -> gpedit.msc -> 本地计算机 策略 -> 计算机配置 -> 管理模板 -> Windows 组件 -> 远程桌面服务 -&g ...

  8. Perl基础(1)chop与chomp的区别

    chop是去掉字符串的最后一个字符 chomp是去掉"$/"指定的结尾符号 测试程序一: [perl] #!/bin/perl $tmp = "sincere" ...

  9. weblogic生产、开发模式互转

    生产模式与开发模式转换: 1.生产模式-->开发模式     将%DOMAIN_HOME%\config\config.xml文件中<production-mode-enabled> ...

  10. three.js 源代码凝视(十六)Math/Frustum.js

    商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发 ...