Aws-cli: aws kms μ•”ν˜Έ 해독 InvalidCiphertextException 였λ₯˜

에 λ§Œλ“  2014λ…„ 12μ›” 05일  Β·  27μ½”λ©˜νŠΈ  Β·  좜처: aws/aws-cli

였늘 awscli 버전 1.6.6으둜 μ—…κ·Έλ ˆμ΄λ“œν–ˆμœΌλ©° aws kms μ•”ν˜Έ 해독이 μ•”ν˜Έ 해독에 μ‹€νŒ¨ν•˜κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€. 1.6.5μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€.

$> aws --version
aws-cli/1.6.6 Python/2.7.6 Darwin/13.4.0

$> python -V
Python 2.7.6

$> aws kms encrypt --key-id REDACTED --plaintext foo 
{
    "KeyId": "arn:aws:kms:us-east-1:REDACTED:key/REDACTED", 
    "CiphertextBlob": "CiDdiD7jljnCzXlfZUp27Y4LDY+QJa2Zqcw/7+ihfBDo7hKKAQEBAgB43Yg+45Y5ws15X2VKdu2OCw2PkCWtmanMP+/ooXwQ6O4AAABhMF8GCSqGSIb3DQEHBqBSMFACAQAwSwYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAwVt2CzbGDR2nUwszQCARCAHgdJ4aHQ4i7TMzBN6XlKcC73oilECgep+basamtnXQ=="
}

$> aws kms decrypt --ciphertext-blob CiDdiD7jljnCzXlfZUp27Y4LDY+QJa2Zqcw/7+ihfBDo7hKKAQEBAgB43Yg+45Y5ws15X2VKdu2OCw2PkCWtmanMP+/ooXwQ6O4AAABhMF8GCSqGSIb3DQEHBqBSMFACAQAwSwYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAwVt2CzbGDR2nUwszQCARCAHgdJ4aHQ4i7TMzBN6XlKcC73oilECgep+basamtnXQ==

A client error (InvalidCiphertextException) occurred when calling the Decrypt operation: None

$> pip freeze                                       
Babel==1.3
Fabric==1.10.0
Jinja2==2.7.3
MarkupSafe==0.23
Pillow==2.6.1
PyChef==0.2.3
PyYAML==3.11
Pygments==2.0.1
Sphinx==1.2.3
argparse==1.2.1
astroid==1.2.1
awscli==1.6.6
bcdoc==0.12.2
binaryornot==0.3.0
boto==2.34.0
botocore==0.77.0
box.py==1.2.8
cffi==0.8.6
cliff==1.8.0
cmd2==0.6.7
colorama==0.2.5
cookiecutter==0.8.0
coverage==3.7.1
cryptography==0.6.1
decorator==3.4.0
docutils==0.12
dogapi==1.8.5
ecdsa==0.11
futures==2.2.0
httplib2==0.9
httpretty==0.8.3
iso8601==0.1.10
jmespath==0.5.0
jsonpatch==1.9
jsonpointer==1.5
jsonschema==2.4.0
kazoo==2.0
keyring==4.0
logilab-common==0.63.0
lxml==3.4.0
mock==1.0.1
mockito==0.5.2
netaddr==0.7.12
nose==1.3.4
numpy==1.9.1
oath==1.2
oslo.config==1.4.0
oslo.i18n==1.0.0
oslo.serialization==1.0.0
oslo.utils==1.0.0
paramiko==1.15.1
pbr==0.10.0
prettytable==0.7.2
pyOpenSSL==0.14
pyasn1==0.1.7
pycparser==2.10
pycrypto==2.6.1
pylint==1.3.1
pyparsing==2.0.3
python-ceilometerclient==1.0.12
python-cinderclient==1.1.1
python-dateutil==2.3
python-glanceclient==0.14.2
python-heatclient==0.2.12
python-keystoneclient==0.11.2
python-neutronclient==2.3.9
python-novaclient==2.20.0
python-openstackclient==0.4.1
python-swiftclient==2.3.1
python-troveclient==1.0.7
pytz==2014.9
qrcode==5.1
requests==2.4.3
rsa==3.1.2
scipy==0.14.0
simplejson==3.6.5
six==1.8.0
stevedore==1.1.0
urllib3==1.9.1
virtualenv==1.11.6
warlock==1.1.0
wsgiref==0.1.2

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‚˜μ€‘μ— 이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” μ‚¬λžŒλ“€μ„ μœ„ν•΄ μ•”ν˜Έλ¬Έμ„ νŒŒμΌμ— μ €μž₯ν•˜μ§€ μ•Šκ³  _이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ €λ©΄ λ‹€μŒμ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

aws kms decrypt --ciphertext-blob fileb://<(echo 'ciphertext' | base64 -d)

