java之加密解密

1、MD5加密

返回MD5加密后的32位大写字符串,例:E10ADC3949BA59ABBE56E057F20F883E

缺点:加密之后不可逆。

package ydysz.tools;
import java.security.MessageDigest; 
public class MD5 { 
    //十六进制下数字到字符的映射数组 
    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 md5(String inputStr){ 
        return encodeByMD5(inputStr); 
    } 
 
    /** 
    * 验证输入的密码是否正确 
    * @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 md5 = MessageDigest.getInstance("MD5"); 
                //使用指定的字节数组对摘要进行最后更新,然后完成摘要计算 
                byte[] results = md5.digest(originString.getBytes()); 
                //将得到的字节数组变成字符串返回  
                String result = byteArrayToHexString(results); 
                return result; 
            } catch (Exception e) { 
                e.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]; 
    } 

2、Base64加密

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。

大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。

Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。


然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

package com.io;

import java.io.UnsupportedEncodingException;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
 

public class Base64 {

    // 加密
        public String getBase64(String str) {
            byte[] b = null;
            String s = null;
            try {
                b = str.getBytes("utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            if (b != null) {
                s = new BASE64Encoder().encode(b);
            }
            return s;
        }
     
        // 解密
        public String getFromBase64(String s) {
            byte[] b = null;
            String result = null;
            if (s != null) {
                BASE64Decoder decoder = new BASE64Decoder();
                try {
                    b = decoder.decodeBuffer(s);
                    result = new String(b, "utf-8");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return result;
        }
        
        public static void main(String args[]){
            Base64 b6 = new Base64();
            System.out.println(b6.getBase64("spurs611"));
            System.out.println(b6.getFromBase64("c3B1cnM2MTE="));
            System.out.println(b6.getFromBase64(b6.getBase64("spurs611")));
        }
}
 

3、BigInteger加密

package com.io;

import java.math.BigInteger;
 
public class EncrUtil {
    private static final int RADIX = 16;
    private static final String SEED = "11223344556677889900";
 
    public static final String encrypt(String password) {
        if (password == null)
            return "";
        if (password.length() == 0)
            return "";
 
        BigInteger bi_passwd = new BigInteger(password.getBytes());
 
        BigInteger bi_r0 = new BigInteger(SEED);
        BigInteger bi_r1 = bi_r0.xor(bi_passwd);
 
        return bi_r1.toString(RADIX);
    }
 
    public static final String decrypt(String encrypted) {
        if (encrypted == null)
            return "";
        if (encrypted.length() == 0)
            return "";
 
        BigInteger bi_confuse = new BigInteger(SEED);
 
        try {
            BigInteger bi_r1 = new BigInteger(encrypted, RADIX);
            BigInteger bi_r0 = bi_r1.xor(bi_confuse);
 
            return new String(bi_r0.toByteArray());
        } catch (Exception e) {
            return "";
        }
    }
 
    public static void main(String args[]){
        EncrUtil en = new EncrUtil();
        String jiami = en.encrypt("123");
        System.out.println("jiami=="+jiami);
        String jiami1 = en.encrypt("1234");
        System.out.println("jiami=="+jiami1);
        String jiemi = en.decrypt(jiami);
        System.out.println("jiemi=="+jiemi);
        
    }
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值