赞
踩
基于密码加密和SSL加密的区别
- 密码加密可以数据和密码分离传输
- SSL只限于在套接字空间传输的数据进行加密
密码加密是指通过算法将原始信息转换成密文,只有知道相应密钥的人才能解密。Java中常用的密码加密算法包括MD5、SHA、AES、DES等,可以用于实现用户密码的加密存储、数据安全传输等场景。
SSL加密(Secure Sockets Layer)是一种基于公钥加密技术的安全协议,主要用于保证数据在传输过程中的安全性和完整性。SSL通过使用数字证书来确保客户端与服务端之间的通信安全,可以防止网络中间人攻击、数据篡改、信息泄露等问题。在Java中,使用SSLSocket、SSLServerSocket等类可以实现SSL加密传输。
在Java Cryptography Extension (JCE) 中,有多种加密引擎可供使用。以下是每个引擎的简要说明和使用示例:
Cipher
:用于对称加密和解密算法。可以使用getInstance
方法获取Cipher对象,并指定加密算法和工作模式/填充模式。然后使用init
方法初始化Cipher对象,传递加密操作模式(加密、解密、包括需要的密钥和其他参数)以及密钥。最后,使用doFinal
方法进行实际的加密和解密操作。Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
byte[] encryptedData = cipher.doFinal(data);
KeyGenerator
:用于生成对称密钥。可使用getInstance
方法获取KeyGenerator对象,并指定密钥算法。然后使用init
方法初始化密钥生成器,设置密钥的长度、安全随机数源等。最后,使用generateKey
方法生成对称密钥。KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
SecretKey secretKey = keyGenerator.generateKey();
SecureRandom
:生成安全随机数。可使用getInstance
方法获取SecureRandom对象,并选择合适的算法。然后,直接调用nextBytes
方法生成指定长度的随机字节。SecureRandom secureRandom = SecureRandom.getInstanceStrong();
byte[] randomBytes = new byte[16];
secureRandom.nextBytes(randomBytes);
Signature
:用于数字签名和验证。可以使用getInstance
方法获取Signature对象,并选择签名算法。然后,通过initSign
方法初始化签名对象并传递私钥,或通过initVerify
方法初始化验证对象并传递公钥。最后,使用update
方法传入要签名的数据,调用sign
方法进行签名,或调用verify
方法进行验证。Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(data);
byte[] signatureBytes = signature.sign();
Mac
:提供消息认证码算法。可以使用getInstance
方法获取Mac对象,并选择合适的算法。然后,通过init
方法传入密钥初始化Mac对象。最后,使用doFinal
方法对数据进行消息认证,生成Mac码。Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secretKey);
byte[] macBytes = mac.doFinal(data);
KeyPairGenerator
:用于生成非对称密钥对。可以使用getInstance
方法获取KeyPairGenerator对象,并选择合适的加密算法。然后,使用initialize
方法传递密钥长度和可选的随机源初始化密钥对生成器。最后,通过generateKeyPair
方法生成非对称密钥对。KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
这些示例演示了如何使用JCE中的加密引擎。您可以根据自己的需求选择适当的加密算法和模式,并按照示例代码进行相应的初始化和操作。请注意,还需要进行适当的异常处理和密钥管理来保证安全性。
在Java安全中,CipherInputStream
是一种基于密码的输入流,用于加密或解密数据流。它可以与其他输入流(如文件输入流或网络输入流)结合使用,将数据流加密或解密。
CipherInputStream
使用javax.crypto.Cipher
加密引擎来处理数据流的加密或解密操作。它接收一个已初始化的Cipher
对象作为参数,并使用该Cipher
对象来进行相应的加密或解密操作。
以下是CipherInputStream
的说明和使用示例:
import javax.crypto.Cipher; import javax.crypto.CipherInputStream; import javax.crypto.spec.SecretKeySpec; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.security.Key; import java.util.Base64; public class CipherInputStreamExample { public static void main(String[] args) throws Exception { // 定义密钥 String keyString = "0123456789ABCDEF"; Key key = new SecretKeySpec(keyString.getBytes(), "AES"); // 初始化加密引擎 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key); // 创建输入流和输出流 InputStream inputStream = new FileInputStream("input.txt"); OutputStream outputStream = new FileOutputStream("output.txt"); // 创建CipherInputStream CipherInputStream cipherInputStream = new CipherInputStream(inputStream, cipher); // 读取加密的数据,并写入输出流 byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = cipherInputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } // 关闭流 cipherInputStream.close(); inputStream.close(); outputStream.close(); } }
上述示例演示了使用CipherInputStream
对数据流进行加密的过程。首先,我们定义了一个密钥(key),然后使用该密钥创建一个Cipher
对象,指定加密算法和模式。接下来,我们创建一个输入流(FileInputStream
)从源文件中读取数据,并创建一个输出流(FileOutputStream
)将加密后的数据写入到目标文件中。然后,我们使用CipherInputStream
来加密数据流,传入输入流和已初始化的Cipher
对象。在while
循环中从密文输入流读取加密数据,并将其写入到输出流中。最后,关闭流以释放资源。
通过类似的方式,您也可以使用CipherInputStream
来进行数据流的解密操作,只需将Cipher
对象的加密模式设置为Cipher.DECRYPT_MODE
即可。
请注意,上述示例使用的是ECB模式和PKCS5Padding填充模式的AES加密算法,您可以根据需要选择其他支持的加密算法和模式。此外,为了保证数据安全性,建议使用更强大和安全的加密算法,并采取适当的密钥管理和安全措施。
在Java安全中,“加封”(Sealing)是指将对象序列化并使用加密技术保护对象的完整性和机密性。通过加封对象,可以在不暴露敏感数据的情况下,将对象传输或存储到不可信的环境中。
Java中的加封对象可以使用javax.crypto.SealedObject
类实现。该类在应用层上提供了对对象加密和解密的支持,以及对对象完整性的保护。
以下是加封对象在Java安全中的说明和使用示例:
import javax.crypto.*; import java.io.Serializable; import java.security.Key; import java.util.Base64; class MySecretData implements Serializable { // 加密和解密所需的共享密钥 private static final Key sharedKey = ...; private String secretMessage; public MySecretData(String secretMessage) { this.secretMessage = secretMessage; } public String getSecretMessage() { return secretMessage; } // 加封对象 public SealedObject seal() throws Exception { Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, sharedKey); return new SealedObject(this, cipher); } // 解开加封的对象 public static MySecretData unseal(SealedObject sealedObject) throws Exception { Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, sharedKey); return (MySecretData) sealedObject.getObject(cipher); } } public class SealedObjectExample { public static void main(String[] args) throws Exception { // 创建私密数据对象 MySecretData secretData = new MySecretData("This is a secret message!"); // 加封对象 SealedObject sealedObject = secretData.seal(); // 获取加封对象的密文表示 byte[] sealedData = sealedObject.getEncoded(); String sealedDataString = Base64.getEncoder().encodeToString(sealedData); System.out.println("Sealed Object: " + sealedDataString); // 解开加封的对象 MySecretData unsealedData = MySecretData.unseal(sealedObject); // 获取解开的对象的信息 String secretMessage = unsealedData.getSecretMessage(); System.out.println("Unsealed Object: " + secretMessage); } } ``
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。