2016-04-19 10 views
0

Ich versuche, einen Hash zu kodieren, und ich erwarte, dass es einen Wert zurückgibt, den ich kenne. Dies ist das Ruby-Skript, das ich zum Enkodieren geschrieben habe.Wie codiert man einen Hash mit Ruby Base64-Modul

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) 

Erwartete kodieren Wert:

eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9

aber mein Ruby-Skript zurückgibt:

ezpleHBpcmF0aW9uPT4iMjAxNS0xMi0zMFQxMjowMDowMC4wMDBaIiwgOmNvbmRpdGlvbnM9Plt7OmJ1Y2tldD0+InNpZ3Y0ZXhhbXBsZWJ1Y2tldCJ9LCBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwgezphY2w9PiJwdWJsaWMtcmVhZCJ9LCB7OnN1Y2Nlc3NfYWN0aW9uX3JlZGlyZWN0PT4iaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwgWyJzdGFydHMtd2l0aCIsICIkQ29udGVudC1UeXBlIiwgImltYWdlLyJdLCB7OiJ4LWFtei1tZXRhLXV1aWQiPT4iMTQzNjUxMjM2NTEyNzQifSwgezoieC1hbXotc2VydmVyLXNpZGUtZW5jcnlwdGlvbiI9PiJBRVMyNTYifSwgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sIHs6IngtYW16LWNyZWRlbnRpYWwiPT4iQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LCB7OiJ4LWFtei1hbGdvcml0aG0iPT4iQVdTNC1ITUFDLVNIQTI1NiJ9LCB7OiJ4LWFtei1kYXRlIj0+IjIwMTUxMjI5VDAwMDAwMFoifV19

Als ich https://www.base64encode.org/ verwendet, gibt sie genau das, was zu erwarten ist. Ich habe den Erwartungswert von http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

genommen Habe ich es richtig gemacht?

+1

Der Wert, den Sie erwarten, ist die base64-Codierung eines JSON-ähnlichen Strings mit neuen Zeilen. Aber 'to_s' auf Hash gibt Ihnen nicht die gleiche Zeichenkette, daher gibt es eine Abweichung in der Ausgabe. –

Antwort

1

Ihre policy eine String-Darstellung Ihrer Hash in einer einzigen Zeile wie so gilt:

{: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"}]} 

Die "erwarteten" base64 stellt Ihre Hash formated:

{ "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" } 
    ] 
} 

So wird alles funktioniert nur fein.

+1

Ich würde nicht sagen "funktioniert gut," da die entschiedene Base64 gültige JSON sein muss. –

+0

Nun, das ist eine Frage von "policy.to_json" und Sie erhalten eine gültige JSON-Repräsentation des Hashs. Mein Fehler, ich hätte das zu meiner Antwort hinzugefügt (+1). – Uzbekjon

+0

PS. Mit "gut funktionieren" meinte ich, dass diese beiden Strings unterschiedlich sind, also muss auch die base64-Darstellung anders sein. Also, alles funktioniert gut, so wie es sollte. – Uzbekjon

3

Sie erwarten eine hübsche JSON-Zeichenfolge, aber Sie erhalten einen Ruby-Hash. Dies ist näher an, was Sie wollen:

Base64.encode64(JSON.dump(policy)) 

Es ist nicht genau das gleiche, nicht Byte für Byte, sollte aber die Arbeit machen.

Wenn Sie die Ausgabe genau gleich bekommen müssen, müssen Sie mit JSON-Formatierung umgehen, obwohl der JSON Daten identisch ist.

+0

Wie wird das '{' codiert? Unterstützt Base64 dieses Zeichen nicht? – Jwan622

+0

@ Jwan622 Vermutlich als Base64, wobei '{}' als 'e30' codiert. In der Base64 * -Ausgabe * sollten keine tatsächlichen '{' - Zeichen erscheinen, Sie sind genau da, aber die Eingabe ist beliebig, nur binary Bytes, soweit es Base64 betrifft. – tadman

+0

Ich vermute, dass ich etwas falsch verstehe, wenn es darum geht, Zeichen in base64 zu konvertieren. Wie kommt es, dass '{' in Base64-Zeichen e30 umgewandelt wird? – Jwan622

Verwandte Themen