μ°Έκ³ : μ•„λž˜ @hauntingEchoμ—μ„œ μ§€μ ν•œ λŒ€λ‘œ <(cmd) λŠ” POSIX와 ν˜Έν™˜λ˜μ§€ μ•ŠμœΌλ―€λ‘œ sh λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 μž‘λ™ν•˜μ§€ μ•Šμ§€λ§Œ bash 및 zsh 잘 μž‘λ™ν•©λ‹ˆλ‹€.

λͺ¨λ“  27 λŒ“κΈ€

무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€μ— λŒ€ν•œ μ•½κ°„μ˜ λ°°κ²½ 정보:

1.6.6 μ—μ„œ 이전에 μΈμ½”λ”©ν–ˆλ˜ "blob" μœ ν˜•μ„ base64둜 μΈμ½”λ”©ν•˜μ§€ μ•ŠλŠ” νšŒκ·€ λ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. 결과적으둜 이제 "blob" μœ ν˜•μœΌλ‘œ ν‘œμ‹œλœ λ§€κ°œλ³€μˆ˜μ— λŒ€ν•΄ μ›μ‹œ 이진 λ°”μ΄νŠΈλ₯Ό 지정해야 ν•˜λ©° λ‚΄λΆ€μ μœΌλ‘œ μžλ™μœΌλ‘œ base64 μΈμ½”λ”©ν•©λ‹ˆλ‹€. 즉, 왕볡 ν‚€ μ•”ν˜Έν™”λ₯Ό μœ„ν•΄μ„œλŠ” λ¨Όμ € base64λ₯Ό λ””μ½”λ”©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

$ aws kms encrypt --key-id <key-id> --plaintext "abcd" --query CiphertextBlob --output text | base64 -D > /tmp/encrypted-file
$ echo "Decrypted: $(aws kms decrypt --ciphertext-blob fileb:///tmp/encrypted-file --query Plaintext --output text | base64 -D)"
Decrypted: abcd

이 μ˜ˆμ—μ„œλŠ” λ°”μ΄λ„ˆλ¦¬ μ½˜ν…μΈ κ°€ ν¬ν•¨λœ 파일이기 λ•Œλ¬Έμ— fileb:// 접두사도 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” κ·Έ 행동이 κ·ΈλŒ€λ‘œ μœ μ§€λ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 이 초기 문제의 λ™μž‘μ΄ 1.6.6μ—μ„œ μˆ˜μ •λœ 1.6.5의 νšŒκ·€μ— μ˜μ‘΄ν•œλ‹€λŠ” 점을 κ°μ•ˆν•  λ•Œ κΈ°μ‘΄ λ™μž‘μ„ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μœ„μ˜ 예제 μŠ€λ‹ˆνŽ«μ€ AWS CLIμ—μ„œ 이진 μž…λ ₯/좜λ ₯을 μ²˜λ¦¬ν•˜λŠ” 데 μ˜ˆμƒλ˜λŠ” 방법이며 졜근 νšŒκ·€λ₯Ό μ œμ™Έν•˜κ³  이 λ™μž‘μ΄ 항상 κ·Έλž˜μ™”λ˜ λ°©μ‹μž…λ‹ˆλ‹€.

μ—…λ°μ΄νŠΈν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

사싀, 이제 문제 #1001κ³Ό μœ μ‚¬ν•œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

$> aws kms encrypt --key-id $KMS_KEY_ID --plaintext "abcd" --query CiphertextBlob --output text | base64 -D > /tmp/encrypted-file

$> echo "Decrypted: $(aws kms decrypt --ciphertext-blob fileb:///tmp/encrypted-file --query Plaintext --output text | base64 -D)"

'ascii' codec can't decode byte 0xdd in position 2: ordinal not in range(128)
Decrypted: 

@mtougeron μ–΄λ–€ λ²„μ „μ˜ AWS CLIλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? 방금 μ΅œμ‹  λ²„μ „μ˜ AWS CLI(1.6.8)μ—μ„œ λ‹€μ‹œ μ‹œλ„ν–ˆμ§€λ§Œ 이 λ¬Έμ œκ°€ ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

