全部产品
Search
文档中心

密钥管理服务:数据签名验签

更新时间:May 31, 2023

对于非对称密钥类型的用户主密钥(CMK),您可以使用私钥对消息或信息产生签名。由于私钥受到严格保护,因此只有受信者可以使用私钥来产生签名,签名后您可以使用公钥验证签名。

数据签名验签的优势如下:

  • 验证数据的完整性(integrity):如果数据和签名不匹配,数据可能受到了篡改。

  • 验证消息的真实性(authenticity):如果消息和签名不匹配,消息传送者不是真实持有私钥的用户。

  • 为签名提供不可抵赖性(non-repudiation):如果数据和签名能够匹配,签名者不可以否认此签名。

代码示例

说明

阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。

本示例以将AccessKey配置在环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET的方式来实现身份验证为例。更多认证信息配置方式,请参见Credentials 设置

/**
 *
 * 签名验签示例
 */
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