java.security.MessageDigest的使用(1)!

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

我们知道,编程中数据的传输,保存,为了考虑安全性的问题,需要将数据进行加密.我们拿数据库做例子.如果一个用户注册系统的数据库,没有对用户的信息进行保存,如,我去页面注册,输入"Vicky","123456".注册.web服务器未对数据进行加密而直接写入数据库,那么数据库中的用户信息,便是一个直接可用的数据!一旦服务器服务器被黑~那么用户的信息将毫无保留的展现在黑客面前...为了解决这个弊端,现在大多数都会将信息进行MD5加密.如"Vicky"与"123456"加密后,会生成16位或者32位字符串.而黑客即便获得这些数据也无法使用...

    MD5是常用的加密方法,这里主要讲述JDK中的java.security.MessageDigest加密方式!

view plaincopy to clipboardprint?
@Test 
    public void testMD() {  
        try {             
            String username = "Vicky";  
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
            messageDigest.update(username.getBytes());  
            String usernameMD5 = messageDigest.digest().toString();  
            System.out.println(usernameMD5);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    } 
@Test
 public void testMD() {
  try {   
   String username = "Vicky";
   MessageDigest messageDigest = MessageDigest.getInstance("MD5");
   messageDigest.update(username.getBytes());
   String usernameMD5 = messageDigest.digest().toString();
   System.out.println(usernameMD5);
  } catch (Exception e) {
   e.printStackTrace();
  }
 } 打印的是:[B@107077e,这是因为输出的是byte[](messageDigest.digest()得到的是个二进制byte数组,有可能某些byte是不可打印的字符。)...我们可以使用Base64来处理byte[]

view plaincopy to clipboardprint?
@Test 
    public void testMD() {  
        try {             
            String username = "Vicky";  
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
            messageDigest.update(username.getBytes());  
            System.out.println(Base64.encode(messageDigest.digest()));  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    } 
@Test
 public void testMD() {
  try {   
   String username = "Vicky";
   MessageDigest messageDigest = MessageDigest.getInstance("MD5");
   messageDigest.update(username.getBytes());
   System.out.println(Base64.encode(messageDigest.digest()));
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

打印的是:AgwpBZPO+ErqxOosJp0ybQ== 

当然我们可以编写函数,处理二进制转hex字符串.

如:

view plaincopy to clipboardprint?
/** 
     * 将16位byte[] 转换为32位String 
     *  
     * @param buffer 
     * @return 
     */ 
    private String toHex(byte buffer[]) {  
        StringBuffer sb = new StringBuffer(buffer.length * 2);  
        for (int i = 0; i < buffer.length; i++) {  
            sb.append(Character.forDigit((buffer[i] & 240) >> 4, 16));  
            sb.append(Character.forDigit(buffer[i] & 15, 16));  
        }  
 
        return sb.toString();  
    } 
/**
  * 将16位byte[] 转换为32位String
  *
  * @param buffer
  * @return
  */
 private String toHex(byte buffer[]) {
  StringBuffer sb = new StringBuffer(buffer.length * 2);
  for (int i = 0; i < buffer.length; i++) {
   sb.append(Character.forDigit((buffer[i] & 240) >> 4, 16));
   sb.append(Character.forDigit(buffer[i] & 15, 16));
  }

  return sb.toString();
 }

编写测试语句

view plaincopy to clipboardprint?
@Test 
    public void testMD() {  
        try {  
              
            String username = "Vicky";  
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
            messageDigest.update(username.getBytes());  
            System.out.println(toHex(messageDigest.digest()));  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    } 
@Test
 public void testMD() {
  try {
   
   String username = "Vicky";
   MessageDigest messageDigest = MessageDigest.getInstance("MD5");
   messageDigest.update(username.getBytes());
   System.out.println(toHex(messageDigest.digest()));
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

打印:020c290593cef84aeac4ea2c269d326d,返回的是32位的字符串!!!

这样我们便可以直接使用JDK为我们提供的加密类与函数了!

MessageDigest不仅仅只为我们提供了"MD5"加密,还提供了"SHA-1"

创建的方法只为: MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");

MD5与SHA-1的区别为:MD5是16位,SHA是20位(这是两种报文摘要的算法)

难道 MessageDigest 只能用作数据加密吗?如何使用MessageDigest生成安全令牌!!!

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/eclipser1987/archive/2010/01/08/5158784.aspx

目录
相关文章
|
人工智能 前端开发 Java
Java真过饱和了吗?现在学Java迟了?
Java真过饱和了吗?现在学Java迟了?
115 0
|
7月前
|
算法 Java 开发者
Java:求正整数分解为质因数Java
Java:求正整数分解为质因数Java
|
7月前
|
Java 程序员 C++
【Java】Java与C++:比较与对比
【Java】Java与C++:比较与对比
100 0
|
7月前
|
消息中间件 数据可视化 Java
【Java】The Java Headless Mode
【Java】The Java Headless Mode
126 0
【Java】The Java Headless Mode
|
存储 Java PHP
【零基础学Java】—初识Java(一)
【零基础学Java】—初识Java(一)
|
Java 应用服务中间件 Linux
Java 在linux或者tomcat下使用java.jwt.*这个类,报java.awt.headless 报空异常
在开发的过程中使用到了java.jwt.*包下的东西,在开发工具中使用没问题,但是如果到了单独的tomcat或Linux里就会报:java.awt.headless null空异常,再去配置java mv?非常麻烦,看我是如何解决的。
134 0
|
Java 编译器 测试技术
Java-Java5.0注解解读
Java-Java5.0注解解读
55 0
|
Java 编译器
强哥说Java--Java基础
强哥说Java--Java基础
79 0
|
Java 编译器
【JAVA】初识Java
一些IDEA 里面的快捷键 JAVA开发环境 操作IDEA的动作分解 以类(class)为基本单位进行组织 数据(data) 基本数据类型 变量 字面量
132 0
|
Cloud Native Oracle Java
一篇文章和你从 Java1 聊到 Java18
002-2022 年的 20 年里 Java 始终保持在前三的水平,其中在 2005 年、2013-2015 年间、2021 年等时间还多次登顶过第一,这么一个已经发布了 27 年的语言在这些年是怎么始终保持在编程语言前三的呢?这么多年 Java 各个版本间又有什么变化?Java 语言在未来还会继续保持成为语言的常青树吗?这篇文章就来和大家回顾一下 Java 的历史。
293 0
一篇文章和你从 Java1 聊到 Java18