對于非對稱密鑰類型的用戶主密鑰(CMK),您可以使用私鑰對消息或信息產生簽名。由于私鑰受到嚴格保護,因此只有受信者可以使用私鑰來產生簽名,簽名后您可以使用公鑰驗證簽名。
數據簽名驗簽的優勢如下:
驗證數據的完整性(integrity):如果數據和簽名不匹配,數據可能受到了篡改。
驗證消息的真實性(authenticity):如果消息和簽名不匹配,消息傳送者不是真實持有私鑰的用戶。
為簽名提供不可抵賴性(non-repudiation):如果數據和簽名能夠匹配,簽名者不可以否認此簽名。
代碼示例
說明
阿里云賬號AccessKey擁有所有OpenAPI的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。強烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。
本示例以將AccessKey配置在環境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET的方式來實現身份驗證為例。
更多認證信息配置方式,請參見Credentials 設置。
不同操作系統的環境變量配置方法不同,具體操作,請參見在Linux、macOS和Windows系統配置環境變量。
/**
*
* 簽名驗簽示例
*/
public class DigestMessageSignatureVerifySample {
private static final String ASYM_CMK_ARN = "<acs:kms:RegionId:UserId:key/CmkId>";
private static final String KEY_VERSION_ID = "<KEY_VERSION_ID>";
// 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 byte[] MESSAGE_TEXT = "this is test.".getBytes();
public static void main(String[] args) {
// 創建訪問阿里云配置。
AliyunConfig config = new AliyunConfig();
config.withAccessKey(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
// 創建SDK,傳入訪問阿里云配置。
AliyunCrypto aliyunCrypto = new AliyunCrypto(config);
// 設置簽名驗簽Provider。
KmsAsymmetricKeyProvider provider = new KmsAsymmetricKeyProvider(ASYM_CMK_ARN, KEY_VERSION_ID, SignatureAlgorithm.RSA_PKCS1_SHA_256);
// 使用原始消息。
byte[] signature = aliyunCrypto.sign(provider, MESSAGE_TEXT, ContentType.MESSAGE).getResult();
Boolean isOk = aliyunCrypto.verify(provider, MESSAGE_TEXT, signature, ContentType.MESSAGE);
System.out.println(isOk);
// 使用消息摘要。
byte[] sha256Digest = provider.getDigest(MESSAGE_TEXT);
signature = aliyunCrypto.sign(provider, sha256Digest, ContentType.DIGEST).getResult();
isOk = aliyunCrypto.verify(provider, sha256Digest, signature, ContentType.DIGEST);
System.out.println(isOk);
}
}
說明
本示例的完整代碼請參見libabacloud-encryption-sdk-java-examples-signVerify。
文檔內容是否對您有幫助?