~ $ aws kms encrypt --key-id $AWS_KEY_ID --plaintext "abcd" --query CiphertextBlob --output text | base64 -D > /tmp/encrypted-file
~ $ hexdump -C /tmp/encrypted-file
00000000  0a 20 e1 68 92 dc 42 40  fe 07 80 ca f6 54 1c 68  |. [email protected]|
00000010  e2 45 80 bb c3 e0 2a 2f  91 50 7c ac c3 02 9b c9  |.E....*/.P|.....|
00000020  a8 b3 12 8b 01 01 01 02  00 78 e1 68 92 dc 42 40  |.........x.h..B@|
00000030  fe 07 80 ca f6 54 1c 68  e2 45 80 bb c3 e0 2a 2f  |.....T.h.E....*/|
00000040  91 50 7c ac c3 02 9b c9  a8 b3 00 00 00 62 30 60  |.P|..........b0`|
00000050  06 09 2a 86 48 86 f7 0d  01 07 06 a0 53 30 51 02  |..*.H.......S0Q.|
00000060  01 00 30 4c 06 09 2a 86  48 86 f7 0d 01 07 01 30  |..0L..*.H......0|
00000070  1e 06 09 60 86 48 01 65  03 04 01 2e 30 11 04 0c  |...`.H.e....0...|
00000080  41 de f2 2a a6 c5 38 ef  8a 52 54 92 02 01 10 80  |A..*..8..RT.....|
00000090  1f 2e 01 90 65 7a 21 8c  dd 05 e4 4d 09 64 85 c4  |....ez!....M.d..|
000000a0  33 e3 3d e9 ce 33 6b e9  00 93 ec e5 54 33 8b 3b  |3.=..3k.....T3.;|
000000b0
~ $ echo "Decrypted: $(aws kms decrypt --ciphertext-blob fileb:///tmp/encrypted-file --query Plaintext --output text | base64 -D)"
Decrypted: abcd
~ $ aws --version
aws-cli/1.6.8 Python/2.7.7 Darwin/13.4.0

@jamesls 이제 1.6.8μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€. 감사 ν•΄μš”

@jamesls 개인적으둜 이것은 맀우 λ‚˜μœ UI라고 μƒκ°ν•©λ‹ˆλ‹€. μ•”ν˜Έν™”μ—μ„œ 얻은 것과 λ™μΌν•œ μ•”ν˜Έλ¬Έμ„ μ•”ν˜Έ 해독에 전달할 수 μ—†μŠ΅λ‹ˆκΉŒ? κΈ°μ‘΄ 고객을 κΉ¨κ³  싢지 μ•Šμ•„ λ³€κ²½ν•  수 μ—†λ‹€λ©΄ 적어도 더 λ‚˜μ€ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό μ œκ³΅ν•˜μ‹­μ‹œμ˜€.

A client error (InvalidCiphertextException) occurred when calling the Decrypt operation: None

문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 무엇을 ν•΄μ•Ό ν•˜λŠ”μ§€ μ›κ²©μœΌλ‘œ μ•Œλ €μ£Όμ§€λ„ μ•ŠμŠ΅λ‹ˆλ‹€. μ•”ν˜Έκ°€ Base64일 κ°€λŠ₯성이 μžˆμŒμ„ κ°μ§€ν•˜κ³  더 λ‚˜μ€ 였λ₯˜λ₯Ό 좜λ ₯ν•˜κ³  URL 등을 가리킬 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λ‹ˆλ©΄ decrypt 에 μΆ”κ°€ ν”Œλž˜κ·Έλ₯Ό μ „λ‹¬ν•˜μ—¬ "이것을 λ¨Όμ € base64μ—μ„œ λ””μ½”λ”©ν•˜μ‹­μ‹œμ˜€"라고 λ§ν•˜λŠ” 것이 μ–΄λ–»μŠ΅λ‹ˆκΉŒ?

λ‚˜μ€‘μ— 이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” μ‚¬λžŒλ“€μ„ μœ„ν•΄ μ•”ν˜Έλ¬Έμ„ νŒŒμΌμ— μ €μž₯ν•˜μ§€ μ•Šκ³  _이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ €λ©΄ λ‹€μŒμ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

aws kms decrypt --ciphertext-blob fileb://<(echo 'ciphertext' | base64 -d)

μ°Έκ³ : μ•„λž˜ @hauntingEchoμ—μ„œ μ§€μ ν•œ λŒ€λ‘œ <(cmd) λŠ” POSIX와 ν˜Έν™˜λ˜μ§€ μ•ŠμœΌλ―€λ‘œ sh λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 μž‘λ™ν•˜μ§€ μ•Šμ§€λ§Œ bash 및 zsh 잘 μž‘λ™ν•©λ‹ˆλ‹€.

Re: @thegranddesign 의 의견 , OS Xμ—μ„œλŠ” μ΅œμ†Œν•œ base64 λŒ€λ¬Έμž 'D'λ₯Ό μ‚¬μš©ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. 예:

$ echo "Decrypted: $(aws kms decrypt --ciphertext-blob fileb://<(echo $ENCRYPTED_DATA | base64 -D) --query Plaintext --output text | base64 -D)"

Decrypted: Hello world!

( Decrypted ν–‰ μ•žμ— κ°œν–‰ λ¬Έμžκ°€ ν‘œμ‹œλ˜λŠ” μ΄μœ λŠ” ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ 큰 λ¬Έμ œλŠ” μ•„λ‹™λ‹ˆλ‹€.)

이것은 λ‚˜λ₯Ό μœ„ν•΄ μΌν–ˆμŠ΅λ‹ˆλ‹€.

#encrypt the password: TestReadWrite text in the test.txt file
aws kms encrypt --key-id cfc7acf7-4f20-49c3-aa11-8be4cdc3291d --plaintext fileb://test.txt --output text | base64 --decode > out.txt

#decrypt the password: TestReadWrite
aws kms decrypt  --ciphertext-blob fileb://out.txt --output text --query Plaintext | base64 --decode

λΉ„μŠ·ν•œ λ¬Έμ œκ°€ μžˆμ—ˆμ§€λ§Œ Nodeκ°€ λ„μ›€μ΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

'use strict';

const KMS = require('aws-sdk').KMS;
const fs = require('fs');

const kms = new KMS({
  apiVersion: '2014-11-01',
  // region: 'eu-west-1'
});

function encrypt(params) {
  return kms.encrypt(params).promise();
}

const arn = 'arn:aws:kms:xxx';

encrypt({
  KeyId: arn,
  Plaintext: fs.readFileSync('/path/to/key.pem')
})
.then(data => fs.writeFileSync('/path/to/key.json', JSON.stringify(data)));

@thegranddesign 의 μ†”λ£¨μ…˜μ— λŒ€ν•œ 또 λ‹€λ₯Έ μ°Έκ³  사항 - <(cmd) λŠ” POSIX와 ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” bashismμ΄λ―€λ‘œ bashκ°€ μ˜΅μ…˜μ΄ μ•„λ‹Œ 경우 λ‹€λ₯Έ μ†”λ£¨μ…˜μ„ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이것은 μ‹€μ œλ‘œ μˆ˜μ •λ  λ•ŒκΉŒμ§€ μ—¬μ „νžˆ μ—΄λ € μžˆμ–΄μ•Ό ν•˜λŠ” 정신이 μ•„μ°”ν•  μ •λ„λ‘œ λ©μ²­ν•œ λ²„κ·Έμž…λ‹ˆλ‹€. 좜λ ₯에 ν•˜λ‚˜μ˜ ν˜•μ‹μ„ μ‚¬μš©ν•˜κ³  μž…λ ₯에 μ™„μ „νžˆ λ‹€λ₯Έ(ν˜Έν™˜λ˜μ§€ μ•ŠλŠ”) ν˜•μ‹μ„ μ‚¬μš©ν•˜λŠ” λŒ€μΉ­ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 도ꡬλ₯Ό λΉŒλ“œν•˜λŠ” 것은 κ±°λŒ€ν•œ μ•ˆν‹° νŒ¨ν„΄μž…λ‹ˆλ‹€. 자체 좜λ ₯을 μž…λ ₯으둜 μ‚¬μš©ν•  수 μ—†λŠ” λŒ€μΉ­ λ„κ΅¬λŠ” BROKENμž…λ‹ˆλ‹€. λ‚˜λŠ” 그것이 μ‹€μ œλ‘œ μ˜λ„ν•œ λŒ€λ‘œ μž‘λ™ν•˜λŠ”μ§€ μƒκ΄€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그것은 μ—¬μ „νžˆ ​​깨져 μžˆμŠ΅λ‹ˆλ‹€. 이 λ„κ΅¬λŠ” μ›μ‹œ 이진 μž…λ ₯에 μ’…μ†λœ 경우 기본적으둜 μ›μ‹œ 이진 좜λ ₯을 생성해야 ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ λͺ…μ‹œμ μΈ base64 λ””μ½”λ”© 단계 λ˜λŠ” μ§€μ •λ˜μ§€ μ•Šμ€ 특수 λ§€κ°œλ³€μˆ˜λ₯Ό μ§€μ •ν•˜μ§€ μ•Šκ³  μƒμ„±λœ base64 인코딩 μž…λ ₯을 μ‚¬μš©ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ ν•΄λ‹Ή 좜λ ₯을 μƒμ„±ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•©λ‹ˆλ‹€(λ˜λŠ” λ™μΌν•œ μ •ν™•ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우 μ•ˆν‹° λ§€κ°œλ³€μˆ˜). aws kms encryptλ₯Ό μ‚¬μš©ν•˜μ—¬ base64 인코딩 쀑 μ–΄λŠ ν•˜λ‚˜λ₯Ό μ§€μ •ν•˜μ§€ μ•Šκ³  base64 μΈμ½”λ”©λœ μ•”ν˜Έν™” νŽ˜μ΄λ‘œλ“œμ˜ base64 μΈμ½”λ”©λœ 좜λ ₯을 생성할 수 μžˆλ‹€λŠ” 것은 ν„°λ¬΄λ‹ˆμ—†λŠ” μΌμž…λ‹ˆλ‹€. μ²˜μŒμ— λ‚΄κ°€ μ œκ³΅ν•œ μ–‘μ‹μœΌλ‘œ λ˜λŒλ¦½λ‹ˆλ‹€. κ·Έλ ‡κ²Œ ν•˜λ €λ©΄ μ•”ν˜Έν™” 및 μ•”ν˜Έ 해독 ν•˜μœ„ λͺ…λ Ή μˆ˜μ€€μ—μ„œλ„ λ¬Έμ„œν™”λ˜μ§€ μ•Šμ€ λͺ…령쀄 λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— νŒŒμ•…ν•˜κΈ°κ°€ 훨씬 더 μ–΄λ ΅μŠ΅λ‹ˆλ‹€. μ‚¬μš©μžλŠ” λˆ„κ΅°κ°€κ°€ μ•”ν˜Έν™”/λ³΅ν˜Έν™” ν΄λΌμ΄μ–ΈνŠΈλ‘œ μˆ˜ν–‰ν•  수 μžˆλŠ” κ°€μž₯ λͺ…λ°±ν•œ 단일 μž‘μ—…(λͺ…령쀄 λ§€κ°œλ³€μˆ˜μ— μ§€μ •λœ λ¬Έμžμ—΄μ„ μ•”ν˜Έν™”ν•œ λ‹€μŒ μ•”ν˜Έ ν•΄λ…ν•˜λŠ” 방법)을 μˆ˜ν–‰ν•˜λŠ” 방법을 μ•Œμ•„λ‚΄λŠλΌ μ‹œκ°„μ„ λ‚­λΉ„ν•  수 밖에 μ—†μŠ΅λ‹ˆλ‹€. 두 ν•˜μœ„ λͺ…령이 λŒ€μΉ­μ μ΄μ–΄μ•Ό ν•œλ‹€λŠ” 사싀에도 λΆˆκ΅¬ν•˜κ³  좜λ ₯이 μž…λ ₯κ³Ό ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” μž‘λ™ λͺ¨λ“œκ°€ μ†μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€. μˆ˜μ •ν•˜μ§€ μ•Šκ³  λ‹«λŠ” 것은 μ‚¬μš©μ„±μ΄λ‚˜ 개발자 νš¨μœ¨μ„±μ— λŒ€ν•΄ μ „ν˜€ κ±±μ •ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 또 λ‹€λ₯Έ κ²½λ‘œλŠ”(λͺ‡ λ…„ 전에 @thegranddesign이 μ–ΈκΈ‰ν•œ κ²ƒμ²˜λŸΌ μƒˆ ν”Œλž˜κ·Έμ™€ λ°˜λŒ€) / κ°€ μœ νš¨ν•œ base64 λ¬Έμžκ°€ μ•„λ‹ˆλ©° json에 이진 데이터λ₯Ό μ§€μ •ν•˜λŠ” μœ νš¨ν•œ 방법이 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ:

  • ciphertext-blob λ§€κ°œλ³€μˆ˜κ°€ μœ νš¨ν•œ base-64인 경우 base-64둜 μ „λ‹¬ν•©λ‹ˆλ‹€.
  • ciphertext-blob λ§€κ°œλ³€μˆ˜μ— / κ°€ ν¬ν•¨λ˜μ–΄ 있으면 경둜둜 ꡬ문 λΆ„μ„ν•©λ‹ˆλ‹€. fileb:// λŠ” ν˜„μž¬ λ™μž‘μ„ μˆ˜ν–‰ν•˜κ³  있으며 file:// λŠ” b64둜 인코딩될 수 μžˆμŠ΅λ‹ˆλ‹€.

@sgendler-stem에 λ™μ˜ν–ˆμŠ΅λ‹ˆλ‹€. 이 티켓은 KMSλ₯Ό μ‚¬μš©ν•˜λŠ” λ‚΄κ°€ μž‘μ—…ν•œ λͺ¨λ“  ν”„λ‘œμ νŠΈμ— μ—°κ²°λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ°Έμ—¬ν•˜λ €λŠ” μ‚¬λžŒμ—κ²ŒλŠ” 항상 λ¬Έμ œκ°€ 되기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

이것은 μ‹€μ œλ‘œ μˆ˜μ •λ  λ•ŒκΉŒμ§€ μ—¬μ „νžˆ μ—΄λ € μžˆμ–΄μ•Ό ν•˜λŠ” 정신이 μ•„μ°”ν•  μ •λ„λ‘œ λ©μ²­ν•œ λ²„κ·Έμž…λ‹ˆλ‹€. 좜λ ₯에 ν•˜λ‚˜μ˜ ν˜•μ‹μ„ μ‚¬μš©ν•˜κ³  μž…λ ₯에 μ™„μ „νžˆ λ‹€λ₯Έ(ν˜Έν™˜λ˜μ§€ μ•ŠλŠ”) ν˜•μ‹μ„ μ‚¬μš©ν•˜λŠ” λŒ€μΉ­ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 도ꡬλ₯Ό λΉŒλ“œν•˜λŠ” 것은 κ±°λŒ€ν•œ μ•ˆν‹° νŒ¨ν„΄μž…λ‹ˆλ‹€. 자체 좜λ ₯을 μž…λ ₯으둜 μ‚¬μš©ν•  수 μ—†λŠ” λŒ€μΉ­ λ„κ΅¬λŠ” BROKENμž…λ‹ˆλ‹€. λ‚˜λŠ” 그것이 μ‹€μ œλ‘œ μ˜λ„ν•œ λŒ€λ‘œ μž‘λ™ν•˜λŠ”μ§€ μƒκ΄€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그것은 μ—¬μ „νžˆ ​​깨져 μžˆμŠ΅λ‹ˆλ‹€. 이 λ„κ΅¬λŠ” μ›μ‹œ 이진 μž…λ ₯에 μ’…μ†λœ 경우 기본적으둜 μ›μ‹œ 이진 좜λ ₯을 생성해야 ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ λͺ…μ‹œμ μΈ base64 λ””μ½”λ”© 단계 λ˜λŠ” μ§€μ •λ˜μ§€ μ•Šμ€ 특수 λ§€κ°œλ³€μˆ˜λ₯Ό μ§€μ •ν•˜μ§€ μ•Šκ³  μƒμ„±λœ base64 인코딩 μž…λ ₯을 μ‚¬μš©ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ ν•΄λ‹Ή 좜λ ₯을 μƒμ„±ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•©λ‹ˆλ‹€(λ˜λŠ” λ™μΌν•œ μ •ν™•ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우 μ•ˆν‹° λ§€κ°œλ³€μˆ˜). aws kms encryptλ₯Ό μ‚¬μš©ν•˜μ—¬ base64 인코딩 쀑 μ–΄λŠ ν•˜λ‚˜λ₯Ό μ§€μ •ν•˜μ§€ μ•Šκ³  base64 μΈμ½”λ”©λœ μ•”ν˜Έν™” νŽ˜μ΄λ‘œλ“œμ˜ base64 μΈμ½”λ”©λœ 좜λ ₯을 생성할 수 μžˆλ‹€λŠ” 것은 ν„°λ¬΄λ‹ˆμ—†λŠ” μΌμž…λ‹ˆλ‹€. μ²˜μŒμ— λ‚΄κ°€ μ œκ³΅ν•œ μ–‘μ‹μœΌλ‘œ λ˜λŒλ¦½λ‹ˆλ‹€. κ·Έλ ‡κ²Œ ν•˜λ €λ©΄ μ•”ν˜Έν™” 및 μ•”ν˜Έ 해독 ν•˜μœ„ λͺ…λ Ή μˆ˜μ€€μ—μ„œλ„ λ¬Έμ„œν™”λ˜μ§€ μ•Šμ€ λͺ…령쀄 λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— νŒŒμ•…ν•˜κΈ°κ°€ 훨씬 더 μ–΄λ ΅μŠ΅λ‹ˆλ‹€. μ‚¬μš©μžλŠ” λˆ„κ΅°κ°€κ°€ μ•”ν˜Έν™”/λ³΅ν˜Έν™” ν΄λΌμ΄μ–ΈνŠΈλ‘œ μˆ˜ν–‰ν•  수 μžˆλŠ” κ°€μž₯ λͺ…λ°±ν•œ 단일 μž‘μ—…(λͺ…령쀄 λ§€κ°œλ³€μˆ˜μ— μ§€μ •λœ λ¬Έμžμ—΄μ„ μ•”ν˜Έν™”ν•œ λ‹€μŒ μ•”ν˜Έ ν•΄λ…ν•˜λŠ” 방법)을 μˆ˜ν–‰ν•˜λŠ” 방법을 μ•Œμ•„λ‚΄λŠλΌ μ‹œκ°„μ„ λ‚­λΉ„ν•  수 밖에 μ—†μŠ΅λ‹ˆλ‹€. 두 ν•˜μœ„ λͺ…령이 λŒ€μΉ­μ μ΄μ–΄μ•Ό ν•œλ‹€λŠ” 사싀에도 λΆˆκ΅¬ν•˜κ³  좜λ ₯이 μž…λ ₯κ³Ό ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” μž‘λ™ λͺ¨λ“œκ°€ μ†μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€. μˆ˜μ •ν•˜μ§€ μ•Šκ³  λ‹«λŠ” 것은 μ‚¬μš©μ„±μ΄λ‚˜ 개발자 νš¨μœ¨μ„±μ— λŒ€ν•΄ μ „ν˜€ κ±±μ •ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

λ‚˜λŠ” @sgendler-stem에 μ™„μ „νžˆ λ™μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ½”λ“œκ°€ 좜λ ₯을 μƒμ„±ν•œλ‹€λ©΄ 적어도 그것을 μž…λ ₯으둜 받아듀일 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ κ·Έ μ΄μƒμ˜ 것이 μžˆμŠ΅λ‹ˆλ‹€. SDKλ₯Ό 톡해 μ•”ν˜Έν™”κ°€ μ™„λ£Œλœ 경우 - μ•”ν˜Έν™”λœ 파일 끝에 μ΄μƒν•œ arn λ₯Ό μΆ”κ°€ν•˜λ©΄ base64 κ°€ arn μ œκ±°ν•œ 후에도 CLIμ—μ„œ μ•”ν˜Έλ₯Ό 해독할 수 μ—†μŠ΅λ‹ˆλ‹€. URL. 이것은 κ·Έλƒ₯ κΉ¨μ‘ŒμŠ΅λ‹ˆλ‹€ .

λ‹€μ‹œ λ™μ˜ν–ˆμŠ΅λ‹ˆλ‹€. 이둜 인해 λΆˆν•„μš”ν•˜κ²Œ μ‹€λ§μŠ€λŸ¬μš΄ 상황이 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

