במאמר הזה מוסבר איך ליצור מפתח להצפנה אסימטרית באמצעות מפתח RSA, ואיך להשתמש בו. אם אתם רוצים להשתמש במפתחות אסימטריים כדי ליצור ולאמת חתימות, קראו את המאמר יצירה ואימות של חתימות דיגיטליות. אם אתם רוצים להשתמש במפתחות סימטריים להצפנה ולפענוח, קראו את המאמר הצפנה ופענוח של נתונים.
בהצפנה אסימטרית משתמשים בחלק של המפתח הציבורי של המפתח האסימטרי, ובפענוח משתמשים בחלק של המפתח הפרטי של המפתח. ב-Cloud Key Management Service יש פונקציונליות לאחזור המפתח הציבורי ופונקציונליות לפענוח מידע מוצפן (ciphertext) שהוצפן באמצעות המפתח הציבורי. ב-Cloud KMS אין גישה ישירה למפתח הפרטי.
לפני שמתחילים
במסמך הזה מופיעות דוגמאות שפועלות בשורת הפקודה. כדי להשתמש בדוגמאות בקלות, כדאי להשתמש ב-Cloud Shell. בדוגמה להצפנה נעשה שימוש ב-OpenSSL, שמותקן מראש ב-Cloud Shell.
יוצרים מפתח אסימטרי עם מטרת מפתח של
ASYMMETRIC_DECRYPT. כדי לראות אילו אלגוריתמים נתמכים למטרת המפתחASYMMETRIC_DECRYPT, עיינו במאמר אלגוריתמים של הצפנה אסימטרית. אי אפשר לבצע את התהליך הזה עם מפתח שהמטרה שלו היאASYMMETRIC_SIGN.אם אתם מתכוונים להשתמש בשורת הפקודה, התקינו את OpenSSL אם עדיין לא עשיתם זאת. אם אתם משתמשים ב-Cloud Shell, אז OpenSSL כבר מותקן.
- משתמשי macOS: גרסת OpenSSL שמותקנת ב-macOS לא תומכת בדגלים שמשמשים לפענוח נתונים בנושא הזה. כדי לבצע את השלבים האלה ב-macOS, צריך להתקין את OpenSSL מ-Homebrew.
שליטה בגישה למפתח
למשתמש או לשירות שיאחזרו את המפתח הציבורי, נותנים את ההרשאה
cloudkms.cryptoKeyVersions.viewPublicKeyבמפתח האסימטרי. המפתח הציבורי נדרש להצפנת נתונים.למשתמש או לשירות שיפענחו נתונים שהוצפנו באמצעות המפתח הציבורי, צריך להעניק את ההרשאה
cloudkms.cryptoKeyVersions.useToDecryptבמפתח האסימטרי.
מידע נוסף על הרשאות ותפקידים ב-Cloud KMS מופיע במאמר הרשאות ותפקידים.
הצפנת נתונים
כדי להצפין נתונים באמצעות מפתח הצפנה אסימטרי, צריך לאחזר את המפתח הציבורי ולהשתמש בו כדי להצפין את הנתונים.
gcloud
כדי להשתמש בדוגמה הזו, צריך להתקין את OpenSSL במערכת המקומית.
הורדת המפתח הציבורי
מורידים את המפתח הציבורי:
gcloud kms keys versions get-public-key KEY_VERSION \
--key KEY_NAME \
--keyring KEY_RING \
--location LOCATION \
--output-file PUBLIC_KEY_PATH
מחליפים את מה שכתוב בשדות הבאים:
-
KEY_VERSION: גרסת המפתח של זוג המפתחות האסימטריים שרוצים להוריד את המפתח הציבורי שלו. -
KEY_NAME: השם של המפתח. -
KEY_RING: אוסף המפתחות שמכיל את המפתח. -
LOCATION: המיקום שבו נמצא אוסף המפתחות. -
PUBLIC_KEY_PATH: הנתיב שבו רוצים לשמור את המפתח הציבורי.
הצפנת נתונים
מצפינים את הנתונים באמצעות המפתח הציבורי שהורדתם ושומרים את הפלט בקובץ:
openssl pkeyutl -in INPUT_PATH \
-encrypt \
-pubin \
-inkey PUBLIC_KEY_PATH \
-pkeyopt rsa_padding_mode:oaep \
-pkeyopt rsa_oaep_md:HASH_SIZE \
-pkeyopt rsa_mgf1_md:HASH_SIZE \
> OUTPUT_PATH
מחליפים את מה שכתוב בשדות הבאים:
-
INPUT_PATH: הנתיב לנתוני הטקסט הפשוט שרוצים להצפין. -
PUBLIC_KEY_PATH: הנתיב למפתח הציבורי. -
HASH_SIZE: גודל ה-hash, לדוגמה256ל-SHA256. -
OUTPUT_PATH: הנתיב שבו רוצים לשמור את הנתונים המוצפנים.
C#
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח ב-C# ולהתקין את Cloud KMS C# SDK.
Go
כדי להשתמש ב-Cloud KMS בשורת הפקודה, קודם צריך להתקין את הגרסה העדכנית של Google Cloud CLI או לשדרג אליה.
Java
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח של Java ולהתקין את Cloud KMS Java SDK.
Node.js
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח של Node.js ולהתקין את Cloud KMS Node.js SDK.
PHP
כדי להריץ את הקוד הזה, קודם צריך ללמוד על שימוש ב-PHP ב- Google Cloud ולהתקין את Cloud KMS PHP SDK.
Python
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח ב-Python ולהתקין את Cloud KMS Python SDK.
Ruby
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח של Ruby ולהתקין את Cloud KMS Ruby SDK.
פענוח נתונים
משתמשים ב-Cloud KMS כדי לבצע את הפענוח.
gcloud
כדי להשתמש ב-Cloud KMS בשורת הפקודה, קודם צריך להתקין את הגרסה העדכנית של Google Cloud CLI או לשדרג אליה.
gcloud kms asymmetric-decrypt \
--version KEY_VERSION \
--key KEY_NAME \
--keyring KEY_RING \
--location LOCATION \
--ciphertext-file INPUT_PATH \
--plaintext-file OUTPUT_PATH
מחליפים את מה שכתוב בשדות הבאים:
-
KEY_VERSION: גרסת המפתח של זוג המפתחות האסימטרי ששימש להצפנת הנתונים. אפשר להשמיט את הדגל--versionכדי לזהות את הגרסה באופן אוטומטי. -
KEY_NAME: שם המפתח ששימש להצפנת הנתונים. -
KEY_RING: השם של אוסף המפתחות שמכיל את המפתח. -
LOCATION: המיקום שבו נמצא אוסף המפתחות. -
INPUT_PATH: הנתיב לקובץ שמכיל את המידע המוצפן (ciphertext). -
OUTPUT_PATH: הנתיב לקובץ שיכיל את הטקסט הפשוט.
כדי לקבל מידע על כל הדגלים והערכים האפשריים, מריצים את הפקודה עם הדגל --help.
כדי להציג את התוכן של הקובץ המפוענח, פותחים אותו בכלי לעריכת טקסט או משתמשים בפקודה cat כדי להציג אותו בטרמינל.
C#
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח ב-C# ולהתקין את Cloud KMS C# SDK.
Go
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח ב-Go ולהתקין את Cloud KMS Go SDK.
Java
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח של Java ולהתקין את Cloud KMS Java SDK.
Node.js
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח של Node.js ולהתקין את Cloud KMS Node.js SDK.
PHP
כדי להריץ את הקוד הזה, קודם צריך ללמוד על שימוש ב-PHP ב- Google Cloud ולהתקין את Cloud KMS PHP SDK.
Python
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח ב-Python ולהתקין את Cloud KMS Python SDK.
Ruby
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח של Ruby ולהתקין את Cloud KMS Ruby SDK.
API
בדוגמאות האלה משתמשים ב-curl כצד הלקוח ב-HTTP כדי להדגים את השימוש ב-API. מידע נוסף על בקרת גישה זמין במאמר גישה ל-Cloud KMS API.
משתמשים ב-method CryptoKeyVersions.asymmetricDecrypt.
פתרון בעיות
incorrect key purpose: ASYMMETRIC_SIGN
אפשר לפענח נתונים רק באמצעות מפתח עם מטרת מפתח ASYMMETRIC_DECRYPT.
invalid parameter כשמפענחים ב-macOS
גרסת OpenSSL שמותקנת ב-macOS לא תומכת בדגלים שמשמשים לפענוח נתונים בנושא הזה. כדי לבצע את השלבים האלה ב-macOS, צריך להתקין את OpenSSL מ-Homebrew.
data too large for key size
גודל המטען הייעודי (payload) המקסימלי לפענוח RSA תלוי בגודל המפתח ובאלגוריתם הריפוד. כל הפורמטים של הצפנת RSA שמשמשים את Cloud KMS משתמשים ב-OAEP, שתוקנן ב-RFC 2437. כדי לעזור לכם, ריכזנו בטבלה הבאה את האלגוריתמים ואת הגודל המקסימלי של המטען הייעודי (payload) שהם תומכים בו.
| אלגוריתם | פרמטרים | אורך ההודעה המקסימלי (בבייטים) |
|---|---|---|
| RSA_DECRYPT_OAEP_2048_SHA256 | k = 256; hLen = 32; | 190 |
| RSA_DECRYPT_OAEP_3072_SHA256 | k = 384; hLen = 32; | 318 |
| RSA_DECRYPT_OAEP_4096_SHA256 | k = 512; hLen = 32; | 446 |
| RSA_DECRYPT_OAEP_4096_SHA512 | k = 512; hLen = 64; | 382 |
לא מומלץ להשתמש בהצפנה אסימטרית להודעות באורכים שונים שעשויים להיות גדולים מהמגבלות האלה. במקום זאת, כדאי להשתמש בהצפנה היברידית. Tink היא ספרייה קריפטוגרפית שמשתמשת בגישה הזו.