java字符串应用之密码加密与验证

    MD5的全称是Message-Digest Algorithm 5,在20世纪90年代初由MTI的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3、MD4发展而来。MD5将任意长度的“字符串”变换成一个128为的大整数,并且它是一个不可逆的字符串变换算法,也就是说,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始字符串有无穷多个,这有点像不存在反函数的数学函数。
   
一、关键技术点
    1、通过java.Security.MessageDigest的静态方法getInstance创建具有指定算法名称的信息摘要,参数为算法名,传入”MD5“则表示使用MD5算法
    2、MessageDigest的digest实例方法使用指定的字节数组对摘要进行最后的更新,然后完成摘要计算,返回存放哈希值结果的字节数组,这个字节数组就是MD5的加密产品。
    3、将加密后的字节数组转换成十六进制的字符串,形成最终的密码。
    4、当输入字符串经过MD5加密后,得到的字符串与密码一样,则认为密码验证通过。
   
二、演示实例: 

 

package  book.String;

import  java.security.MessageDigest;

/**
 * 对密码进行加密和验证的程序
 * 
@author joe
 *
 
*/


public   class  Password  {
    
    
//十六进制下数字到字符的映射数组
    private final static String[] hexDigits = {"0""1""2""3""4",
        
"5""6""7""8""9""a""b""c""d""e""f"}
;
    
    
/** 把inputString加密     */
    
public static String createPassword(String inputString){
        
return encodeByMD5(inputString);
    }

    
    
/**
     * 验证输入的密码是否正确
     * 
@param password    真正的密码(加密后的真密码)
     * 
@param inputString    输入的字符串
     * 
@return    验证结果,boolean类型
     
*/

    
public static boolean authenticatePassword(String password, String inputString) {
        
if(password.equals(encodeByMD5(inputString))) {
            
return true;
        }
 else {
            
return false;
        }

    }

    
    
/** 对字符串进行MD5加密     */
    
private static String encodeByMD5(String originString) {
        
if (originString != null{
            
try{
                
//创建具有指定算法名称的信息摘要
                MessageDigest md = MessageDigest.getInstance("MD5");
                
//使用指定的字节数组对摘要进行最后更新,然后完成摘要计算
                byte[] results = md.digest(originString.getBytes());
                
//将得到的字节数组变成字符串返回
                String resultString = byteArrayToHexString(results);
                
return resultString.toUpperCase();
            }
 catch(Exception ex) {
                ex.printStackTrace();
            }

        }

        
return null;
    }

    
    
/**
     * 转换字节数组为十六进制字符串
     * 
@param b    字节数组
     * 
@return    十六进制字符串
     
*/

    
private static String byteArrayToHexString(byte[] b) {
        StringBuffer resultSb 
= new StringBuffer();
        
for (int i = 0; i < b.length; i++{
            resultSb.append(byteToHexString(b[i]));
        }

        
return resultSb.toString();
    }

    
    
/** 将一个字节转化成十六进制形式的字符串     */
    
private static String byteToHexString(byte b) {
        
int n = b;
        
if (n < 0)
            n 
= 256 + n;
        
int d1 = n / 16;
        
int d2 = n % 16;
        
return hexDigits[d1] + hexDigits[d2];
    }

    
    
public static void main(String[] args) {
        String password 
= Password.createPassword("888888");
        System.out.println(
"对888888用MD5摘要后的字符串:" + password);
        String inputString 
= "8888";
        System.out.println(
"8888与密码匹配?" + 
                Password.authenticatePassword(password, inputString));
        inputString 
= "888888";
        System.out.println(
"888888与密码匹配?" + 
                Password.authenticatePassword(password, inputString));
    }


}

 

输出结果:
对888888用MD5摘要后的字符串:21218CCA77804D2BA1922C33E0151105
8888与密码匹配?false
888888与密码匹配?true

你可能感兴趣的:(J2SE学习笔记)