이것은 μ‹€μ œλ‘œ λ‹«ν˜€ μžˆμŠ΅λ‹ˆκΉŒ? μ™œμš”? 이 μ˜€ν”ˆν•œμ§€ 4년이 μ§€λ‚¬λ‹€λŠ” 것이 믿기지 μ•Šκ³  μœ μΌν•œ ν”Όλ“œλ°±μ€ λˆ„κ΅°κ°€ "μ˜λ„ν•œ λŒ€λ‘œ μž‘λ™ν•œλ‹€"κ³  λ§ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μ•„λ‹ˆ λΉŒμ–΄λ¨Ήμ„; @sgendler-stem이 λŒ€μƒμ— λ§žμŠ΅λ‹ˆλ‹€. 이것은 μ™„μ „νžˆ λ§κ°€μ‘ŒμŠ΅λ‹ˆλ‹€. λ‹΄λ‹Ή νŒ€μ΄ μŠ€μŠ€λ‘œμ— λŒ€ν•΄ 기뢄이 쒋지 μ•ŠκΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

λ™μΌν•œ μ˜ˆμ™Έμ— 직면:
botocore.errorfactory.InvalidCiphertextException: μ•”ν˜Έ 해독 μž‘μ—…μ„ ν˜ΈμΆœν•  λ•Œ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€(InvalidCiphertextException).

μ‚¬μš© 된:
ν‚€ = b64decode(ν‚€)
응닡 = client.decrypt(
CiphertextBlob=ν‚€
)

encrypt , generate-data-key λ“±μ˜ 좜λ ₯이 CiphertextBlob ν•„λ“œλ₯Ό ν˜ΈμΆœν•˜μ§€ μ•ŠμœΌλ©΄ 이것이 κ·Έλ ‡κ²Œ μ‹€λ§μŠ€λŸ½μ§€ μ•Šμ„ 것이라고 μƒκ°ν•©λ‹ˆλ‹€. 에 μž…λ ₯ν•˜λ©΄ decrypt 라고도 --ciphertext-blob ,이 μ•”ν˜Έλ¬Έ 방울 μš”κ΅¬ λ‹€λ₯΄κ²Œ 인코딩 ν•  것을 μ² μ €ν•˜κ²Œ 직관적이닀.

decrypt λŒ€ν•œ ν”Œλž˜κ·Έμ˜ 이름이 λ‹€λ₯Έ 경우 인코딩이 λ‹€λ₯΄λ‹€λŠ” νžŒνŠΈκ°€ λ©λ‹ˆλ‹€.

μ—¬κΈ° https://github.com/aws/aws-cli/issues/2063 μ—μ„œ 해독할 base64 인코딩 μž…λ ₯에 λŒ€ν•œ κΈ°λŠ₯ μ œμ•ˆμ΄

@μ˜€μ§€νƒ€

λ³΅ν˜Έν™”ν•˜λŠ” λ™μ•ˆ key-idλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— kmsλŠ” λ³΅ν˜Έν™”μ— μ‚¬μš©ν•  μ•”ν˜Έν™” ν‚€λ₯Ό μ–΄λ–»κ²Œ μ•Œ 수 μžˆμŠ΅λ‹ˆκΉŒ?

