【问题标题】:How can I convert PrivateKeyCiphertextBlob or PrivateKeyPlaintext to string?如何将 PrivateKeyCiphertextBlob 或 PrivateKeyPlaintext 转换为字符串?
【发布时间】:2020-03-05 05:44:23
【问题描述】:

我正在尝试使用 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);
        }
    }
}

【问题讨论】:

  • 嗨,Alex,你能分享你当前的代码吗?
  • 嗨@MartinBeeby Here 是我一直在测试的代码。我希望 publicKey 和 privateKey 现在是清晰的字符串,但它们似乎不是我能解决的任何编码。谢谢
  • 是的,返回的字符串看起来很奇怪。根据文档,它们不是在 SDK 中进行 base64 编码:“获取和设置属性 PrivateKeyPlaintext。私有密钥的明文副本。当您使用 HTTP API 或 AWS CLI 时,该值是 Base64 编码的。否则,它不是 Base64 编码的。”明天我会调查更多。

标签: c# .net-core aws-sdk-net


【解决方案1】:

我想我在 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);

【讨论】:

  • 嗨,马丁,很抱歉花了这么长时间,我不得不迅速行动,只是设法回到编码上。使用您的代码我得到正确的私钥,但公钥似乎不是该私钥的正确公钥?我已经使用下面的要点来解释更多信息,但是在私钥上使用“ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub”可以让我得到一个不同的公钥api返回。 gist.github.com/AKTheKnight/d851306cb2102f933d91e19689afc20a
猜你喜欢
  • 2011-09-28
  • 2020-05-24
  • 2020-01-21
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 2015-06-25
  • 2018-01-23
  • 2019-06-04
相关资源
最近更新 更多