java.security.MessageDigest

本文深入探讨了将Jive源码移植到MyEclipse中以实现用户登录过程的理解,重点关注登录模块的加密算法,尤其是MD5算法在数据库密码保护中的作用。通过实例代码展示了如何使用Java.security.MessageDigest对数据进行单向加密,并提供了多种将加密后的数据转化为Base64码和16进制字符串的方法,以便于在数据库中存储和比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近研究jive,把jive源码移植到我的myeclipse中,在使jive跑起来的过程中来理解jive的技术点,首先是用户登录,了解了登录模块需要的加密算法。

java.security.MessageDigest简介: 

常用场景: 
    一般我们数据库登录时,需要对用户的密码进行加密操作,不直接将原密码保存到数据库中,用户登录时候也是采用加密算法进行比较 

本案只介绍使用java.security.MessageDigest,对数据进行加密操作。该方法是单向的加密算法 

详细代码如下所表示: 

//基本的公用类 

Java代码   收藏代码
  1. package com.xue.security;  
  2.   
  3. import java.io.IOException;  
  4. import java.security.MessageDigest;  
  5. import java.security.NoSuchAlgorithmException;  
  6.   
  7. public class SecurityTest  
  8. {  
  9.     // MD5是16位,SHA是20位(这是两种报文摘要的算法) 定义两种加密算法的类  
  10.     private static final String MD5_ALGORITHM = "MD5";  
  11.       
  12.     private static final String SHA_1_ALGORITHM = "SHA-1";  
  13.       
  14.     /** 十六进制 */  
  15.     private static final int HEX_NUM = 16;  
  16.       
  17.     /** 十六进制码 */  
  18.     private static final String[] HEX_DIGITS = {"0""1""2""3""4""5""6""7""8""9""a""b""c""d",  
  19.         "e""f"};  
  20.   
  21.   
  22.   
  23. }  

//对数据进行加密的方法: 
Java代码   收藏代码
  1. /**对语句进行单向加密 
  2.     * <功能详细描述> 
  3.     * @param message   需要加密的信息 
  4.     * @return 
  5.     * @throws NoSuchAlgorithmException 
  6.     * @throws IOException [参数说明] 
  7.     *  
  8.     * @return byte[] [返回类型说明] 
  9.     * @exception throws [违例类型] [违例说明] 
  10.     * @see [类、类#方法、类#成员] 
  11.     */  
  12.    public byte[] encrypt(String message)  
  13.        throws NoSuchAlgorithmException, IOException  
  14.    {  
  15.          
  16.        // 加密  
  17.        MessageDigest encrypt = MessageDigest.getInstance(SecurityTest.MD5_ALGORITHM);  
  18.          
  19.        // 添加需要加密的信息  
  20.        encrypt.update(message.getBytes());  
  21.          
  22.        // 对信息信息加密  
  23.        byte[] encryptMD5 = encrypt.digest();  
  24.          
  25.        //获得加密算法  
  26.        System.out.println(encrypt.getAlgorithm());  
  27.          
  28.        //得到加密算法的长度  
  29.        System.out.println(encrypt.getDigestLength());  
  30.          
  31.        return encryptMD5;  
  32.         
  33.    }  

//对数据进行base64转发,有可能某些byte是不可打印的字符。 
存在几种处理方式, 
方式一:转化为base64 
Java代码   收藏代码
  1. /** 将数据转化为BASE64码进行保存 
  2.    * <功能详细描述> 
  3.    * @param encryptMD5 
  4.    * @return [参数说明] 
  5.    *  
  6.    * @return String [返回类型说明] 
  7.    * @exception throws [违例类型] [违例说明] 
  8.    * @see [类、类#方法、类#成员] 
  9.    */  
  10.   public String transform(byte[] encryptMD5)  
  11.   {  
  12.       //对数据进行base64转发,有可能某些byte是不可打印的字符。   
  13.       BASE64Encoder basEncoder = new BASE64Encoder();   
  14.       return basEncoder.encode(encryptMD5);  
  15.   }  

