0

我正在尝试使用 KMS GenerateDataKeyPairAsync 来获取公钥和私钥进行测试(一旦它工作,我将切换到 GenerateDataKeyPairWithoutPlaintextAsync)。

GenerateDataKeyPairResponse 具有公钥、私钥密文和私钥明文的三个内存流。

我似乎无法将这些内存流中的任何一个转换为字符串,因此我实际上可以使用这些键。

SDK 文档(https://docs.aws.amazon.com/sdkfornet/v3/apidocs/Index.html)说如果使用 HTTP api,它将是 Base64 编码的,SDK 是否使用 HTTP api?我好像说不出来。

我已经尝试使用 StreamReader.ReadToEnd() 并使用 Encoding.ENCODING.FromString(stream.ToArray()) 使用所有编码,但我似乎无法得到合理的值。

我在这里错过了一些重要的事情吗?

谢谢

添加代码:

# USING: AWSSDK.KeyManagementService VERSION: 3.5.0-beta


using System;
using System.IO;
using System.Threading.Tasks;
using Amazon;
using Amazon.KeyManagementService;
using Amazon.KeyManagementService.Model;
using Amazon.Runtime;

namespace ConsoleApp1
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var credentials = new BasicAWSCredentials("AccessKey", "SecretKey");

            var kmsClient = new AmazonKeyManagementServiceClient(credentials, RegionEndpoint.EUCentral1);

            const string keyId = "CMKKey";

            var dataKeyRequest = new GenerateDataKeyPairRequest
            {
                KeyId = keyId, 
                KeyPairSpec = DataKeyPairSpec.RSA_2048
            };

            var dataKeyPairResponse = await kmsClient.GenerateDataKeyPairAsync(dataKeyRequest);

            var publicKeyStream = dataKeyPairResponse.PublicKey;

            var privateKeyStream = dataKeyPairResponse.PrivateKeyPlaintext;

            var publicReader = new StreamReader( publicKeyStream );
            var publicKey = publicReader.ReadToEnd();

            var privateReader = new StreamReader( privateKeyStream );
            var privateKey = privateReader.ReadToEnd();

            Console.WriteLine(publicKey);
            Console.WriteLine(privateKey);
        }
    }
}
4

1 回答 1

0

我想我在 AWS 库中发现了一个错误。在调用堆栈的深处有一个 DecodefromBase64 调用,但我不认为它正在解码的字符串实际上在 Base64 中。因此,您最终得到的字符串实际上是已解码的普通字符串。如果您使用 base64 对字符串进行编码,它将返回正确的字符串。

以下代码将解决您的问题...但是,我将联系在此库上工作的团队并尝试修复它。如果它在库级别修复,则此代码将停止工作。所以请谨慎使用/等待官方修复。

var dataKeyPairResponse = await kmsClient.GenerateDataKeyPairAsync(dataKeyRequest);
var privateKeyBytes = dataKeyPairResponse.PrivateKeyPlaintext.ToArray(); 
var privateKey = Convert.ToBase64String(privateKeyBytes);

var publicKeyBytes = dataKeyPairResponse.PublicKey.ToArray();
var publicKey = Convert.ToBase64String(publicKeyBytes);

Console.Write(privateKey);
Console.Write(publicKey);
于 2020-03-04T21:42:17.647 回答