• java.security.MessageDigest


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

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

    1. @Test  
    2.     public void testMD() {  
    3.         try {             
    4.             String username = "Vicky";  
    5.             MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
    6.             messageDigest.update(username.getBytes());  
    7.             String usernameMD5 = messageDigest.digest().toString();  
    8.             System.out.println(usernameMD5);  
    9.         } catch (Exception e) {  
    10.             e.printStackTrace();  
    11.         }  
    12.     }  

    打印的是:[B@107077e,这是因为输出的是byte[](messageDigest.digest()得到的是个二进制byte数组,有可能某些byte是不可打印的字符。)...我们可以使用Base64来处理byte[]

    1. @Test  
    2.     public void testMD() {  
    3.         try {             
    4.             String username = "Vicky";  
    5.             MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
    6.             messageDigest.update(username.getBytes());  
    7.             System.out.println(Base64.encode(messageDigest.digest()));  
    8.         } catch (Exception e) {  
    9.             e.printStackTrace();  
    10.         }  
    11.     }  

    打印的是:AgwpBZPO+ErqxOosJp0ybQ== 

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

    如:

    1. /** 
    2.      * 将16位byte[] 转换为32位String 
    3.      *  
    4.      * @param buffer 
    5.      * @return 
    6.      */  
    7.     private String toHex(byte buffer[]) {  
    8.         StringBuffer sb = new StringBuffer(buffer.length * 2);  
    9.         for (int i = 0; i < buffer.length; i++) {  
    10.             sb.append(Character.forDigit((buffer[i] & 240) >> 416));  
    11.             sb.append(Character.forDigit(buffer[i] & 1516));  
    12.         }  
    13.   
    14.         return sb.toString();  
    15.     }  

    编写测试语句

    1. @Test  
    2.     public void testMD() {  
    3.         try {  
    4.               
    5.             String username = "Vicky";  
    6.             MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
    7.             messageDigest.update(username.getBytes());  
    8.             System.out.println(toHex(messageDigest.digest()));  
    9.         } catch (Exception e) {  
    10.             e.printStackTrace();  
    11.         }  
    12.     }  

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

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

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

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

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

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

  • 相关阅读:
    数据分析系统DIY1/3:CentOS7+MariaDB安装纪实
    NSArray与NSString、NSData,NSDictionary与NSString、NSData 相互转化
    Geek地生活,文艺地思考
    Android开发中遇到的问题(五)——Eclipse导入Android项目出现"Invalid project description overlaps the location of another project"错误的解决办法
    Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法
    Android开发中遇到的问题(三)——eclipse创建android项目无法正常预览布局文件
    Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局
    Android开发学习总结(三)——appcompat_v7项目说明
    Android开发学习总结(二)——使用Android Studio搭建Android集成开发环境
    Android开发学习总结(一)——搭建最新版本的Android开发环境
  • 原文地址:https://www.cnblogs.com/jiayonghua/p/3077798.html
Copyright © 2020-2023  润新知