如何使用Ruby Base64模块编码哈希 [英] How to encode a hash using Ruby Base64 module

查看:87
本文介绍了如何使用Ruby Base64模块编码哈希的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试对哈希进行编码,并且期望它返回一些我知道的值.这是我编写的用于编码的红宝石脚本.

  policy = {到期":"2015-12-30T12:00:00.000Z",使适应": [{"bucket":"sigv4examplebucket"},[开始于","$ key",用户/用户1/"],{"acl":公开阅读"},{"success_action_redirect":"http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html"},[开始于","$ Content-Type",图像/"],{"x-amz-meta-uuid":"14365123651274"},{"x-amz-server-side-encryption":"AES256"},["starts-with","$ x-amz-meta-tag","],{"x-amz-credential":"AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request"},{"x-amz-algorithm":"AWS4-HMAC-SHA256"},{"x-amz-date":"20151229T000000Z"}]} .to_senc = Base64.encode64(policy) 

预期的编码值:

 eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9 

但是我的ruby脚本正在返回:

 ezpleHBpcmF0aW9uPT4iMjAxNS0xMi0zMFQxMjowMDowMC4wMDBaIiwgOmNvbmRpdGlvbnM9Plt7OmJ1Y2tldD0 + InNpZ3Y0ZXhhbXBsZWJ1Y2tldCJ9LCBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwgezphY2w9PiJwdWJsaWMtcmVhZCJ9LCB7OnN1Y2Nlc3NfYWN0aW9uX3JlZGlyZWN0PT4iaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwgWyJzdGFydHMtd2l0aCIsICIkQ29udGVudC1UeXBlIiwgImltYWdlLyJdLCB7OiJ4LWFtei1tZXRhLXV1aWQiPT4iMTQzNjUxMjM2NTEyNzQifSwgezoieC1hbXotc2VydmVyLXNpZGUtZW5jcnlwdGlvbiI9PiJBRVMyNTYifSwgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sIHs6IngtYW16LWNyZWRlbnRpYWwiPT4iQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LCB7OiJ4LWFtei1hbGdvcml0aG0iPT4iQVdTNC1ITUFDLVNIQTI1NiJ9LCB7OiJ4LWFtei1kYXRlIj0 + IjIwMTUxMjI5VDAwMDAwMFoifV19 

当我使用 https://www.base64encode.org/时,它返回的正是预期的结果.我已经从 http://docs中获取了期望值.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

我做对了吗?

解决方案

您期望使用漂亮的JSON字符串,但是会得到Ruby哈希.这更接近您想要的:

  Base64.encode64(JSON.dump(policy)) 

这并不完全相同,不是一个字节一个字节,但应该可以完成工作.

如果您需要获得与输出完全相同的输出,那么即使在数据方面JSON是相同的,也将不得不使用JSON格式进行处理.

I am trying to encode a hash and I am expecting it to return some value which I know. This is the ruby script I wrote to encode.

policy = {
 "expiration": "2015-12-30T12:00:00.000Z",
 "conditions": [
   {"bucket": "sigv4examplebucket"},
   ["starts-with", "$key", "user/user1/"],
   {"acl": "public-read"},
   {"success_action_redirect": "http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html"},
   ["starts-with", "$Content-Type", "image/"],
   {"x-amz-meta-uuid": "14365123651274"},
   {"x-amz-server-side-encryption": "AES256"},
   ["starts-with", "$x-amz-meta-tag", ""],
   {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request"},
   {"x-amz-algorithm": "AWS4-HMAC-SHA256"},
   {"x-amz-date": "20151229T000000Z" }
 ]
}.to_s

enc = Base64.encode64(policy)

Expected encode value:

eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9

but my ruby script is returning:

ezpleHBpcmF0aW9uPT4iMjAxNS0xMi0zMFQxMjowMDowMC4wMDBaIiwgOmNvbmRpdGlvbnM9Plt7OmJ1Y2tldD0+InNpZ3Y0ZXhhbXBsZWJ1Y2tldCJ9LCBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwgezphY2w9PiJwdWJsaWMtcmVhZCJ9LCB7OnN1Y2Nlc3NfYWN0aW9uX3JlZGlyZWN0PT4iaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwgWyJzdGFydHMtd2l0aCIsICIkQ29udGVudC1UeXBlIiwgImltYWdlLyJdLCB7OiJ4LWFtei1tZXRhLXV1aWQiPT4iMTQzNjUxMjM2NTEyNzQifSwgezoieC1hbXotc2VydmVyLXNpZGUtZW5jcnlwdGlvbiI9PiJBRVMyNTYifSwgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sIHs6IngtYW16LWNyZWRlbnRpYWwiPT4iQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LCB7OiJ4LWFtei1hbGdvcml0aG0iPT4iQVdTNC1ITUFDLVNIQTI1NiJ9LCB7OiJ4LWFtei1kYXRlIj0+IjIwMTUxMjI5VDAwMDAwMFoifV19

When I used https://www.base64encode.org/, it returns exactly what is expected. I have taken the expected value from http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

Am I doing it right?

解决方案

You're expecting a pretty JSON string but you're getting a Ruby hash. This is closer to what you want:

Base64.encode64(JSON.dump(policy))

It's not exactly the same, not byte for byte, but should do the job.

If you need to get the output precisely the same you're going to have to wrangle around with JSON formatting even though the JSON is, data-wise, identical.

这篇关于如何使用Ruby Base64模块编码哈希的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