Aws-cli: aws kms فك تشفير خطأ InvalidCiphertextException

تم إنشاؤها على ٥ ديسمبر ٢٠١٤  ·  27تعليقات  ·  مصدر: aws/aws-cli

لقد قمت بالترقية إلى الإصدار 1.6.6 من awscli اليوم وبدأ فك تشفير 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 ، أصلحنا انحدارًا لم نكن فيه من نوع ترميز base64 لأنواع "blob" التي كنا نقوم بترميزها سابقًا. نتيجة لذلك ، تحتاج الآن إلى تحديد وحدات البايت الثنائية الأولية لأي معامل تم تمييزه على أنه نوع "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.5 الذي تم إصلاحه في 1.6.6 ، فلا يمكننا تغيير السلوك الموجود مسبقًا ، حيث سيكون ذلك تغييرًا مفاجئًا للعملاء. المثال المقتطف أعلاه هو الطريقة المتوقعة للتعامل مع المدخلات / المخرجات الثنائية في 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 شخصيًا أعتقد أن هذه واجهة مستخدم سيئة للغاية. ألا تكون قادرًا على تمرير نفس النص المشفر إلى فك التشفير الذي حصلت عليه من التشفير؟ إذا لم تتمكن من تغييره لأنك لا تريد كسر العملاء الحاليين ، فعلى الأقل أعطهم رسالة خطأ أفضل.

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 تعمل بشكل جيد.

رد: تعليق thegranddesign ، على OS X على الأقل كان علي استخدام حرف "D" كبير مقابل base64 . على سبيل المثال:

$ 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) عبارة عن bashism ، وليس متوافقًا مع POSIX ، لذلك ستحتاج إلى استخدام حل آخر إذا لم يكن bash خيارًا.

هذا خطأ غبي محير للعقل يجب أن يظل مفتوحًا حتى يتم إصلاحه بالفعل. إنه أداة عملاقة مضادة للنمط لبناء أداة تؤدي عملية متماثلة تستخدم تنسيقًا واحدًا للإخراج وتنسيقًا مختلفًا تمامًا (وغير متوافق) للإدخال. الأداة المتماثلة التي لا يمكن أن تستهلك مخرجاتها كمدخلات مكسورة. لا يهمني ما إذا كان يعمل بالفعل على النحو المنشود ، فهو لا يزال معطلاً. يجب أن تقوم الأداة إما بإنشاء مخرجات ثنائية خام بشكل افتراضي إذا كانت تعتمد على إدخال ثنائي خام ، أو يجب أن تكون قادرة على استهلاك مدخلات base64 المشفرة التي تم إنشاؤها دون تحديد أي خطوات واضحة لفك تشفير base64 أو معلمات خاصة لم تكن كذلك مطلوب أيضًا من أجل إنشاء هذا الإخراج (أو مضاد بارام إذا لم يستخدم نفس المعلمة بالضبط). إنه أمر سخيف للغاية أنه يمكنني استخدام تشفير aws kms لإنشاء إخراج مشفر base64 من حمولة تشفير base64 دون تحديد أيٍّ من ترميزات base64 ، ولكن بعد ذلك يتعين عليّ فك تشفير base64 صراحةً كل من البيانات المشفرة والبيانات التي تم فك تشفيرها من أجل الحصول على يعود إلى النموذج الذي قدمته في المقام الأول. حقيقة أن القيام بذلك يتطلب أيضًا استخدام معلمات سطر الأوامر التي لم يتم توثيقها حتى على مستوى أوامر التشفير الفرعية وفك تشفيرها ، مما يجعل اكتشافها أكثر صعوبة. يضمن جميع المستخدمين إضاعة ساعات في محاولة اكتشاف كيفية القيام بأحد الأشياء الأكثر وضوحًا التي قد يرغب شخص ما في القيام بها باستخدام عميل تشفير / فك تشفير - تشفير سلسلة محددة في معلمة سطر الأوامر وفك تشفيرها - وذلك تمامًا لأن الأداة لديه وضع تشغيل معطل حيث لا تتوافق المخرجات مع المدخلات على الرغم من حقيقة أن الأمرين الفرعيين من المفترض أن يكونا متماثلين. يشير إغلاق هذا دون إصلاحه إلى أنك لا تهتم على الإطلاق بقابلية الاستخدام أو كفاءة المطور.

هناك مسار آخر لحل هذه المشكلة (على عكس العلامات الجديدة ، كما ذكر thegranddesign منذ سنوات) قد يكون أن / ليس حرف base64 صالحًا ، ولا توجد طريقة صالحة لتحديد البيانات الثنائية في json. وبالتالي:

  • إذا كانت معلمة ciphertext-blob صالحة للقاعدة 64 ، فمررها كقاعدة 64
  • إذا كانت المعلمة ciphertext-blob تحتوي على / ، قم بالتحليل كمسار. fileb:// أثناء سلوكه الحالي ، file:// يمكن ترميزه بـ b64.

تم الاتفاق مع @ sgendler-stem على الرغم من ذلك - هذه التذكرة مرتبطة بكل مشروع عملت فيه يستخدم KMS ، لأنها دائمًا مشكلة لشخص يحاول الانضمام.

هذا خطأ غبي محير للعقل يجب أن يظل مفتوحًا حتى يتم إصلاحه بالفعل. إنه أداة عملاقة مضادة للنمط لبناء أداة تؤدي عملية متماثلة تستخدم تنسيقًا واحدًا للإخراج وتنسيقًا مختلفًا تمامًا (وغير متوافق) للإدخال. الأداة المتماثلة التي لا يمكن أن تستهلك مخرجاتها كمدخلات مكسورة. لا يهمني ما إذا كان يعمل بالفعل على النحو المنشود ، فهو لا يزال معطلاً. يجب أن تقوم الأداة إما بإنشاء مخرجات ثنائية خام بشكل افتراضي إذا كانت تعتمد على إدخال ثنائي خام ، أو يجب أن تكون قادرة على استهلاك مدخلات base64 المشفرة التي تم إنشاؤها دون تحديد أي خطوات واضحة لفك تشفير base64 أو معلمات خاصة لم تكن كذلك مطلوب أيضًا من أجل إنشاء هذا الإخراج (أو مضاد بارام إذا لم يستخدم نفس المعلمة بالضبط). إنه أمر سخيف للغاية أنه يمكنني استخدام تشفير aws kms لإنشاء إخراج مشفر base64 من حمولة تشفير base64 دون تحديد أيٍّ من ترميزات base64 ، ولكن بعد ذلك يتعين عليّ فك تشفير base64 صراحةً كل من البيانات المشفرة والبيانات التي تم فك تشفيرها من أجل الحصول على يعود إلى النموذج الذي قدمته في المقام الأول. حقيقة أن القيام بذلك يتطلب أيضًا استخدام معلمات سطر الأوامر التي لم يتم توثيقها حتى على مستوى أوامر التشفير الفرعية وفك تشفيرها ، مما يجعل اكتشافها أكثر صعوبة. يضمن جميع المستخدمين إضاعة ساعات في محاولة اكتشاف كيفية القيام بأحد الأشياء الأكثر وضوحًا التي قد يرغب شخص ما في القيام بها باستخدام عميل تشفير / فك تشفير - تشفير سلسلة محددة في معلمة سطر الأوامر وفك تشفيرها - وذلك تمامًا لأن الأداة لديه وضع تشغيل معطل حيث لا تتوافق المخرجات مع المدخلات على الرغم من حقيقة أن الأمرين الفرعيين من المفترض أن يكونا متماثلين. يشير إغلاق هذا دون إصلاحه إلى أنك لا تهتم على الإطلاق بقابلية الاستخدام أو كفاءة المطور.

يجب أن أتفق تمامًا مع @ sgendler-stem - إذا كان الكود يولد مخرجات ، فيجب أن يكون ، على الأقل ، قادرًا على أخذ ذلك كمدخل.

ومع ذلك ، هناك ما هو أكثر من ذلك. إذا تم التشفير من خلال SDK - بإضافة arn غريب في نهاية الملف المشفر ، فلن يتمكن CLI من فك تشفيره ، حتى بعد إزالة non-base64 arn عنوان url. هذا مجرد كسر .

متفق عليه مرة أخرى. هذا جعل الأمور محبطة بلا داع.

هذا مغلق فعلا؟ لماذا ا؟ لا أصدق أنه قد مرت 4 سنوات منذ فتح هذا ويبدو أن التعليقات الوحيدة هي شخص يقول "يعمل على النحو المنشود". لا هو سخيف ؛ @ sgendler- الجذعية الحق على الهدف ، وهذا مكسور تماما. أتمنى أن يشعر الفريق المسؤول بالسوء تجاه أنفسهم.

واجه نفس الاستثناءات:
botocore.errorfactory.InvalidCiphertextException: حدث خطأ (InvalidCiphertextException) عند استدعاء عملية فك التشفير:

مستخدم:
مفتاح = b64decode (مفتاح)
استجابة = client.decrypt (
CiphertextBlob = مفتاح
)

أعتقد أن هذا لن يكون محبطًا للغاية إذا لم يكن ناتج encrypt ، generate-data-key ، إلخ ، يستدعي الحقل CiphertextBlob . عندما يتم استدعاء الإدخال إلى decrypt أيضًا --ciphertext-blob ، فمن غير المنطقي تمامًا أن هذا النص المشفر يحتاج إلى تشفير مختلف.

إذا كان للعلامة decrypt اسمًا مختلفًا ، فسيكون ذلك تلميحًا إلى أنه يحتوي على ترميز مختلف.

هناك اقتراح ميزة للمدخلات بترميز base64 لفك تشفيرها هنا https://github.com/aws/aws-cli/issues/2063

تضمين التغريدة

كيف تعرف kms مفتاح التشفير الذي يجب استخدامه لفك التشفير ، نظرًا لأننا لا نقوم بتمرير معرف المفتاح كمعامل أثناء فك التشفير.

@ arpit728 أعتقد أن CipherTextBlob التي تم إرجاعها تتعلق بشكل خاص بمعرف KeyID الخاص بـ CMK معين.

يرجى إعادة فتح هذه التذكرة حتى يتم حلها!

لعبت عدة ساعات مع هذا حتى تم العثور على هذه التذكرة. هل توجد أي وثائق رسمية توضح كيف يجب ترميز الأشياء بالضبط وتحويلها بين التشفير وفك التشفير؟

مجرد القليل من المعلومات الأساسية حول ما يحدث:

في 1.6.6 ، أصلحنا انحدارًا لم نكن فيه من نوع ترميز base64 لأنواع "blob" التي كنا نقوم بترميزها سابقًا. نتيجة لذلك ، تحتاج الآن إلى تحديد وحدات البايت الثنائية الأولية لأي معامل تم تمييزه على أنه نوع "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:// لأنها ملف ذو محتوى ثنائي.

هذا المثال يعيد:

حدث خطأ (InvalidCiphertextException) عند استدعاء عملية فك التشفير:
مفكك:

`aws kms encrypt - key-id arn: aws: kms: eu-west-1werwerwjl: key / xxxyyyy --plaintext" abcd "--query CiphertextBlob --output text | base64 -d> ./encrypted- ملف

صدى "فك تشفير: $ (aws kms فك تشفير - تشفير نص ملف blob: ./ ملف مشفر - استعلام نص عادي - إخراج نص | base64 - فك تشفير)"
"
حاولت مع أوبونتو. إذا كان أي شخص يعرف وثائق أو أمثلة واضحة (رابط إلى موقع أو شيء ما) سأكون ممتنًا جدًا!

تحرير: تم تشفير وفك تشفير العمل باستخدام نصائح من هذه المقالة: https://dev.to/matchilling/pragmatically-storing-security-sensitive-data-using-aws-kms-5e5b

لمعلوماتك ، الرابط أعلاه لا يعمل ، لكن المقالة تبدو مفيدة جدًا ومتاحة هنا .

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات