java安全之加密技术

加密方式

主要有:对称加密算法,基础加密算法,非对称加密算法。

一,对称加密算法

只有一个密钥key进行加密解密,可以逆向加解密。

1.凯撒密码

古代有名的加密算法,将加密的数据进行一定的以为,属于对称加密,密钥key = 2(int 值)。

这种加密非常简单,只需要对相应的明文移位就得到了加密后的密文,如:明文为abc,key = 2(移2位),那么密文为cde,原理非常的简单。
这种加密在后来明显不能满足时代发展的需要,通过**频度分析法**,可以快速的破解。
频度分析法:这种方法通过一定的理论和相关统计,得到一定的规律就是:字母e出现的概率最高,t,a,o,n,i,r,s和是常用频率的字母,通过频度分析和逆向凯撒密码,就可以得到破译的几种明文。 

2.DES

速度较快,适用于加密大量数据的场合。

    DES密钥至少8个数字(64个比特位),使用了前56个比特位,后8位用作校验码,超过8对密文没有影响。

3.DES

基于DES,强度更高,但是加密效率不高。

    对一块数据用3个不同的密钥进行3次加密
DES算法有四种工作模式:

参考这篇博客

1.ECB:电子密码本模式
优点:

1.有利于并行计算;
2.误差不会被传送;

缺点:

1.不能隐藏明文的模式;
2.可能对明文进行主动攻击。

ECB模式

2.CBC:加密分组链接模式
密文呈分组链接的特点,密文之间有依赖关系,加密强度更高,能防止主动攻击。

CBC模式

3.CFB:加密反馈模式

隐藏了明文模式;
这里写图片描述

4.OFB:输出反馈模式

这里写图片描述

5.CTR模式

实现代码

public class DESUtil {
    //算法名称 
    public static final String KEY_ALGORITHM = "DES";
    //算法名称/加密模式/填充方式 
    public static final String CIPHER_ALGORITHM = "DES/ECB/NoPadding";
    /**
     * 生成密钥key对象
     * @param KeyStr 密钥字符串 
     * @return 密钥对象 
     * @throws Exception 
     */
    private static SecretKey keyGenerator(String keyStr) throws Exception {
        byte input[] = HexString2Bytes(keyStr);
        DESKeySpec desKey = new DESKeySpec(input);
        //创建一个密匙工厂,然后用它把DESKeySpec转换成
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey securekey = keyFactory.generateSecret(desKey);
        return securekey;
    }
    /** 
     * 加密数据
     * @param data 待加密数据
     * @param key 密钥
     * @return 加密后的数据 
     */
    public static String encrypt(String data, String key) throws Exception {
        Key deskey = keyGenerator(key);
        // 实例化Cipher对象,它用于完成实际的加密操作
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        SecureRandom random = new SecureRandom();
        // 初始化Cipher对象,设置为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, deskey, random);
        byte[] results = cipher.doFinal(data.getBytes());
        for (int i = 0; i < results.length; i++) {
            System.out.print(results[i] + " ");
        }
        System.out.println();
        // 执行加密操作。加密后的结果通常都会用Base64编码进行传输 
        return Base64.encodeBase64String(results);
    }

    /** 
     * 解密数据 
     * @param data 待解密数据 
     * @param key 密钥 
     * @return 解密后的数据 
     */
    public static String decrypt(String data, String key) throws Exception {
        Key deskey = keyGenerator(key);
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        //初始化Cipher对象,设置为解密模式
        cipher.init(Cipher.DECRYPT_MODE, deskey);
        // 执行解密操作
        return new String(cipher.doFinal(Base64.decodeBase64(data)));
    }

4.AES

加密强度升级,密钥为128(只能为128)个比特。

    高级加密标准,是下一代加密算法标准, 速度快,安全级别高

代码实现参考DES,两者实现差不多。

二,基本的单向加密算法

基本的单向加密算法有以下几种:

BASE64 严格地说,属于编码格式,而非加密算法
MD5(Message Digest algorithm 5,信息摘要算法)
SHA(Secure Hash Algorithm,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鉴别码) 

1.BASE64

Base64编码可用于在HTTP,mime协议下快速传输数据, 严格地说,属于编码格式,而非加密算法。

    Base64的作用:将非ASCII字符的数据转换成ASCII字符的一种方法,因为某些系统中只能使用ASCII字符(比如传输邮件只能传输ASCII)。

实现

public class BASE64 {

    // 主要使用到两个类,BASE64Decoder,BASE64Encoder
    // BASE64解密
    public static byte[] decryptBASE64(String key) throws Exception {   
        return (new BASE64Decoder()).decodeBuffer(key);   
    }   


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

2.MD5

信息摘要算法,用于确保信息传输完整一致。广泛用于加密和解密技术,常用于文件校验。不管文件多大,经过MD5后都能生成唯一的MD5值(SHA-1与此类似)

特点

1、任意长度的数据,MD5值长度都是固定的。
2、对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
3、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
4、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。

以下几行代码可以实现实现

         MessageDigest md = MessageDigest.getInstance("MD5");   
         byte[] inputData = inputStr.getBytes(); 
         md.update(inputData);   
         bigInteger = new BigInteger(md.digest());

SHA

Secure Hash Algorith,安全散列算法,是数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域,较MD5更为安全。

SHA1比MD5安全,是因为SHA-1摘要为160位,MD5摘要为128位,相差32位,因此SHA1的强度更大。

代码实现

 public static byte[] encrypt(byte[] data) throws Exception {  
        MessageDigest sha = MessageDigest.getInstance(KEY_SHA);  
        sha.update(data);  
        return sha.digest();  
    } 

三,非对称加密算法

存在公钥和私钥的概念,要完成加解密操作,需要两个密钥同时参与。公钥加密的数据必须使用私钥才可以解密,同样,私钥加密的数据也 只能通过公钥进行解密。

RSA加密算法

RSA加密算法是一种典型的非对称加密算法。

原理

它的原理非常简单,如下图:
这里写图片描述

产生的问题1

从上面的传输过程我们可以看出,公钥是直接传输给B,那么它可能被截获,A向B的加密数据就可能用公钥进行解密,造成数据泄露。

建立更加安全的传输通道

建立更加安全的加密通道,在A,B两端分别产生密钥对,分别将各自的公钥暴露给对方,如下图:

这里写图片描述

产生的问题2

这种安全通道,相对来说已经很坚固,但是这种方式也可能存在数据传递被模拟的隐患,需要通过数字签名进一步提升安全性。

数字签名以及数字证书
(1)信息 + HASH = 摘要    摘要 + 私钥 = 数字签名(给收方做对比用的,验证收发内容是否一致)

(2)公钥 + 相关信息 + CA私钥 = 数字证书(验证发送者是否正确,是可信任的公钥)

这里写图片描述

A的公钥必须是证书中心颁发的,不然就需要对A做公钥认证(参考这篇博文):

注意:
    如果A的公钥被替换掉,B端就不能确认公钥是否是A端的公钥,这时B可以让A可以去找"证书中心"(certificate authority,简称CA),为公钥做认证,证书中心用自己的私钥,对A的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate),发送信息给B在签名的同时附上数字证书就可以了。B收信后,用CA的公钥解开数字证书,就可以拿到A真实的公钥了,然后就能证明"数字签名"是否真的是A签的。

四,加密算法的选择

对于对称解密算法和非对称加密算法,在实际使用的过程中该使用哪一种?

使用建议:

1.由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。当数据量很小时,我们可以考虑采用非对称加密算法(对称加密的密钥管理也比较复杂)。
2.对称加密算法不能实现签名,因此签名只能非对称算法。

实际使用

实际应用中,两者混合使用

    采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值