Java中4大主题加密算法剖判

Base64编码可用于在HTTP环境下传递较长的标识信息,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串

3.SHA

安然哈希算法(Secure Hash Algorithm)首要适用于数字签名标准(Digital
Signature Standard DSS)里面定义的数字具名算法(Digital Signature
Algorithm
DSA)。对于长度小于2^63位的新闻,SHA1会时有产生一个162位的音讯摘要。该算法经过加密我们多年来的演化和改善已一日比一日好,并被普及使用。该算法的合计是抽出风姿洒脱段明文,然后以意气风发种不可逆的不二秘技将它转变来后生可畏段(常常越来越小)密文,也能够简单的知道为取意气风发串输入码(称为预映射或音信),并把它们转变为长度不够长、位数一定的出口体系即散列值(也称得上新闻摘要或音讯验证代码)的长河。散列函数值能够说是对公开的生龙活虎种“指纹”或是“摘要”所以对散列值的数字具名就足以视为对此公开的数字具名。

java实现:

package com.cn.单向加密;

import java.math.BigInteger;
import java.security.MessageDigest;

/*
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,
被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了, 
但是SHA仍然是公认的安全加密算法,较之MD5更为安全*/
public class SHA {
     public static final String KEY_SHA = "SHA";   

    public static  String  getResult(String inputStr)
    {
        BigInteger sha =null;
        System.out.println("=======加密前的数据:"+inputStr);
        byte[] inputData = inputStr.getBytes();   
        try {
             MessageDigest messageDigest = MessageDigest.getInstance(KEY_SHA);  
             messageDigest.update(inputData);
             sha = new BigInteger(messageDigest.digest());   
             System.out.println("SHA加密后:" + sha.toString(32));   
        } catch (Exception e) {e.printStackTrace();}
        return sha.toString(32);
    }

    public static void main(String args[])
    {
        try {
             String inputStr = "简单加密";   
             getResult(inputStr);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
package com.cn.单向加密;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/*
BASE64的加密解密是双向的,可以求反解.
BASE64Encoder和BASE64Decoder是非官方JDK实现类。虽然可以在JDK里能找到并使用,但是在API里查不到。
JRE 中 sun 和 com.sun 开头包的类都是未被文档化的,他们属于 java, javax 类库的基础,其中的实现大多数与底层平台有关,
一般来说是不推荐使用的。 
BASE64 严格地说,属于编码格式,而非加密算法 
主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。
另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。 
BASE64 
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。
(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.) 
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
*/

public class BASE64 {
    /**  
     * BASE64解密  
     *   
     * @param key  
     * @return  
     * @throws Exception  
     */  
    public static byte[] decryptBASE64(String key) throws Exception {   
        return (new BASE64Decoder()).decodeBuffer(key);   
    }   

    /**  
     * BASE64加密  
     *   
     * @param key  
     * @return  
     * @throws Exception  
     */  
    public static String encryptBASE64(byte[] key) throws Exception {   
        return (new BASE64Encoder()).encodeBuffer(key);   
    }  

    public static void main(String[] args) {

     String  str="12345678";

        try {
        String  result1= BASE64.encryptBASE64(str.getBytes());
         System.out.println("result1=====加密数据=========="+result1);

         byte  result2[]= BASE64.decryptBASE64(result1);
         String  str2=new String(result2);
         System.out.println("str2========解密数据========"+str2);
    } catch (Exception e) {
        e.printStackTrace();
    }

    }

}

  1. BASE64 严俊地说,归于编码格式,而非加密算法
  2. MD5(Message Digest algorithm 5,音讯摘要算法卡塔尔国
  3. SHA(Secure Hash Algorithm,安全散列算法卡塔尔国
  4. HMAC(Hash Message Authentication Code,散列音讯鉴定区别码卡塔尔

  5. BASE64

Base64是互连网上最遍布的用来传输8Bit字节代码的编码方式之大器晚成,大家能够查阅RFC2045~冠道FC2049,上边有MIME的详尽标准。Base64编码可用来在HTTP情形下传递较长的标志音讯。比方,在Java
Persistence系统Hibernate中,就接收了Base64来将二个较长的当世无双标志符(日常为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP
GET
U索罗德L中的参数。在其它应用程序中,也时不经常要求把二进制数据编码为符合放在U途达L(包蕴隐蔽表单域)中的方式。那时,选取Base64编码具有不可读性,即所编码的数目不会被人用肉眼所平昔看出。(来源百度宏观)

SHA-1与MD5的比较

因为两者均由MD4导出,SHA-1和MD5互相很相符。相应的,他们的强度和别的特色也是经常,但还会有以下几点不一致:
l 对强行攻击的安全性:最理解和最重大的界别是SHA-1摘要比MD5摘要长30位。使用强行技巧,发生任何叁个报文使其摘要等于给定报纸文摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数目级的操作。那样,SHA-1对强行攻击有更加大的强度。
l
对密码深入分析的安全性:由于MD5的统筹,易受密码深入分析的口诛笔伐,SHA-1显得不易受这么的攻击。
l 速度:在相似的硬件上,SHA-1的周转速度比MD5慢。

2. MD5

MD5即Message-Digest Algorithm
5(新闻-摘要算法5),用于确认保证消息传输完整大器晚成致。是Computer广泛选拔的杂凑算法之大器晚成(又译摘要算法、哈希算法),主流编制程序语言遍布已有MD5实现。将数据(如汉字)运算为另风华正茂永远长度值,是杂凑算法的幼功原理,MD5的前身有MD2、MD3和MD4。布满用于加密和平解决密技巧,常用来文书校验。校验?不管文件多大,经过MD5后都能生成唯意气风发的MD5值。好比现行反革命的ISO校验,都以MD5校验。怎么用?当然是把ISO经过MD5后发生MD5的值。日常下载linux-ISO的恋人都见过下载链接旁边放着MD5的串。正是用来表明文件是不是相像的。

java实现:

package com.cn.单向加密;

import java.math.BigInteger;
import java.security.MessageDigest;
/*
MD5(Message Digest algorithm 5,信息摘要算法) 
通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串
Digest:汇编
*/
public class MD5 {
    public static final String KEY_MD5 = "MD5";   

    public static  String  getResult(String inputStr)
    {
        System.out.println("=======加密前的数据:"+inputStr);
        BigInteger bigInteger=null;

        try {
         MessageDigest md = MessageDigest.getInstance(KEY_MD5);   
         byte[] inputData = inputStr.getBytes(); 
         md.update(inputData);   
         bigInteger = new BigInteger(md.digest());   
        } catch (Exception e) {e.printStackTrace();}
        System.out.println("MD5加密后:" + bigInteger.toString(16));   
        return bigInteger.toString(16);
    }

    public static void main(String args[])
    {
        try {
             String inputStr = "简单加密8888888888888888888";   
             getResult(inputStr);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

MD5算法具有以下特点:

1、压缩性:任意长度的数据,算出的MD5值长度都以原则性的。
2、轻便总计:从原数据总计出MD5值超轻便。
3、抗校订性:对原数据实行其余退换,哪怕只修改1个字节,所获取的MD5值皆有非常的大分歧。
4、弱抗碰撞:已知原数据和其MD5值,想找到二个有着相符MD5值的数量(即假造数据)是极其辛苦的。
5、强抗碰撞:想找到四个分歧的多寡,使它们具备相似的MD5值,是充裕困难的。
MD5的功用是让大体积消息在用数字签名软件签订私人密钥前被”压缩”成大器晚成种保密的格式(正是把四个随机长度的字节串转换来自然长的十一进制数字串)。除了MD5以外,此中比较显赫的还应该有sha-1、CRUISERIPEMD以致奥德赛等。

java实今世码:

4.HMAC

HMAC(Hash Message Authentication
Code,散列音信鉴定分别码,基于密钥的Hash算法的表明公约。音信鉴定分别码落成鉴定区别的规律是,用公开函数和密钥发生三个稳固长度的值作为验证标志,用这些标记鉴定分别音讯的完整性。使用七个密钥生成多少个定点大小的小数据块,即MAC,并将其加盟到音讯中,然后传输。接纳方利用与发送方分享的密钥举办识别认证等。

java实今世码:

package com.cn.单向加密;
/*
HMAC 
HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。
消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。
使用一个密钥生成一个固定大小的小数据块,
即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。*/
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import com.cn.comm.Tools;

/**  
 * 基础加密组件  
 */  
public abstract class HMAC {   
    public static final String KEY_MAC = "HmacMD5";   

    /**  
     * 初始化HMAC密钥  
     *   
     * @return  
     * @throws Exception  
     */  
    public static String initMacKey() throws Exception {   
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);   
        SecretKey secretKey = keyGenerator.generateKey();   
        return BASE64.encryptBASE64(secretKey.getEncoded());   
    }   

    /**  
     * HMAC加密  :主要方法
     *   
     * @param data  
     * @param key  
     * @return  
     * @throws Exception  
     */  
    public static String encryptHMAC(byte[] data, String key) throws Exception {   

        SecretKey secretKey = new SecretKeySpec(BASE64.decryptBASE64(key), KEY_MAC);   
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());   
        mac.init(secretKey);   
        return new String(mac.doFinal(data));   

    }   

    public static  String  getResult1(String inputStr)
    {
        String path=Tools.getClassPath();
        String fileSource=path+"/file/HMAC_key.txt";
        System.out.println("=======加密前的数据:"+inputStr);
        String  result=null;
        try {
            byte[] inputData = inputStr.getBytes(); 
            String key = HMAC.initMacKey(); /*产生密钥*/  
            System.out.println("Mac密钥:===" + key);  
            /*将密钥写文件*/
            Tools.WriteMyFile(fileSource,key);
            result= HMAC.encryptHMAC(inputData, key);
            System.out.println("HMAC加密后:===" + result); 
        } catch (Exception e) {e.printStackTrace();}  
       return result.toString();
    }

    public static  String  getResult2(String inputStr)
    {
        System.out.println("=======加密前的数据:"+inputStr);
         String path=Tools.getClassPath();
         String fileSource=path+"/file/HMAC_key.txt";
         String key=null;;
        try {
             /*将密钥从文件中读取*/
             key=Tools.ReadMyFile(fileSource);
             System.out.println("getResult2密钥:===" + key);  
        } catch (Exception e1) {
            e1.printStackTrace();}
        String  result=null;
        try {
            byte[] inputData = inputStr.getBytes();  
            /*对数据进行加密*/
            result= HMAC.encryptHMAC(inputData, key);
            System.out.println("HMAC加密后:===" + result); 
        } catch (Exception e) {e.printStackTrace();}  
       return result.toString();
    }

    public static void main(String args[])
    {
        try {
             String inputStr = "简单加密"; 
             /*使用同一密钥:对数据进行加密:查看两次加密的结果是否一样*/
             getResult1(inputStr); 
             getResult2(inputStr);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

简轻松单的java加密算法有: