У меня была та же проблема несколько месяцев назад, но это была решена путем введения реализации SymmetricAlgorithm и ICryptoTransform для поддержки службы KMS. Они прозрачно шифруют и дешифруют ключ конверта, используя службу KMS и указанный CMK.
public class KMSAlgorithm : SymmetricAlgorithm
{
private IAmazonKeyManagementService _client;
private string _keyId;
public KMSAlgorithm(IAmazonKeyManagementService client)
{
this._client = client;
}
public KMSAlgorithm(IAmazonKeyManagementService client, string keyId)
: this(client)
{
this._keyId = keyId;
}
public override ICryptoTransform CreateDecryptor()
{
return new KMSCryptoTransform.Decryptor(_client);
}
public override ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV)
{
throw new NotImplementedException();
}
public override ICryptoTransform CreateEncryptor()
{
return new KMSCryptoTransform.Encryptor(_client, _keyId);
}
public override ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV)
{
throw new NotImplementedException();
}
public override void GenerateIV()
{
throw new NotImplementedException();
}
public override void GenerateKey()
{
throw new NotImplementedException();
}
}
public abstract class KMSCryptoTransform : ICryptoTransform
{
protected IAmazonKeyManagementService _client;
protected string _keyId;
public KMSCryptoTransform(IAmazonKeyManagementService client)
{
this._client = client;
}
public KMSCryptoTransform(IAmazonKeyManagementService client, string keyId)
: this(client)
{
this._keyId = keyId;
}
public bool CanReuseTransform
{
get { return true; }
}
public bool CanTransformMultipleBlocks
{
get { return false; }
}
public int InputBlockSize
{
get { throw new NotImplementedException(); }
}
public int OutputBlockSize
{
get { throw new NotImplementedException(); }
}
public int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset)
{
throw new NotImplementedException();
}
public abstract byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount);
public void Dispose()
{
}
public class Decryptor : KMSCryptoTransform
{
public Decryptor(IAmazonKeyManagementService client)
: base(client) { }
public override byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount)
{
return _client.Decrypt(new DecryptRequest()
{
CiphertextBlob = new MemoryStream(inputBuffer, inputOffset, inputCount))
}).Plaintext.ToArray();
}
}
public class Encryptor : KMSCryptoTransform
{
public Encryptor(IAmazonKeyManagementService client, string keyId)
: base(client, keyId) { }
public override byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount)
{
return _client.Encrypt(new EncryptRequest()
{
KeyId = _keyId,
Plaintext = MemoryStream(inputBuffer, inputOffset, inputCount))
}).CiphertextBlob.ToArray();
}
}
}
Этот KMSAlgorithm использовали это в месте Aes.Create() в конструктор EncryptionMaterials, который в свою очередь был использован в AmazonS3EncryptionClient конструктора, как это.
var client = AWSClientFactory.CreateAmazonKeyManagementServiceClient();
using (var algorithm = new KMSAlgorithm(client, "CustomerMasterKeyIdOrAlias"))
{
var materials = new EncryptionMaterials(algorithm);
var s3client = new AmazonS3EncryptionClient(materials);
s3client.PutObject(new PutObjectRequest()
{
BucketName = "YourBucketName",
Key = "YourKeyName",
InputStream = new MemoryStream(Encoding.Default.GetBytes("Secret Message")),
});
}
using (var algorithm = new KMSAlgorithm(client))
{
var materials = new EncryptionMaterials(algorithm);
var s3client = new AmazonS3EncryptionClient(materials);
var obj = s3client.GetObject(new GetObjectRequest()
{
BucketName = "YourBucketName",
Key = "YourKeyName"
});
}
Обратите внимание, что ЦКИ идентификатор или псевдоним не должен быть явно указан для расшифровки ключа конверта только для шифрования ключа конверта.
Этот ответ также размещен в Amazon Web Services Developer Forums.
Что именно вы видите в консоли, что кажется неправильным, и что именно вы считаете своим результатом? Просьба указать некоторые ссылки на «все», в которых говорится, что вы должны видеть то, что ожидаете увидеть. –
, глядя на sdk api's и этот сайт http://blogs.aws.amazon.com/net/post/TxL15A0QZMD38D/Client-Side-Data-Encryption-with-AWS-SDK-for-NET-and-Amazon- S3 У меня нет вывода на консольное окно, программа просто загружает и завершает работу. Я подумал, что когда просматривал файл с помощью браузера S3, это было бы правдой на стороне клиента. Это просто переход на S3, например, с помощью SSL-соединения? – MPennsc
Я сейчас работаю над этим, но похоже, что вы смешиваете шифрование на стороне клиента и на стороне сервера. Поставщику материалов нужен ключ для использования клиентом. Из того, что я могу сказать .net sdk в настоящее время не поддерживает KMS с клиентским кодированием. Я опубликовал на форуме разработчиков AWS под .net, если вы хотите перезвонить там. – Greg