数据加密服务 DEW
数据加密服务 DEW
- 最新动态
- 功能总览
- 产品介绍
- 计费说明
- 快速入门
- 用户指南
- 最佳实践
- API参考
- SDK参考
- 场景代码示例
-
常见问题
-
密钥管理类
- 什么是密钥管理?
- 什么是用户主密钥?
- 什么是默认密钥?
- 自定义密钥与默认密钥有什么区别?
- 什么是数据加密密钥?
- 为什么不能立即删除用户主密钥?
- 哪些云服务使用KMS加密数据?
- 华为云服务如何使用KMS加密数据?
- 信封加密方式有什么优势?
- 在KMS中创建的自定义密钥的个数是否有限制?
- 是否可以从KMS中导出用户主密钥?
- 如果自定义密钥被彻底删除,用户数据是否还可以解密?
- 如何使用在线工具加解密数据?
- 是否可以更新KMS管理的密钥?
- 在什么场景下推荐使用导入的密钥?
- 密钥材料被意外删除时如何处理?
- 默认密钥如何生成?
- 没有权限操作KMS,该如何处理?
- 如何修补OpenSSL以使用-id-aes256-wrap-pad包装非对称密钥?
- 如何修补GmSSL以使用-sms4-wrap-pad包装非对称密钥?
- KMS支持的密钥算法类型
- 请求KMS异常,错误码401,应该如何处理?
- 进行SM2签名时,如何计算SM3摘要?
- 调用encrypt-data接口,返回的密文和明文有什么关系?
- KMS如何保护创建的密钥?
- 如何使用非对称密钥对公钥对签名结果进行验签?
- 外部导入的密钥支持轮转吗?
- 密钥管理服务支持离线加解密数据吗?
- 为什么SM2算法签名结果不是64字节?
- 如何将原始EC私钥转换成PKCS8格式的私钥对象?
- 如何将原始SM2私钥转换成PKCS8格式的私钥对象?
- 凭据管理类
-
密钥对管理类
- 密钥对的配额是多少?
- 如何创建密钥对?
- 什么是私有密钥对和账号密钥对?
- 导入通过PuTTYgen工具创建的密钥对失败如何处理?
- 使用IE9浏览器无法导入密钥对如何处理?
- 如何使用私钥登录Linux弹性云服务器?
- 如何通过私钥获取Windows弹性云服务器的登录密码?
- 绑定密钥对失败如何处理?
- 替换密钥对失败如何处理?
- 重置密钥对失败如何处理?
- 解绑密钥对失败如何处理?
- 替换密钥对后,服务器需要重启吗?
- 关闭弹性云服务器的密码登录方式后如何重新开启?
- 解绑密钥对后用户无法登录ECS时如何处理?
- 私钥不慎遗失怎么办?
- 如何转换私钥文件格式?
- 密钥对在创建主机成功之后可以更改吗?
- 密钥对是否支持多用户共享?
- 如何获取密钥对的私钥或公钥文件?
- 账号密钥首次创建、首次升级时系统报错如何处理?
- 私有密钥对升级账号密钥对后,会占用账号密钥对配额吗?
- 用户联邦身份登录时,私有密钥对升级账号密钥对之后,为什么私有密钥对会不可见?
- 专属加密类
- 计费类
- 通用类
-
密钥管理类
- 视频帮助
- 文档下载
- 通用参考
本文导读
展开导读
链接复制成功!
如何使用非对称密钥对公钥对签名结果进行验签?
在公私钥对的使用场景中,通常使用私钥进行签名,使用公钥进行验签。公钥可以分发给需要使用的业务主体,业务主体对关键数据进行验签。密钥管理服务提供获取公钥的接口get-publickey。
本示例使用RSA_3072主密钥,密钥用途为SIGN_VERIFY。通过调用密钥管理服务sign接口。请求体如下:
{ "key_id": "key_id_value", "message": "MTIzNA==", "signing_algorithm": "RSASSA_PSS_SHA_256", "message_type": "RAW" }
获取的结果如下:
{ "key_id": "key_id_value", "signature": "xxx" }
通过get-publickey获取公钥后,对signature进行验签。
public class RawDataVerifyExample { /** * 基础认证信息: * - ACCESS_KEY: 华为云账号Access Key * - SECRET_ACCESS_KEY: 华为云账号Secret Access Key, 敏感信息,建议密文存储 * - IAM_ENDPOINT: 华为云IAM服务访问终端地址,详情见https://developer.huaweicloud.com/endpoint?IAM * - KMS_REGION_ID: 华为云KMS支持的地域,详情见https://developer.huaweicloud.com/endpoint?DEW * - KMS_ENDPOINT: 华为云KMS服务访问终端地址,详情见https://developer.huaweicloud.com/endpoint?DEW */ private static final String ACCESS_KEY = System.getenv("HUAWEICLOUD_SDK_AK"); private static final String SECRET_ACCESS_KEY = System.getenv("HUAWEICLOUD_SDK_SK"); private static final String IAM_ENDPOINT = "https://<IamEndpoint>"; private static final String KMS_REGION_ID = "<RegionId>"; private static final String KMS_ENDPOINT = "https://<KmsEndpoint>"; private static final int SALT_LENGTH = 32; private static final int TRAILER_FIELD = 1; public static final String RSA_PUBLIC_KEY_BEGIN = "-----BEGIN PUBLIC KEY-----\n"; public static final String RSA_PUBLIC_KEY_END = "-----END PUBLIC KEY-----"; // 示例签名数据,BASE64编码格式,原文信息1234 private static final String RWA_DATA = "MTIzNA=="; // 通过密钥管理服务sign接口获取的签名值 private static final String SIGN = "xxx"; public static void main(String[] args) throws Exception { final String keyId = args[0]; publicKeyVerify(keyId); } public static void publicKeyVerify(String keyId) throws Exception { // 1.准备访问华为云的认证信息 final BasicCredentials auth = new BasicCredentials() .withIamEndpoint(IAM_ENDPOINT).withAk(ACCESS_KEY).withSk(SECRET_ACCESS_KEY); // 2.初始化SDK,传入认证信息及KMS访问终端地址 final KmsClient kmsClient = KmsClient.newBuilder() .withRegion(new Region(KMS_REGION_ID, KMS_ENDPOINT)).withCredential(auth).build(); // 3.获取公钥信息,返回的是PKCS8格式 final ShowPublicKeyRequest showPublicKeyRequest = new ShowPublicKeyRequest() .withBody(new OperateKeyRequestBody().withKeyId(keyId)); final ShowPublicKeyResponse showPublicKeyResponse = kmsClient.showPublicKey(showPublicKeyRequest); // 4.获取公钥字符串 final String publicKeyStr = showPublicKeyResponse.getPublicKey().replace(RSA_PUBLIC_KEY_BEGIN, "") .replaceAll("\n", "").replace(RSA_PUBLIC_KEY_END, ""); // 5.解析公钥 final X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyStr)); final KeyFactory keyFactory = KeyFactory.getInstance("RSA", new BouncyCastleProvider()); final PublicKey publicKey = keyFactory.generatePublic(keySpec); // 6.进行验签 final Signature signature = getSignature(); signature.initVerify(publicKey); signature.update(commonHash(Base64.getDecoder().decode(RWA_DATA))); // 7.验签结果 assert signature.verify(Base64.getDecoder().decode(SIGN)); } private static Signature getSignature() throws Exception { Signature signature= Signature.getInstance("NONEwithRSASSA-PSS", new BouncyCastleProvider()); MGF1ParameterSpec mgfParam = new MGF1ParameterSpec("SHA256"); PSSParameterSpec pssParam = new PSSParameterSpec("SHA256", "MGF1", mgfParam, SALT_LENGTH, TRAILER_FIELD); signature.setParameter(pssParam); return signature; } private static byte[] commonHash(byte[] data) { byte[] digest; try { MessageDigest md = MessageDigest.getInstance("SHA256", BouncyCastleProvider.PROVIDER_NAME); md.update(data); digest = md.digest(); } catch (Exception e) { throw new RuntimeException("Digest failed."); } return digest; } }
父主题: 密钥管理类