בנושא הזה מוסבר איך ליצור ולאמת חתימות דיגיטליות שמבוססות על מפתחות אסימטריים.
חתימה דיגיטלית נוצרת באמצעות החלק של המפתח הפרטי במפתח אסימטרי. החתימה מאומתת באמצעות החלק של המפתח הציבורי באותו מפתח אסימטרי.
לפני שמתחילים
כשיוצרים חתימות דיגיטליות, צריך להשתמש במפתח עם מטרת המפתח
ASYMMETRIC_SIGN. כשיוצרים את המפתח, משתמשים ב-ASYMMETRIC_SIGN.כדי לאמת חתימה, צריך לדעת את האלגוריתם המלא ששימש ליצירת המפתח. בהוראות של שורת הפקודה שבהמשך, שבהן נעשה שימוש בפקודה
openssl, צריך להעביר את המידע הזה לפקודות האלה.מעניקים את ההרשאה
cloudkms.cryptoKeyVersions.useToSignלמשתמש או לשירות שיבצעו את החתימה במפתח האסימטרי. מידע נוסף על הרשאות ב-Cloud Key Management Service זמין במאמר הרשאות ותפקידים.אם אתם רוצים לאמת חתימה, צריך להעניק למשתמש או לשירות שיורידו את המפתח הציבורי כדי להשתמש בו לאימות, הרשאה
cloudkms.cryptoKeyVersions.viewPublicKeyבמפתח האסימטרי.אם אתם מתכוונים להשתמש בשורת הפקודה, תצטרכו להתקין את OpenSSL אם הוא עדיין לא מותקן אצלכם. אם אתם משתמשים ב-Cloud Shell, OpenSSL כבר מותקן.
נתונים לעומת תקציר
אפשר להעביר את הקלט שסופק לבקשות AsymmetricSign דרך השדה data או השדה digest. אי אפשר לציין את שני השדות האלה בו-זמנית. יש אלגוריתמים שדורשים את שדה הנתונים, כמו אלגוריתמים גולמיים וחתימה באמצעות מפתח של Cloud External Key Manager.
אלגוריתמים גולמיים
אלגוריתמים מסוג Raw, שמזוהים על ידי הקידומת RSA_SIGN_RAW_, הם וריאציה של חתימה מסוג PKCS #1 שבה לא מתבצע קידוד ל-DigestInfo. בגרסה:
- סיכום מחושב על ההודעה שתהיה חתומה.
- הריפוד PKCS #1 מוחל ישירות על ה-digest.
- מחשבים חתימה של ה-digest עם הריפוד, באמצעות המפתח הפרטי של RSA.
כדי להשתמש באלגוריתמים האלה:
- צריך לספק את הנתונים הגולמיים (במקום תקציר) כחלק מהשדה
data. - אורך הנתונים מוגבל ל-11 בייטים פחות מגודל מפתח ה-RSA. לדוגמה, PKCS #1 עם מפתח RSA של 2048 ביט יכול לחתום על 245 בייטים לכל היותר.
- נותנים את התפקיד
cloudkms.expertRawPKCS1למשתמש או לשירות המתאימים. מידע על הרשאות ב-Cloud Key Management Service זמין במאמר הרשאות ותפקידים.
באמצעות אלגוריתמים גולמיים, אפשר גם לחתום על סוג תקציר שלא קיים עבורו אלגוריתם מוגדר מראש. לדוגמה, אפשר להשתמש במפתח RSA_SIGN_RAW_2048 כדי לחתום על מבנה SHA-512 PKCS #1 DigestInfo שכבר חישבתם חיצונית. התהליך הזה יוצר את אותן תוצאות כמו אלגוריתם RSA_SIGN_PKCS1_2048_SHA512 רגיל.
תמיכה ב-ECDSA עבור אלגוריתמים אחרים של גיבוב
האלגוריתמים של חתימת ה-ECDSA שלנו הם בפורמט הכללי הבא:
EC_SIGN_ELLIPTIC_CURVE_[DIGEST_ALGORITHM]
ל-DIGEST_ALGORITHM יש את הערך SHA256, SHA384 או SHA512.
מכיוון שהגיבוב מתבצע לפני שיוצרים את החתימה, אפשר להשתמש באלגוריתמים האלה לחתימה גם עם תקצירים אחרים מלבד SHA, כמו Keccak. כדי להשתמש בתקציר Keccak, צריך לספק ערך גיבוב Keccak ולהשתמש באלגוריתם הגיבוב SHA באורך זהה. לדוגמה, אפשר להשתמש בתקציר KECCAK256 בבקשה עם האלגוריתם EC_SIGN_P256_SHA256.
יצירת חתימה
gcloud
כדי להשתמש ב-Cloud KMS בשורת הפקודה, קודם צריך להתקין את הגרסה האחרונה של Google Cloud CLI או לשדרג אליה.
gcloud kms asymmetric-sign \
--version key-version \
--key key \
--keyring key-ring \
--location location \
--digest-algorithm digest-algorithm \
--input-file input-file \
--signature-file signature-file
מחליפים את key-version בגרסת המפתח שבה רוצים להשתמש לחתימה. מחליפים את key בשם המפתח. מחליפים את key-ring בשם של אוסף המפתחות שבו נמצא המפתח. מחליפים את location במיקום ב-Cloud KMS שבו נמצא אוסף המפתחות. מחליפים את digest-algorithm באלגוריתם שבו רוצים להשתמש. משמיטים את digest-algorithm כדי לשלוח את input-file ל-Cloud KMS לחתימה. מחליפים את input-file ואת signature-file בנתיבים המקומיים של הקובץ לחתימה ושל קובץ החתימה.
כדי לקבל מידע על כל הדגלים והערכים האפשריים, מריצים את הפקודה עם הדגל --help.
C#
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח בשפת C# ולהתקין את ה-SDK של Cloud KMS C# .
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.
משתמשים בשיטה CryptoKeyVersions.asymmetricSign כדי לבצע את החתימה. התשובה מהשיטה הזו מכילה את החתימה בקידוד base64.
אימות חתימה של עקומה אליפטית
gcloud
כדי להשתמש ב-Cloud KMS בשורת הפקודה, קודם צריך להתקין את הגרסה האחרונה של Google Cloud CLI או לשדרג אליה.
קבלת המפתח הציבורי
gcloud kms keys versions get-public-key key-version \
--key key \
--keyring key-ring \
--location location \
--output-file output-file
מחליפים את key-version בגרסת המפתח. מחליפים את key בשם המפתח. מחליפים את key-ring בשם של אוסף המפתחות שבו נמצא המפתח. מחליפים את הערך location במיקום של אוסף המפתחות ב-Cloud KMS. מחליפים את output-file בנתיב הקובץ לשמירת המפתח הציבורי במערכת המקומית.
כדי לקבל מידע על כל הדגלים והערכים האפשריים, מריצים את הפקודה עם הדגל --help.
אימות החתימה
פקודות OpenSSL לאימות החתימה תלויות בסוג החתימה שנוצרה. לדוגמה, כדי לאמת חתימה של עקומה אליפטית SHA-256 באמצעות OpenSSL, צריך לציין -sha256. כדי לאמת חתימה של עקומה אליפטית SHA-384, צריך לציין -sha384.
openssl dgst \
-sha256 \
-verify public-key-file \
-signature signature-file \
message-file
מחליפים את המשתנים בערכים משלכם:
public-key-file. הנתיב לקובץ שמכיל את המפתח הציבורי (לדוגמה,
"./my-key.pub").signature-file. הנתיב לקובץ שמכיל את החתימה לאימות (לדוגמה,
"./my-data.sig").message-file. הנתיב לקובץ שמכיל את ההודעה (לדוגמה,
"./my-data.txt").
אם החתימה תקפה, הפקודה מחזירה את המחרוזת Verified OK.
כדי לקבל מידע על כל הדגלים והערכים האפשריים, מריצים את הפקודה עם פקודת המשנה help.
C#
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח בשפת C# ולהתקין את ה-SDK של Cloud KMS C# .
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.
משתמשים בשיטה CryptoKeyVersions.getPublicKey כדי לאחזר את המפתח הציבורי, ואז משתמשים בפקודות שמוצגות בדוגמה של שורת הפקודה כדי לאמת את החתימה.
אימות חתימת RSA
gcloud
כדי להשתמש ב-Cloud KMS בשורת הפקודה, קודם צריך להתקין את הגרסה האחרונה של Google Cloud CLI או לשדרג אליה.
קבלת המפתח הציבורי
gcloud kms keys versions get-public-key key-version \
--key key \
--keyring key-ring \
--location location \
--output-file output-file
מחליפים את key-version בגרסת המפתח. מחליפים את key בשם המפתח. מחליפים את key-ring בשם של אוסף המפתחות שבו נמצא המפתח. מחליפים את הערך location במיקום של אוסף המפתחות ב-Cloud KMS. מחליפים את output-file בנתיב לשמירת המפתח הציבורי במערכת המקומית.
כדי לקבל מידע על כל הדגלים והערכים האפשריים, מריצים את הפקודה עם הדגל --help.
אימות החתימה
פקודות OpenSSL לאימות החתימה תלויות בסוג החתימה שנוצרה. לדוגמה, כדי לאמת חתימת RSA מסוג SHA-256 עם ריפוד PSS, צריך לציין -sha256 ו--sigopt rsa_padding_mode:pss. כדי לאמת חתימת RSA מסוג SHA-512 עם ריפוד PSS, צריך לציין את -sha512 ואת -sigopt
rsa_padding_mode:pss.
openssl dgst \
-sha256 \
-sigopt rsa_padding_mode:pss \
-sigopt rsa_pss_saltlen:-1 \
-verify public-key-file \
-signature signature-file \
message-file
מחליפים את המשתנים בערכים משלכם:
public-key-file. הנתיב לקובץ שמכיל את המפתח הציבורי (לדוגמה,
"./my-key.pub").signature-file. הנתיב לקובץ שמכיל את החתימה לאימות (לדוגמה,
"./my-data.sig").message-file. הנתיב לקובץ שמכיל את ההודעה (לדוגמה,
"./my-data.txt").
אם החתימה תקפה, הפקודה מחזירה את המחרוזת Verified OK.
כדי לקבל מידע על כל הדגלים והערכים האפשריים, מריצים את הפקודה עם פקודת המשנה help.
C#
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח בשפת C# ולהתקין את ה-SDK של Cloud KMS C# .
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.getPublicKey כדי לאחזר את המפתח הציבורי, ואז משתמשים בפקודות שמוצגות בדוגמה של שורת הפקודה כדי לאמת את החתימה.