Java17新加密API详解与实战示例
因为现在的现代应用程序里面, 含有敏感数据的个数是在不断增加的这么一个情况下, 所以数据安全性这个问题就非常重要了, 变得非常关键了。针对这一方面的挑战来说呢, Java 17 这个版本里面是引入了好几套新的加密API这样的东西的, 这也就是给那些搞开发的人员提供了更多一些工具方面的手段, 用来做到数据的安全传输以及说是保护这两件事情。在这篇文章里, 我们将把在 Java 17 这个版本中新加进来的加密相关 API, 向大家做一个介绍。除了介绍之外, 还会提供相应的示例代码, 以便展示大家该怎么在自己的应用程序里面, 去使用这些新的 API, 从而达到确保数据不被别人随意看明白, 也就是保证数据的机密性, 同时还能确保数据没有被篡改, 也就是保证数据的完整性。密码学基础在这咱们打算深入地去了解一下 Java 17 这个新版加密 API 之前, 让我们先回过头去, 把密码学的基础概念给回顾一遍。所谓加密, 就是利用数学算法, 把原始数据转化成密文, 这么做是为了保护好数据的机密性。而解密, 它就是另一个过程, 需要把密文重新还原成原始数据, 而且只有那些手里拿着正确密钥的人, 才有资格和能力进行解密这一操作。这个版本里的, 那些更新的、用来做加密操作的, 相关的应用程序接口。Java 17 引入了全新的加密 API, 这些 API 涵盖了多种功能范畴, 例如对称加密方面、非对称加密方面、数字签名方面、以及散列方面等。下文将对这套 API 进行简要概述:1. javax..生成对称密钥这个API能够让开发人员去产生一个对称密钥, 这个密钥是用来做对称加密以及解密的这件事的。通过利用这里提到的这个方法, 开发人员就可以很轻松地去生成一个符合相关标准要求的对称密钥。import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import java.security.NoSuchAlgorithmException;public class KeyGeneratorExample {public static void main(String[] args) throws NoSuchAlgorithmException {KeyGenerator keyGenerator KeyGenerator.getInstance(AES);SecretKey secretKey keyGenerator.generateKey();System.out.println(生成的对称密钥 secretKey);}}2. 就是那个叫作javax..的东西, 它的主要工作是用来对数据进行加密的, 另外也用来进行解密的。类提供了对数据进行加密的功能以及让数据解密的功能。它能够支持多种多样的加密算法, 同时也能够支持各种各样的密码模式。用户可以根据自己的具体需求来做出选择。最终的选择目的是为了找出那个最合适的加密方式。import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;public class CipherExample {public static void main(String[] args) throws Exception {KeyGenerator keyGenerator KeyGenerator.getInstance(AES);SecretKey secretKey keyGenerator.generateKey();Cipher cipher Cipher.getInstance(AES/CBC/PKCS5Padding);cipher.init(Cipher.ENCRYPT_MODE, secretKey);String originalData Hello, Java 17 Encryption;byte[] encryptedData cipher.doFinal(originalData.getBytes());System.out.println(加密后的数据 new String(encryptedData));}}3. 这个属于是java这个东西, 它的主要作用就是用于生成那些高质量的随机数。在加密中生成随机数是关键之一。 类提供了高质量的随机数生成器用于增强密钥和随机向量的随机性和安全性。import java.security.SecureRandom;public class SecureRandomExample {public static void main(String[] args) throws NoSuchAlgorithmException {SecureRandom secureRandom SecureRandom.getInstanceStrong();byte[] randomBytes new byte[16];secureRandom.nextBytes(randomBytes);System.out.println(生成的随机字节 new String(randomBytes));}}4.java..生成非对称密钥对这个API是用来产生非对称密钥对的, 这当中就包含公钥和私钥, 它们是用来进行非对称加密处理以及执行数字签名操作的。import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.NoSuchAlgorithmException;public class KeyPairGeneratorExample {public static void main(String[] args) throws NoSuchAlgorithmException {KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance(RSA);KeyPair keyPair keyPairGenerator.generateKeyPair();System.out.println(生成的非对称密钥对 keyPair);}}5. 这个java..所代表的含义是数字签名。类这个东西啊, 它是允许人们去对数据实行那种数字签名操作和验证操作的, 这样子的话就能确保数据的完整性以及来源的认证。import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.Signature;import java.util.Base64;public class SignatureExample {public static void main(String[] args) throws Exception {KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance(RSA);KeyPair keyPair keyPairGenerator.generateKeyPair();Signature signature Signature.getInstance(SHA256withRSA);signature.initSign(keyPair.getPrivate());String originalData Hello, Java 17 Signature;signature.update(originalData.getBytes());byte[] signatureBytes signature.sign();System.out.println(数字签名 Base64.getEncoder().encodeToString(signatureBytes));}}6. 这个叫做 java.. 的东西, 它的作用就是去算一下那个散列值。这个类是用来计算你所提供给它的那一组数据的散列数值的, 它经常被大家拿来用着, 就是为了让能够确保数据的完整性。import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MessageDigestExample {public static void main(String[] args) throws NoSuchAlgorithmException {MessageDigest messageDigest MessageDigest.getInstance(SHA-256);String originalData Hello, Java 17 MessageDigest;byte[] hashBytes messageDigest.digest(originalData.getBytes());System.out.println(SHA-256 散列值 Base64.getEncoder().encodeToString(hashBytes));}}7. 这个是java.., 它指的是密钥还有证书存储。该类是用来管理密钥和证书存储的东西, 它能保证把密钥材料安全地保存起来, 也能让人去把它们找出来。import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.KeyStore;import java.security.cert.Certificate;public class KeyStoreExample {public static void main(String[] args) throws Exception {KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance(RSA);KeyPair keyPair keyPairGenerator.generateKeyPair();KeyStore keyStore KeyStore.getInstance(PKCS12);keyStore.load(null, null);keyStore.setKeyEntry(keyAlias, keyPair.getPrivate(), keyPassword.toCharArray(), new Certificate[]{});System.out.println(KeyStore keyStore);}}8. 在这一种情况之下呢, 它所指代的那个东西就是密钥协商这一个过程。这个类支持密钥协商协议, 这个协议用于在安全通信中生成共享密钥。import java.security.KeyAgreement;import java.security.KeyPair;import java.security.KeyPairGenerator;import javax.crypto.SecretKey;public class KeyAgreementExample {public static void main(String[] args) throws Exception {KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance(DiffieHellman);KeyPair keyPair keyPairGenerator.generateKeyPair();KeyAgreement keyAgreement KeyAgreement.getInstance(DiffieHellman);keyAgreement.init(keyPair.getPrivate());keyAgreement.doPhase(keyPair.getPublic(), true);SecretKey sharedSecret keyAgreement.generateSecret(AES);System.out.println(Diffie-Hellman 共享密钥 sharedSecret);}}9. java..操作加密算法参数类是用来操作加密算法的参数的那个东西, 这个参数里边啊, 包含了初始化向量, 还有密钥长度这样的一些东西。import java.security.AlgorithmParameters;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.spec.AlgorithmParameterSpec;import javax.crypto.spec.DHParameterSpec;public class AlgorithmParametersExample {public static void main(String[] args) throws Exception {KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance(DiffieHellman);KeyPair keyPair keyPairGenerator.generateKeyPair();AlgorithmParameters algorithmParameters AlgorithmParameters.getInstance(DiffieHellman);AlgorithmParameterSpec parameterSpec keyPairGenerator.getParams();algorithmParameters.init(parameterSpec);DHParameterSpec dhParameterSpec algorithmParameters.getParameterSpec(DHParameterSpec.class);System.out.println(Diffie-Hellman 参数 dhParameterSpec.getP());}}10. java..spec.密钥规范spec. 这个词, 它是 Java 语言里面的一个东西, 具体来说, 它是一个抽象类, 这个东西专门用来描述密钥规范。你要知道, 密钥规范这种东西, 它其实就是个数据结构, 主要作用是用来描述那些密钥的属性。它里面都包含了密钥的很多信息, 比如说密钥的长度, 比如说密钥的格式, 还有比如说密钥的相关参数等等。这样做的目的是为了方便大家去生成密钥, 或者是方便进行密钥的转换, 再或者是方便对密钥做其他的处理。这么做呢, 主要是为了确保当密钥在不同的操作之间传递的时候, 以及在使用密钥的时候, 能够保持一致性, 不会乱套。密钥规范可以被用来做这样一些事情, 它能把密钥从一种格式变成另一种格式, 又或者可以用来进行生成一个密钥对这样的操作。import java.security.spec.InvalidKeySpecException;import java.security.spec.KeySpec;import java.security.spec.PKCS8EncodedKeySpec;import java.util.Base64;public class KeySpecExample {public static void main(String[] args) throws InvalidKeySpecException {String privateKeyStr MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANXf6iEgj7b6cK7ZV7EZYix3WU6Hf0xSzj//wZUz3GmRjU2Z0FWNqj8xfrx5lMNWJp9aUKzBKr0Eq/6IYmgKFoP48y7x/jRl5D3K0GZBf2NQ9sGqUgP3/TN6F9NNfdS6kC7eXmkv8dLdX/6AYCVk7zqBBZks2xRHPZr9OXGBN3H5yB7AgMBAAECgYEAh4k3hZv2KsVMBg2AAG2fX3Vg5wA0qMxYJi9BwRkE1SALbbTuU/14Q1vZb1inGfyZ0rPKgOGIQdb4e3hLqIWnK5Ht6KjRT6QUCm8CzjkwAq8xQavBJt09GL5/FE4uH0o2o/2/dVLka2/l6LWfCHrPrJajuxmeJgR8AwNsk3ikECQQDfRr2RffwzQNUCxAWLdy0ravDCnXx6WYVFBKk7JxtkRbbL03AX8RQahZV1Pvh/66tExDSvJ7nnsLsbw0sRjAkEA3fx7DoHT7XzN4wWL9uj6qOfqZ1oQyUal/FUV/W6VZJq8J1hXIl7JNla2oye8ZlufbUnjBN8rUqJmmRvNh4wJBAJU8Zy/4qfBJgWzOZQLfG9NmKoyOaEzFCwDw9n6yLfb3G2TDiYdpkkM3EmyHnKmU9bp38Sofw/6FcvK2cmPkbNUCQQC1HLsHiUNmgUHrmDQZr5IhKo/Zg72cmzJ7TYbwO0/xSp/rETAAjp/gwtSODNqjUe1qzU7eUp6Mg2rsLa7ydXAkEAhBOe8BHQa3ZRbhaq9e8nNZYLwOvEJt/H/S8xhHv5JxHcqLWcR1NmP3L8m1fbVUh6Oms8ph/YeRov6q2k5sztgA;byte[] privateKeyBytes Base64.getDecoder().decode(privateKeyStr);KeySpec keySpec new PKCS8EncodedKeySpec(privateKeyBytes);System.out.println(KeySpec keySpec);}结 论Java 17 里面的新的加密 API 给开发者拿来了更多的工具, 用来把数据的安全传输和保护做到位。不管你是想要保护用户的隐私信息, 还是你想要确保那些敏感的数据的完整性不被破坏, 这些新的加密 API 都给咱们提供了很强大的功能。只要你把密码学方面的知识与新出来的这一套加密 API 给结合起来, 并且进行合理的运用, 你就可以构建出更加安全以及更加让人信任的应用程序, 从而为用户这边提供更到位的数据保护效果。在实际操作过程里面, 大家千万要按照那些比较好的方法来干活, 这样才能够保证数据传过来的时候是安全的。