5分钟了解对称加密和非对称加密

这篇具有很好参考价值的文章主要介绍了5分钟了解对称加密和非对称加密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对称加密

对称加密是指加密和解密都是使用同一个密钥来进行的加密方式。这种加密方式的优点是加密和解密速度快,适合加密大量数据。常见的对称加密算法有 DES、AES 等。

很典型的一个场景就是当我们保存数据到数据库时,如果有一些敏感的信息(比如用户的密码),不想以明文形式存到数据库。我们可以采用对称加密,把加密后的数据存入数据库,然后读取数据时再用密钥解密,下面是一个AES算法的代码示例:

代码示例

import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class SymmetricEncryptionExample {

    private static final String ALGORITHM = "AES";

    public static void main(String[] args) {
        String plainText = "This is a secret message";
        String key = "mySecretKey";

        try {
            SecretKey secretKey = generateKey(key);// 生成密钥

            byte[] cipherText = encrypt(plainText.getBytes(), secretKey);// 加密
            System.out.println("Encrypted Text: " + Base64.getEncoder().encodeToString(cipherText));// 输出加密后的密文

            byte[] decryptedText = decrypt(cipherText, secretKey);// 解密
            System.out.println("Decrypted Text: " + new String(decryptedText));// 输出解密后的明文
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 生成密钥
    public static SecretKey generateKey(String key) throws NoSuchAlgorithmException {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        SecureRandom secureRandom = new SecureRandom(key.getBytes());
        keyGenerator.init(128, secureRandom);
        return new SecretKeySpec(keyGenerator.generateKey().getEncoded(), ALGORITHM);
    }

    // 加密
    public static byte[] encrypt(byte[] plainText, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        return cipher.doFinal(plainText);
    }

    // 解密
    public static byte[] decrypt(byte[] cipherText, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return cipher.doFinal(cipherText);
    }
}
控制台打印结果如下:
Encrypted Text: cQx5Se744piQzzG0g4upF66EfVCeHt5JQcUWQ+3iirQ=
Decrypted Text: This is a secret message

非对称加密

非对称加密是指使用一对不同的密钥来进行加密和解密的加密方式。其中一个密钥是公开密钥(public key),任何人都可以获得;另一个密钥是私有密钥(private key),只有密钥的拥有者才能使用。这种加密方式的优点是加密和解密使用不同的密钥,安全性更高。常见的非对称加密算法有 RSA、ECC 等。非对称加密的一般流程是,用公钥(public key)进行加密,用私钥(private key)进行解密。

下面是一个简单的非对称加密的例子:

5分钟了解对称加密和非对称加密

你可能会有疑问,既然已经有了对称加密了,为什么还要有非对称加密?我们假设上面使用对称加密,加密解密都是用同一个密钥,那这个密钥是Server生成还是User来生成呢?不管谁来生成,都要把密钥发送给对方,对方才能用它来解密,也就是说这个密钥需要经过网络传输,这是极不安全的!!另外即使它是安全的,当有多个User时,不同的User则需要生成不同的私钥,因为如果不同的User都使用同一个私钥,那UserA也可以破解UserB发送的消息了?显然这样是不行的!如果使用不同的私钥,Server端那还需要维护私钥和User的对应关系,即私钥A对应UserA,私钥B对应UserB,实在繁琐。而非对称加密使用公钥加密,私钥解密,既解决了对称加密私钥传输的安全问题,也解决了不同User需要不同密钥的问题。

但这样真的就安全了么?答案是否定的!黑客针对上面的情况,还是有办法的,那就是中间人攻击。

中间人攻击

中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”)是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。

5分钟了解对称加密和非对称加密

攻击流程大致如下:

  1. 黑客拦截User获取公钥的请求,并代替User向Server发起获取公钥请求

  1. Server返回公钥

  1. 黑客拦截到真的公钥,并伪造了一对假的公钥私钥,将伪造的公钥返回给User

  1. User拿到假的公钥,加密数据,发送数据

  1. 黑客拦截数据,使用假的私钥来解密,并且篡改数据后,再用真的公钥加密

  1. 黑客发送篡改后的数据给Server

那如何解决这个问题呢?下面我们可以引入证书。

数字证书

上面中间人攻击的关键就是黑客拦截并返回了一个伪造的公钥给User,所以解决这个问题的办法就是如何拿到一个正确的公钥,如何证明这个公钥是Server端自己的公钥,而不是伪造的公钥。

此时一种叫证书中心(Certificate Authority,简称CA)的机构出现了,可以理解为一个第三方的公钥公证机构,专门负责对公钥进行审核认证,审核通过后你会得到一个证书。

所以Server需要先去申请一个证书,证书里面包含了Server的信息以及公钥,然后将可信任的证书返回给User。

5分钟了解对称加密和非对称加密

此时你可能会有疑问,要是黑客把证书也拦截掉,返回一个伪造的证书怎么办?

客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内,如果不在这个列表内。会出现如下警告:

5分钟了解对称加密和非对称加密

还有一种情况就是假如这个证书不是由权威的CA机构发放,也会弹出相应的警告:

5分钟了解对称加密和非对称加密

代码示例

最后附上一个Java非对称加密的代码示例:


import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Base64;

import javax.crypto.Cipher;

public class RSADemo {
    public static void main(String[] args) throws Exception {
        // 生成密钥对
        KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair();
        PrivateKey privateKey = keyPair.getPrivate();
        PublicKey publicKey = keyPair.getPublic();

        // 明文
        String plainText = "Hello, world!";

        // 加密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedText = cipher.doFinal(plainText.getBytes());

        // 解密
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedText = cipher.doFinal(encryptedText);

        System.out.println("明文:" + plainText);
        //对称加密算法加密后的数据通常是二进制数据,而非文本数据。如果直接将二进制数据转化为字符串输出,那么在绝大多数情况下会打印出一堆乱码。
        //我们可以使用Base64编解码器将二进制数据转化为字符串
        System.out.println("加密后:" + Base64.getEncoder().encodeToString(encryptedText));
        System.out.println("解密后:" + new String(decryptedText));
    }
}
控制台打印结果如下:
明文:Hello, world!
加密后:OVxXHqu60lELWwgMmEKOCam3ypoH1jwPIl2IXH0ZSqcYbfSQTF/AU+wLqNliRuY7DrCfF3ca8ii99m6KszeHe+n6SvHHURF+u7F7V5QexsQku35GvQfvDesd2NPnZtXhG9D8Dsq3XDWONobCbhFU4HGdAgv0Q6KbZAQp/+tYDn+xJjypclora8CbmD31B9f9MKqJPNR9MEMc6QBLqpYyQhs9UMNRbBWXZohlgY7f6RZh5O0dGtAzwQWExe1N6VSm2R2UJdHM9up2Q/ppKOsLLrZldwwOtNRbuPH+jepwHiomOEjST3XTNfCvemImEMi736zPajXTteC/2KzQLg68qw==
解密后:Hello, world!

总结

对称加密:加密解密都使用同一个密钥,常用算法AES

优点:算法简单,速度快,效率高,适合大量数据的加密。

缺点:加密解密都用的同一个密钥,不适合加解密分散在不同地方场景,因为密钥传递不安全

非对称加密:加密解密用的不同的密钥,常用算法RSA

优点:不需要传递私钥,安全性更高

缺点:流程和算法更为复杂,速度和效率比对称加密低文章来源地址https://www.toymoban.com/news/detail-489786.html

到了这里,关于5分钟了解对称加密和非对称加密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HTTPS行为大赏(三分钟了解加密过程)

    既然要对HTTPS进行解读,我们首先了解, HTTPS 是什么? HTTPS 就相当于 HTTP+SSL/TLS 这样的组合, HTTP (超文本传输协议), HTTP 是 tcp/ip 组中的协议之一运用在应用层,也是互联网上应用最为广泛的协议之一,所有的WWW(万维网)文件都必须遵循这个标准。而设计 HTTP 协议的最

    2024年02月06日
    浏览(47)
  • 从零开发短视频电商 使用nimbus-jose-jwt进行对称签名和非对称签名的JWT实现

    JWT的基础介绍可以参见这个地址:https://jwt.io/introduction,下面都是从上面摘录的。 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种 紧凑且自包含 的方式,用于 安全地在各方之间传输信息 ,其格 式为JSON对象 。这些 信息可以被验证和信任 ,因为它们是 数字签名

    2024年02月12日
    浏览(44)
  • 对称加密 非对称加密 AC认证 https原理

    对称加密是一种加密算法,使用相同的密钥(也称为对称密钥)用于加密和解密数据。在对称加密中,发送方使用密钥对要发送的数据进行加密,接收方使用相同的密钥对接收到的密文进行解密,从而还原成原始的明文数据。 对称加密的特点包括: 快速高效:对称加密算法

    2024年02月10日
    浏览(35)
  • 区块链:对称加密、非对称加密和数字签名

    本篇博客仅从区块链的角度介绍加密算法及数字签名,重在使用,至于加密算法的内部原理这里不会详细介绍。 1 对称加密 1.1 定义   对称加密,指的是信息发送者和接收者通过使用的相同的密钥来完成数据的加密和解密。常用的对称加密算法有:AES、DES、3DES等。 1.2 AES算

    2024年02月10日
    浏览(36)
  • 每日一博 - 对称加密算法 vs 非对称加密算法

    在信息安全领域中,加密算法是保护数据安全的重要手段。 加密算法可以分为多种类型,以下是其中的一些: 对称加密算法:使用相同的密钥进行加密和解密,如DES、AES等。 非对称加密算法:使用公钥和私钥进行加密和解密,如RSA、ECC等。 哈希函数:将任意长度的消息压缩

    2024年02月07日
    浏览(42)
  • AES(对称加密)和RSA(非对称加密)使用详情

          待加密的明文以16字节分组进行加密,如果数据字节长度不是16的倍数,最后的一组则需要在有效数据后面进行填充,使得数据长度变为16字节,AES填充方式分为NoPadding、PKCS5(PKCS7)、ISO10126、Zeros。 NoPadding :不填充,那就只能加密长度为16倍数的数据,一般不使用; Zero

    2024年02月08日
    浏览(94)
  • 应用层—HTTPS详解(对称加密、非对称加密、密钥……)

    HTTPS 也是一个应用层的协议。是在 HTTP 协议的基础上引入的一个加密层。 由来:HTTP 协议内容都是按照文本的方式明纹传输,这就导致在传输过程中出现一些被篡改的情况,因此引入 HTTPS 加密层,用于保护数据。 典型案例就是 运营商劫持 。由于我们通过网络传输的任何数据

    2024年01月22日
    浏览(75)
  • 常见的对称式加密与非对称式加密算法

            对称式加密 :对称加密算法就是传统的用一个密码进行加密和解密,通信发送方使用这种算法加密数据,接收方也用同样的算法解密数据. 因此对称式加密本身不是安全的。从程序的角度看,所谓加密,就是这样一个函数:         它接收密码和明文,然后输出密

    2023年04月08日
    浏览(37)
  • HTTPS加密原理,搞懂什么是对称加密、非对称加密、证书、数字签名

    众所周知,http协议是一种未加密的协议,我们未加密的数据,在传输的过程中会经过一个又一个的物理节点,如果被人通过抓包的方式拿到了我们的数据,将会给我们造成无法估量的损失。 为了解决解决这个问题,https应运而生。https通过加密的手段,保障的数据的安全性。

    2024年02月01日
    浏览(49)
  • 对称加密与非对称加密、证书、SSL/TLS握手过程

    对称加密,是一种既简单速度又快的加密方式,加密与解密使用的都是同一个密钥,别名又叫做:单密钥加密;对称加密有很多公开算法,并且因为它效率很高,所以适用于加密大量数据的场合;但其密钥的传输过程是不安全的,并且容易被破解,密钥管理起来也相对麻烦。

    2024年02月03日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包