JSON是一種常用的數據交換格式,而加密是保證數據安全性的重要手段之一。非對稱加密算法相對于傳統的對稱加密算法更為安全,因此越來越多的應用開始使用非對稱加密方案。本文將介紹如何使用Java實現JSON的非對稱加密。
在進行非對稱加密之前,需要生成一對公鑰和私鑰。我們可以使用Java中的密鑰對生成器來生成,下面是生成密鑰對的示例代碼:
import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; public class KeyGeneratorUtil { public static KeyPair generateKeyPair() throws NoSuchAlgorithmException { KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); // 設置密鑰長度 KeyPair keyPair = keyGen.generateKeyPair(); return keyPair; } }
生成密鑰對之后,我們就可以使用公鑰對數據進行加密,使用私鑰進行解密。下面是一個JSON對象加密解密的示例代碼:
import com.alibaba.fastjson.JSON; import javax.crypto.Cipher; import java.nio.charset.StandardCharsets; import java.security.KeyPair; import java.security.PrivateKey; import java.security.PublicKey; import java.util.HashMap; import java.util.Map; public class JsonCryptoUtil { public static String encrypt(String data, PublicKey publicKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); return Base64Util.encode(encryptedData); // Base64編碼后返回 } public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] data = Base64Util.decode(encryptedData); // Base64解碼 byte[] decryptedData = cipher.doFinal(data); return new String(decryptedData, StandardCharsets.UTF_8); } public static void main(String[] args) throws Exception { // 生成密鑰對 KeyPair keyPair = KeyGeneratorUtil.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); // 加密 Mapmap = new HashMap<>(); map.put("name", "Bob"); map.put("age", 20); String jsonData = JSON.toJSONString(map); String encryptedJson = encrypt(jsonData, publicKey); System.out.println("加密后的JSON數據:" + encryptedJson); // 解密 String decryptedJson = decrypt(encryptedJson, privateKey); System.out.println("解密后的JSON數據:" + decryptedJson); } }
在以上代碼中,我們使用了Java中的RSA算法進行非對稱加密。通過Base64編碼,我們可以將加密后的字節數組轉為可讀的字符串。需要注意的是,在密鑰的保護下,私鑰可以進行數據的解密,因此在使用時需要保證私鑰的安全性。