通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响,始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法。在本文中,我们将讨论Java中具有CBC模式的AES(高级加密标准)对称加密算法,比3DES更快,更安全。
加密方式
众所周知,加密有2种基本类型-非对称和对称加密。 非对称加密使用两个不同的密钥作为公共密钥和私有密钥,您可以在此处使用公共密钥对敏感信息进行加密,并使用匹配的私有密钥对相同信息进行解密。当涉及到两个不同的端点时,通常使用非对称加密,例如VPN客户端和服务器,SSH等
同样,我们还有另一种称为对称加密的加密技术。这种类型的加密使用称为私钥或秘密密钥的单个密钥对敏感信息进行加密和解密,与非对称加密相比,这种类型的加密速度非常快。对称加密的一些示例有Twofish,Blowfish,3 DES和AES。
什么是AES加密
AES代表高级加密系统及其对称加密算法,它是由美国国家标准技术研究院(NIST)于2001年建立的电子数据加密规范,此处是AES的Wiki链接 。需要使用纯文本和密钥进行加密,并且需要相同的密钥才能再次对其进行解密。
要查看AES加密的实际工作原理,可以检查一下– AES加密工具
输入可以是128位或192位或256位,并生成相应的密文位。
Java中的AES加密
以下是Java中执行AES加密的示例程序。在这里,我们使用具有CBC模式的AES来加密消息,因为ECB模式在语义上并不安全.IV模式也应随机分配给CBC模式。
如果使用相同的密钥来加密所有纯文本,并且如果攻击者找到了该密钥,则可以以类似的方式解密所有密码。我们可以使用salt和迭代来进一步改进加密过程。在以下示例中,我们将使用128位加密密钥。这是在线AES加密工具 。
private static final String key = "aesEncryptionKey";
private static final String initVector = "encryptionIntVec";public static String encrypt(String value) {try {IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);byte[] encrypted = cipher.doFinal(value.getBytes());return Base64.encodeBase64String(encrypted);} catch (Exception ex) {ex.printStackTrace();}return null;
}
Other Interesting Posts
Spring Boot Security Password Encoding using Bcrypt Encoder
Spring Boot Security JWT Auth Example
Spring Boot Security OAuth2 Example
Spring Boot Security REST Basic Authentication
Spring Boot Actuator Complete Guide
Spring Boot Actuator Rest Endpoints Example
Spring 5 Features and Enhancements
Spring Boot Thymeleaf Example
Spring Boot Security Hibernate Example with complete JavaConfig
Securing REST API with Spring Boot Security Basic Authentication
Websocket spring Boot Integration Without STOMP with complete JavaConfig
Java中的AES解密
以下是解密密码的相反过程。代码具有自我解释性。
public static String decrypt(String encrypted) {try {IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));return new String(original);} catch (Exception ex) {ex.printStackTrace();}return null;
}
测试AES加密和解密
以下是main()实现,以测试我们的AES实现。
public static void main(String[] args) {String originalString = "password";System.out.println("Original String to encrypt - " + originalString);String encryptedString = encrypt(originalString);System.out.println("Encrypted String - " + encryptedString);String decryptedString = decrypt(encryptedString);System.out.println("After decryption - " + decryptedString);
}
以下是结果。
结论
希望本文能为您提供所需的服务。 如果您有任何要添加或共享的内容,请在下面的评论部分中共享。在下一篇文章中,我们将讨论javascript和Java之间的AES互操作性。
翻译自: https://www.javacodegeeks.com/2018/03/aes-encryption-and-decryption-in-javacbc-mode.html