如何在Ruby中使用S3 SSE C(具有客户端提供的密钥的服务器端加密)

Jac*_*ius 5 ruby encryption aes amazon-s3 amazon-web-services

我正在尝试将文件上传到S3,并使用SSE-C加密选项对其进行加密。我可以不使用SSE-C选项进行上传,但是当我提供sse_customer_key选项时,出现以下错误:

ArgumentError:标头x-amz-server-side-encryption-customer-key具有字段值“ QkExM0JGRTNDMUUyRDRCQzA5NjAwNEQ2MjRBNkExMDYwQzBGQjcxODJDMjM0 \ nnMUE2MTNENDRCOTcxRjA2LFzFinclude /

我不确定问题出在我生成的密钥还是编码中。我在这里使用了不同的选项,但是AWS文档不是很清楚。在一般的SSE-C文档中,它说您需要提供x-amz-server-side?-encryption?-customer-key标头,其描述如下:

使用此标头为Amazon S3提供256位,base64编码的加密密钥,以用于加密或解密数据。

但是,如果我查看用于上传文件的Ruby SDK文档,则3个选项的描述稍有不同

  • :sse_customer_algorithm(String)—指定加密对象时使用的算法(例如,
  • :sse_customer_key(字符串)—指定客户提供的Amazon S3使用的加密密钥
  • :sse_customer_key_md5(字符串)—根据RFC指定加密密钥的128位MD5摘要

(我没有复制错误,AWS文档实际上是这样写的)

因此,SDK文档使您似乎提供了原始的sse_customer_key,并且可以代表您对其进行base64编码(这对我来说很有意义)。

所以现在我正在建立这样的选项:

  sse_customer_algorithm: :AES256,
  sse_customer_key: sse_customer_key,
  sse_customer_key_md5: Digest::MD5.hexdigest(sse_customer_key)
Run Code Online (Sandbox Code Playgroud)

我以前尝试这样做,Base64.encode64(sse_customer_key)但这给了我一个不同的错误:

Aws :: S3 :: Errors :: InvalidArgument:密钥对于指定算法无效

我不确定我是错误生成密钥还是提供密钥不正确(或者是否完全是另一个问题)。

这就是我生成密钥的方式:

require "openssl"
OpenSSL::Cipher.new("AES-256-CBC").random_key
Run Code Online (Sandbox Code Playgroud)

Fab*_*ano 1

哦,你注意到你的密钥包含“\n”吗?这很可能就是您收到 CR/LF 错误的原因: QkExM0JGRTNDMUUyRDRCQzA5NjAwNEQ2MjRBNkExMDYwQzBGQjcxODJDMjM0(\n)nMUE2MTNENDRCOTcxRjA2Qzk1Mg=

正如同事在评论中提到的,strict_encode64是一个选项,因为它符合 RFC 2045。

顺便说一句,我从这里得到了这个见解:https ://bugs.ruby-lang.org/issues/14664

希望能帮助到你!:)