加密SDK(Encryption SDK)是一個用戶端密碼庫,通過與Key Management Service(Key Management Service)結合使用,協助您快速實現資料的加解密、簽名驗簽功能。本文以Java語言為例,為您介紹如何快速使用加密SDK進行資料加解密。
背景資訊
您可以訪問alibabacloud-encryption-sdk-java,查看程式碼範例。
在本地安裝加密SDK
編譯安裝加密SDK。
git clone https://github.com/aliyun/alibabacloud-encryption-sdk-java.git cd alibabacloud-encryption-sdk-java mvn clean install -DskipTests
在專案中添加依賴。
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>alibabacloud-encryption-sdk-java</artifactId> <version>X.X.X</version> </dependency>
通過Maven倉庫安裝加密SDK
在專案中添加alibabacloud-encryption-sdk-java的依賴,可從Maven倉庫中自動下載發布的Java安裝包。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibabacloud-encryption-sdk-java</artifactId>
<version>X.X.X</version>
</dependency>
加密SDK的最新版本,請參見Alibabacloud Encryption SDK Java。
資料加解密樣本
阿里雲帳號AccessKey擁有所有OpenAPI的存取權限,建議您使用RAM使用者進行API訪問或日常營運。強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
本樣本以將AccessKey配置在環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET的方式來實現身分識別驗證為例。
更多認證資訊配置方式,請參見管理訪問憑據。
不同作業系統的環境變數配置方法不同,具體操作,請參見在Linux、macOS和Windows系統配置環境變數。
對位元組數群組類型的資料進行加解密
public class BasicEncryptionExample { private static final String ACCESS_KEY_ID = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); private static final String ACCESS_KEY_SECRET = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); private static final String CMK_ARN = "acs:kms:RegionId:UserId:key/CmkId"; private static final byte[] PLAIN_TEXT = "Hello World".getBytes(StandardCharsets.UTF_8); public static void main(String[] args) { //1.建立訪問aliyun配置。 AliyunConfig config = new AliyunConfig(); config.withAccessKey(ACCESS_KEY_ID, ACCESS_KEY_SECRET); //2.建立SDK,傳入訪問aliyun配置。 AliyunCrypto aliyunSDK = new AliyunCrypto(config); //3.建立provider,用於提供資料密鑰或簽名。 BaseDataKeyProvider provider = new DefaultDataKeyProvider(CMK_ARN); //設定不同的演算法(預設為AES_GCM_NOPADDING_256)。 //provider.setAlgorithm(CryptoAlgorithm.SM4_GCM_NOPADDING_128); //4.加密上下文。 Map<String, String> encryptionContext = new HashMap<>(); encryptionContext.put("one", "one"); encryptionContext.put("two", "two"); //5.調用加密和解密介面。 CryptoResult<byte[]> cipherResult = aliyunSDK.encrypt(provider, PLAIN_TEXT, encryptionContext); CryptoResult<byte[]> plainResult = aliyunSDK.decrypt(provider, cipherResult.getResult()); Assert.assertArrayEquals(PLAIN_TEXT, plainResult.getResult()); } }
說明本樣本的完整代碼請參見SimpleEncryptAndDecryptSample.java。
關於如何建立AccessKey ID和AccessKey Secret,請參見建立AccessKey。
對位元組流類型的資料進行加解密
public class FileStreamSample { private static final String FILE = "README.md"; // accessKeyId accessKeySecret private static final String ACCESS_KEY_ID = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); private static final String ACCESS_KEY_SECRET = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); // 日誌系統。 private static final Logger LOGGER = LoggerFactory.getLogger(FileStreamSample.class); // ARN格式的使用者主要金鑰ID。 private static final String CMK_ARN = "acs:kms:RegionId:UserId:key/CmkId"; public static void main(String[] args) throws IOException { AliyunConfig config = new AliyunConfig(); config.withAccessKey(ACCESS_KEY_ID, ACCESS_KEY_SECRET); encryptStream(config); decryptStream(config); Assert.assertEquals(getFileMD5(FILE), getFileMD5(FILE + ".decrypted")); } private static void encryptStream(AliyunConfig config) throws IOException { //1.建立SDK,傳入訪問aliyun配置。 AliyunCrypto aliyunSDK = new AliyunCrypto(config); //2.構建加密上下文。 final Map<String, String> encryptionContext = new HashMap<>(); encryptionContext.put("this", "context"); encryptionContext.put("can help you", "to confirm"); encryptionContext.put("this data", "is your original data"); //3.建立提供資料密鑰的provider。 BaseDataKeyProvider provider = new DefaultDataKeyProvider(CMK_ARN); //4.建立輸入輸出資料流。 FileInputStream inputStream = new FileInputStream(FILE); FileOutputStream outputStream = new FileOutputStream(FILE + ".encrypted"); //5.調用加密介面。 try { aliyunSDK.encrypt(provider, inputStream, outputStream, encryptionContext); } catch (InvalidAlgorithmException e) { System.out.println("Failed."); System.out.println("Error message: " + e.getMessage()); } } private static void decryptStream(AliyunConfig config) throws IOException { //1.建立SDK,傳入訪問aliyun配置。 AliyunCrypto aliyunSDK = new AliyunCrypto(config); //2.建立提供資料密鑰的provider。 BaseDataKeyProvider provider = new DefaultDataKeyProvider(CMK_ARN); //3.建立輸入輸出資料流。 FileInputStream inputStream = new FileInputStream(FILE + ".encrypted"); FileOutputStream outputStream = new FileOutputStream(FILE + ".decrypted"); //4.調用解密介面。 try { aliyunSDK.decrypt(provider, inputStream, outputStream); } catch (InvalidAlgorithmException e) { System.out.println("Failed."); System.out.println("Error message: " + e.getMessage()); } } private static String getFileMD5(String fileName) { File file = new File(fileName); if (!file.isFile()) { return null; } MessageDigest digest; byte[] buffer = new byte[4096]; try (FileInputStream in = new FileInputStream(file)){ digest = MessageDigest.getInstance("MD5"); int len; while ((len = in.read(buffer)) != -1) { digest.update(buffer, 0 , len); } return Hex.encodeHexString(digest.digest()); } catch (Exception e) { e.printStackTrace(); } return null; } }