2014-12-18 4 views
2

Я начал использовать sdk из AWS для S3, и все говорит, что я должен получать шифрование на стороне клиента для загрузки, но когда я проверяю его с помощью браузера S3, он отображает только шифрование на стороне сервера , Что я делаю не так?Не получить шифрование на стороне клиента с .net S3

Я использую сервис ключа шифрования amazon, и у пользователя есть все права на шифрование с использованием этих ключей.

Спасибо!

static string bucketName = "mybucket"; 
static EncryptionMaterials encryptionMaterials = new EncryptionMaterials(RSA.Create()); 
static AmazonS3EncryptionClient client = new AmazonS3EncryptionClient(Amazon.RegionEndpoint.USWest2, encryptionMaterials); 

static void Main(string[] args) 
{ 
    using (client) 
    { 
     try 
     { 
      PutObjectRequest putRequest1 = new PutObjectRequest 
      { 
       BucketName = bucketName, 
       FilePath = @"C:\abc\def.pdf", 
       Key = "def.pdf", 
       ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS 
      }; 
      client.PutObject(putRequest1); 
+0

Что именно вы видите в консоли, что кажется неправильным, и что именно вы считаете своим результатом? Просьба указать некоторые ссылки на «все», в которых говорится, что вы должны видеть то, что ожидаете увидеть. –

+0

, глядя на 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

+0

Я сейчас работаю над этим, но похоже, что вы смешиваете шифрование на стороне клиента и на стороне сервера. Поставщику материалов нужен ключ для использования клиентом. Из того, что я могу сказать .net sdk в настоящее время не поддерживает KMS с клиентским кодированием. Я опубликовал на форуме разработчиков AWS под .net, если вы хотите перезвонить там. – Greg

ответ

2

У меня была та же проблема несколько месяцев назад, но это была решена путем введения реализации 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.

Смежные вопросы