//将byte转化为16进制 
有两种方式转化为16进制 
第一种: 
Java代码   收藏代码
  1. /** 
  2.     * 转化方式二 
  3.     * 2进制转16进制方式二 <功能详细描述> 
  4.     *  
  5.     * @param b 
  6.     * @return [参数说明] 
  7.     *  
  8.     * @return String [返回类型说明] 
  9.     * @exception throws [违例类型] [违例说明] 
  10.     * @see [类、类#方法、类#成员] 
  11.     */  
  12.    public static String byte2hex(byte[] b)  
  13.    {  
  14.        String hs = "";  
  15.        String stmp = "";  
  16.        for (int n = 0; n < b.length; n++)  
  17.        {  
  18.            stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));  
  19.              
  20.            if (stmp.length() == 1)  
  21.            {  
  22.                hs = hs + "0" + stmp;  
  23.            }  
  24.            else  
  25.            {  
  26.                hs = hs + stmp;  
  27.            }  
  28.        }  
  29.          
  30.        return hs.toUpperCase();  
  31.          
  32.    }  

第二种: 
Java代码   收藏代码
  1. /** 
  2.      * 转化方式二 
  3.      * 将数据转化为16进制进行保存,因为有些byte是不能打印的字符 字节数组的转化 
  4.      *  
  5.      * @param b 字节数组 
  6.      * @return [参数说明] 
  7.      *  
  8.      * @return String [返回类型说明] 
  9.      * @exception throws [违例类型] [违例说明] 
  10.      * @see [类、类#方法、类#成员] 
  11.      */  
  12.     public static String byteArrayToHexString(byte[] b)  
  13.     {  
  14.         StringBuffer result = new StringBuffer(128);  
  15.         for (int i = 0; i < b.length; i++)  
  16.         {  
  17.             result.append(byteToHexString(b[i]));  
  18.         }  
  19.         return result.toString();  
  20.     }  
  21.       
  22.     /** 
  23.      * 转化方式二 
  24.      * 将数据转化为16进制进行保存,因为有些byte是不能打印的字符 单字节转化 
  25.      *  
  26.      * @param b 
  27.      * @return [参数说明] 
  28.      *  
  29.      * @return String [返回类型说明] 
  30.      * @exception throws [违例类型] [违例说明] 
  31.      * @see [类、类#方法、类#成员] 
  32.      */  
  33.     public static String byteToHexString(byte b)  
  34.     {  
  35.         int n = b;  
  36.         if (0 > n)  
  37.         {  
  38.             n = 256 + n;  
  39.         }  
  40.         int d1 = n / HEX_NUM;  
  41.         int d2 = n % HEX_NUM;  
  42.         return HEX_DIGITS[d1] + HEX_DIGITS[d2];  
  43.     }  

最后将Byte数组转化为String保存到DB中 


比较两个加密byte数组是否相同 
Java代码   收藏代码
  1. /** 将数据转化为BASE64码进行保存 
  2.    * <功能详细描述> 
  3.    * @param encryptMD5 
  4.    * @return [参数说明] 
  5.    *  
  6.    * @return String [返回类型说明] 
  7.    * @exception throws [违例类型] [违例说明] 
  8.    * @see [类、类#方法、类#成员] 
  9.    */  
  10.   public String transform(byte[] encryptMD5)  
  11.   {  
  12.       //对数据进行base64转发,有可能某些byte是不可打印的字符。   
  13.       BASE64Encoder basEncoder = new BASE64Encoder();   
  14.       return basEncoder.encode(encryptMD5);  
  15.   }  


测试函数 
Java代码   收藏代码
  1. public static void main(String[] args)  
  2.        throws NoSuchAlgorithmException, IOException  
  3.    {  
  4.        SecurityTest t = new SecurityTest();  
  5.        //得到加密数组  
  6.        byte[] data = t.encrypt("我的测试信息!");  
  7.        //转化为字符串,采用base编码方式  
  8.        String baseResult = SecurityTest.transform(data);  
  9.          
  10.        String hexResult = SecurityTest.byte2hex(data);  
  11.          
  12.        System.out.println("baseResult"+baseResult);  
  13.        System.out.println("hexResult"+hexResult);  
  14.          
  15.    }  

结果: 
baseResult:+HwBij+rZkL3Ihsxx2xFsA== 
hexResult:F87C018A3FAB6642F7221B31C76C45B0 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值