Hyperledger Web3j:对 AWS KMS 的 HSM 支持
核心要点
- 在数字安全领域,通过强大的加密保护敏感数据至关重要。
- AWS Key Management Service (KMS) 在此领域发挥着至关重要的作用。
- 它作为一种高度安全、完全托管的服务,用于创建和控制加密密钥。
- 通过利用此工具,组织可以增强其安全状况,同时受益于 AWS 云原生 HSM 功能的便利性。

在数字安全领域,通过强大的加密保护敏感数据至关重要。 AWS Key Management Service (KMS) 在此领域发挥着至关重要的作用。它作为一种高度安全、完全托管的服务,用于创建和控制加密密钥。许多人可能没有意识到,AWS KMS 本身作为硬件安全模块 (HSM) 运行,提供与专用硬件解决方案相同级别的安全性。
HSM 是一种物理设备,旨在安全地生成、存储和管理加密密钥,AWS KMS 以云原生方式提供此功能。除了密钥管理之外,支持 HSM 的 AWS KMS 还可用于签署加密交易。这提供了一种可信的、硬件支持的方式来保护区块链交互、数字签名等。本文将介绍 AWS KMS 如何充当 HSM、使用它来签署加密交易的好处以及它如何适应更广泛的安全策略。
在 Hyperledger Web3j 中,两年前引入了对 HSM 的支持,为用户提供了管理加密密钥的安全方法。更多详细信息,您可以参考官方文档。
然而,尽管进行了这种集成,许多用户在采用和实施 HSM 接口时仍然遇到了挑战,特别是在使用 AWS KMS 模块时。为了解决这些困难,专门为 AWS KMS HSM 支持添加了即用型实施。这简化了集成过程,使用户可以更轻松地利用 AWS KMS 进行安全交易签名,而无需复杂的手动配置。
HSMAwsKMSRequestProcessor 类是 HSMRequestProcessor 接口的实现,负责促进与 HSM 的交互。这个新实现的类包含与 AWS KMS 通信所需的所有基本代码,从而能够检索使用正确的加密签名签名的数据。它通过处理签名生成的复杂性并确保安全的交易签名而无需额外的开发开销,从而简化了使用 AWS KMS 作为 HSM 的过程。
以下是包含 callHSM 方法最重要操作的代码片段:
@Override public Sign.SignatureData callHSM(byte[] dataToSign, HSMPass pass) { // 创建 AWS KMS 的 SignRequest var signRequest = SignRequest.builder() .keyId(keyID) .message(SdkBytes.fromByteArray(dataHash)) .messageType(MessageType.DIGEST) .signingAlgorithm(SigningAlgorithmSpec.ECDSA_SHA_256) .build(); // 使用 AWS KMS 对数据进行签名 var signResult = kmsClient.sign(signRequest); var SignatureBuffer = SignResult.signature().asByteBuffer(); // 将签名转换为字节数组 var signBytes = new byte[signatureBuffer.remaining()];签名缓冲区.get(signBytes); // 验证签名 osn KMS var verifyRequest = verifyRequest.builder() .keyId(keyID) .message(SdkBytes.fromByteArray(dataHash)) .messageType(MessageType.DIGEST) .signingAlgorithm(SigningAlgorithmSpec.ECDSA_SHA_256) .signature(SdkBytes.fromByteArray(signBytes)) .build(); var verifyRequestResult = kmsClient.verify(verifyRequest); if (!verifyRequestResult.signatureValid()) { throw new RuntimeException("KMS 签名无效!"); var 签名 = CryptoUtils.fromDerFormat(signBytes); return Sign.createSignatureData(signature, pass.getPublicKey(), dataHash); }
笔记!
为了正确使用此功能,在 AWS KMS 中创建的密钥规范类型必须为 ECC_SECG_P256K1。这是加密领域特有的,尤其是 EVM。创建数据签名时,使用任何其他密钥都会导致不匹配错误。
以下是如何从库调用 callHSM 方法的简短示例:
public static void main(String[] args) throws Exception { KmsClient client = KmsClient.create(); // 提取 KMS 密钥 byte[] derPublicKey = client .getPublicKey((var builder) -> { builder.keyId(kmsKeyId); }) .publicKey() .asByteArray(); byte[] rawPublicKey = subjectPublicKeyInfo .getInstance(derPublicKey) .getPublicKeyData() .getBytes(); BigInteger publicKey = new BigInteger(1, Arrays.copyOfRange(rawPublicKey, 1, rawPublicKey.length)); HSMPass pass = new HSMPass(null, publicKey); HSMRequestProcessor 签名者 = new HSMAwsKMSRequestProcessor(client, kmsKeyId);签名者.callHSM(数据,传递); }
AWS KMS 具有内置的 HSM 功能,为安全管理和签署加密交易提供了强大的解决方案。尽管用户在将 AWS KMS 与 Hyperledger Web3j 集成时面临最初的挑战,但 HSMAwsKMSRequestProcessor 类的引入使其更容易采用和实施。这种即用型解决方案简化了与 AWS KMS 的交互,使用户能够以最少的配置安全地签署数据和交易。通过利用此工具,组织可以增强其安全状况,同时受益于 AWS 云原生 HSM 功能的便利性。
