加解密技术


前言

最近项目中需要保存用户数据,但是由于数据中不能进行明文保存,需要进行加密保存,所以针对加解密进行一些调研和学习。


一、为什么需要加密?

信息一般都具有一定的隐私性和排他性,需要防止被第三方或者非授权方获取。但信息从发送方到接受方可能会经过很多中间流程。除非发送方直接将信息直接告知接受方,否则在传递过程中信息存在被第三方获知的可能性。因此为了防止信息被窃取因此在传递和存储信息的时候需要对信息进行加密处理,将信息从明文转换成密文。

二、为什么需要解密?

信息以密文的形式被接收方获得后,如果接受方想要获知信息内容则需要进行解密操作。
比如谍战片中常见的以无线电传递信息,发送方先加情报进行加密,接收方收到无线电后进行解密操作才可以得知情报,第三方虽然可以接收到发送方的加密情报,但是由于不知道如果解密所以不知道情报内容。通过加解密实现了通过不安全的无线电方式,将情报从发送方传递到接收方,并且防止第三方对情报内容的窃取。

三、加解密算法分类

加解密算法分了不可逆加密和可逆加密:
不可逆加密:即单向加密,明文生成密文后无法解析出明文;主要用于密钥和口令加密存储,单相加密算法有:MD5和SHA系列、HMAC;
可逆加密:即双向加密,明文生成密文后可以解析出明文;双向加密中如果加解密使用同一密钥为对称性加密,加解密使用不同密钥为非对称加密。

四、单向加密算法

单向加密算法主要双方通过算法将消息计算成固定长度的摘要,通过摘要的对比来验证消息的一致性。HMAC通过引入密钥又解决了对消息来源方的身份认证问题。

1.MD5

MD5信息摘要算法(MD5 Message-Digest Algorithm)是一种密码散列函数,对原始消息进行处理生成一个固定长度的消息摘要(密文),所以MD5算法是一个单向加密算法。
代码如下(示例):

import org.springframework.util.DigestUtils;

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Secret {
    public static void main(String[] args) {
        String soure=" this is a test source string";
        byte[] secretBytes = null;
        try {
            // 使用jdk自带的MessageDigest
          secretBytes =  MessageDigest.getInstance("md5").digest(soure.getBytes(StandardCharsets.UTF_8));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        String md5code = new BigInteger(1, secretBytes).toString(16);
        for (int i = 0; i < 32 - md5code.length(); i++) {
            md5code = "0" + md5code;
        }
        System.out.println(md5code);

        // 使用spring的DigestUtils
        System.out.println(DigestUtils.md5DigestAsHex(soure.getBytes()));
    }
}

2.SHA-1/SHA-256

SHA-1/SHA-256 安全散列算法(Secure Hash Algorithm)是一个密码散列算法,能计算出一个信息所对应的长度固定的字符串。在安全协议中被广泛使用,包括TLS和SSL、PGP、SSH等,SHA-1安全性已经受到挑战,普遍使用SHA-256。
代码如下(示例):

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Secret {
    public static void main(String[] args) {
        String soure=" this is a test source string a word is peace";
        byte[] secretBytes = null;
        try {
            // 使用jdk自带的MessageDigest
          secretBytes =  MessageDigest.getInstance("SHA-1").digest(soure.getBytes(StandardCharsets.UTF_8));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        String shaCode = new BigInteger(1, secretBytes).toString(16);
        for (int i = 0; i < 32 - shaCode.length(); i++) {
            shaCode = "0" + shaCode;
        }
        System.out.println(shaCode);
    }
}

3.HMAC

HAMC密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),是基于Hash函数和密钥进行消息认证的方法。相当于使用散列函数对消息进行操作后,又用发送方和接收方共享的认证的密钥进行再次操作。HMAC不仅能对消息完整性进行认证,还可以对发送方身份进行认证。


五、对称【双向】加密算法

采用单密钥用来加密和解密,常见的对称加密算法有DES、3DES、AES、RC4等。对称加密计算量小,速度快,适合对大量数据进行加解密的场景。由于采用加密和解密采用相同密钥,所以安全传递密钥到解密方就是关键。同时需要给每个用户分配单独的密钥,会导致密钥随用户线性增长。

1.DES/3DES算法

DES 全称 Data Encryption Standard源自IBM,是一种使用密钥加密的块算法。DES使用56位密钥,目前已经不推荐使用。
3DES全称Triple Data Encryption Algorithm是三重数据加密的块算法,相当于对每个数据块应用了三次DES加密算法,是DES的一个更安全的变形。3DES密钥使用168位密钥,按位数分为三个密钥,加密过程为加密-解密-加密,解密过程位解密-加密-解密。
3DES加解密过程过程如下:
在这里插入图片描述

代码示例:

        String src=" this is a test source string";
        String password="password";
        try {
     
            // 创建一个密匙工厂,然后用它把 DESKeySpec 转换成 SecretKey
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            DESKeySpec desKey = new DESKeySpec(password.getBytes());
            SecretKey securekey = keyFactory.generateSecret(desKey);
            
            Cipher cipher = Cipher.getInstance("DES");

            SecureRandom random = new SecureRandom();
            cipher.init(Cipher.ENCRYPT_MODE, securekey, random);

             cipher.doFinal(src.getBytes(StandardCharsets.UTF_8));
        } catch (Throwable e) {
            e.printStackTrace();
        }

2.AES算法

AES高级加密标准、全称是Advanced Encryption Standard,AES加密算法安全性高于DES和3DES,是目前主要的对称加密算法。AES加密算法采用分组加密体制,每个分组数据长度位128位16个字节。一共有四种加密模式,分别是 ECB(电子密码本模式)、CBC(密码分组链接模式)、CFB、OFB,我们一般使用的是 CBC 模式。

3.RC4算法

RC4算法密钥长度可变,可变范围位1~256字节,当密钥长度位128bit时,可以抵御暴力破解。RC4不是对明文进行处理,而是采用字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。


六、非对称【双向】加密算法

非对称加密指的是加密和解密采用两个不同的密钥,这两个密钥是一对,称为公钥和私钥。如果数据用公钥加密,只能用对应的私钥进行解密。如果数据用私钥加密,只能用对应的公钥解密。一般情况下,公钥是公开的,私钥是非公开的,根据公钥无法推导出私钥。
非对称加密算法主要有RSA、Elgamal、Rabin、D-H、ECC等,目前最广泛使用的非对称加密算法是RSA算法。

工作原理如下:
在这里插入图片描述
甲乙双方都产生密钥,将自己产生的公钥进行公布,私钥自己保存。
甲方向乙方发送消息,需要利用乙方的公钥进行加密,乙方收到密文之后利用自己保存的乙方私钥进行解密。
乙方向甲方发送消息,需要利用甲方的公钥进行加密,甲方收到密文之后利用自己保存的甲方私钥进行解密。
由于其中的私钥是不公布的,第三方即使截获了对应密文也无法解密知晓消息内容。


总结

主要讲解了加解密的用途和分类。
单向加密算法主要双方通过算法将消息计算成固定长度的摘要,通过摘要的对比来验证消息的一致性,主要是解决敏感数据非明文保存和处理过程中的完整性和一致性验证问题。HMAC通过引入密钥又解决了对消息来源方的身份认证问题。
双向加密算法主要发送方通过密钥将明文加成密文,接收方通过密钥将密文解析成明文,主要是解决信息安全传递问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值