@arpit728 λ°˜ν™˜λœ CipherTextBlob은 νŠΉμ • CMK의 KeyID에 λŒ€ν•΄ ꡬ체적이라고 μƒκ°ν•©λ‹ˆλ‹€.

λ¬Έμ œκ°€ 해결될 λ•ŒκΉŒμ§€ 이 티켓을 λ‹€μ‹œ μ—΄μ–΄μ£Όμ„Έμš”!

이 티켓을 찾을 λ•ŒκΉŒμ§€ μ΄κ²ƒμœΌλ‘œ λ„ˆλ¬΄ λ§Žμ€ μ‹œκ°„μ„ λ†€μ•˜μŠ΅λ‹ˆλ‹€. μ•”ν˜Έν™”μ™€ μ•”ν˜Έ 해독 간에 μ •ν™•νžˆ μ–΄λ–»κ²Œ μ½”λ”©λ˜κ³  λ³€ν™˜λ˜μ–΄μ•Ό ν•˜λŠ”μ§€ λͺ…μ‹œν•œ 곡식 λ¬Έμ„œκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€μ— λŒ€ν•œ μ•½κ°„μ˜ λ°°κ²½ 정보:

1.6.6 μ—μ„œ 이전에 μΈμ½”λ”©ν–ˆλ˜ "blob" μœ ν˜•μ„ base64둜 μΈμ½”λ”©ν•˜μ§€ μ•ŠλŠ” νšŒκ·€ λ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. 결과적으둜 이제 "blob" μœ ν˜•μœΌλ‘œ ν‘œμ‹œλœ λ§€κ°œλ³€μˆ˜μ— λŒ€ν•΄ μ›μ‹œ 이진 λ°”μ΄νŠΈλ₯Ό 지정해야 ν•˜λ©° λ‚΄λΆ€μ μœΌλ‘œ μžλ™μœΌλ‘œ base64 μΈμ½”λ”©ν•©λ‹ˆλ‹€. 즉, 왕볡 ν‚€ μ•”ν˜Έν™”λ₯Ό μœ„ν•΄μ„œλŠ” λ¨Όμ € base64λ₯Ό λ””μ½”λ”©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

$ aws kms encrypt --key-id <key-id> --plaintext "abcd" --query CiphertextBlob --output text | base64 -D > /tmp/encrypted-file
$ echo "Decrypted: $(aws kms decrypt --ciphertext-blob fileb:///tmp/encrypted-file --query Plaintext --output text | base64 -D)"
Decrypted: abcd

이 μ˜ˆμ—μ„œλŠ” λ°”μ΄λ„ˆλ¦¬ μ½˜ν…μΈ κ°€ ν¬ν•¨λœ 파일이기 λ•Œλ¬Έμ— fileb:// 접두사도 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

이 μ˜ˆμ—μ„œλŠ” λ‹€μŒμ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.

Decrypt μž‘μ—…μ„ ν˜ΈμΆœν•  λ•Œ 였λ₯˜(InvalidCiphertextException)κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
λ³΅ν˜Έν™”:

`aws kms encrypt --key-id arn:aws:kms:eu-west-1werwerwjl:key/xxxyyyy --plaintext "abcd" --query CiphertextBlob --좜λ ₯ ν…μŠ€νŠΈ | base64 -d > ./μ•”ν˜Έν™”λœ 파일

echo "μ•”ν˜Έ 해독됨: $(aws kms 해독 --ciphertext-blob fileb:./encrypted-file --query 일반 ν…μŠ€νŠΈ --좜λ ₯ ν…μŠ€νŠΈ | base64 --decode)"
`
μš°λΆ„νˆ¬λ‘œ μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€. λˆ„κ΅¬λ“ μ§€ λͺ…ν™•ν•œ λ¬Έμ„œλ‚˜ 예제(μ‚¬μ΄νŠΈ λ˜λŠ” 무언가에 λŒ€ν•œ 링크)λ₯Ό μ•Œκ³  μžˆλ‹€λ©΄ 맀우 감사할 κ²ƒμž…λ‹ˆλ‹€!

νŽΈμ§‘: 이 λ¬Έμ„œμ˜ νŒμ„ μ‚¬μš©ν•˜μ—¬ μ•”ν˜Έν™” 및 μ•”ν˜Έ 해독 μž‘μ—…μ„ μ–»μ—ˆμŠ΅λ‹ˆλ‹€. https://dev.to/matchilling/pragmatically-storing-security-sensitive-data-using-aws-kms-5e5b

참고둜 μœ„μ˜ λ§ν¬λŠ” μž‘λ™ν•˜μ§€ μ•Šμ§€λ§Œ κΈ°μ‚¬λŠ” κ½€ μœ μš©ν•΄ 보이며 μ—¬κΈ°μ—μ„œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€ .

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