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

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

  • 验证数据的完整性(integrity):如果数据和签名不匹配,数据可能受到了篡改。
  • 验证消息的真实性(authenticity):如果消息和签名不匹配,消息传送者不是真实持有私钥的用户。
  • 为签名提供不可抵赖性(non-repudiation):如果数据和签名能够匹配,签名者不可以否认此签名。

代码示例

/**
 *
 * 签名验签示例
 */
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 = "<AccessKeyId>";
    private static final String ACCESS_KEY_SECRET = "<AccessKeySecret>";
    private static final byte[] MESSAGE_TEXT = "this is test.".getBytes();
    private static final byte[] DIGEST_HEX_TEXT = "FECC75FE2A23D8EAFBA452EE0B8B6B56BECCF52278BF1398AADDEECFE0EA0FCE".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。
        SignatureProvider 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).getResult();
        assertTrue(isOk);

        // 使用消息摘要。
        byte[] sha256Digest = hex2Bytes(DIGEST_HEX_TEXT);
        signature = aliyunCrypto.sign(provider, sha256Digest, ContentType.DIGEST).getResult();
        isOk = aliyunCrypto.verify(provider, sha256Digest, signature, ContentType.DIGEST).getResult();
        assertTrue(isOk);
    }
}
说明 本示例的完整代码请参见libabacloud-encryption-sdk-java-examples-signVerify