对于非对称密钥类型的用户主密钥(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。
文档内容是否对您有帮助?