מדריך ל- Google Tink

1. הקדמה

כיום מפתחים רבים משתמשים בטכניקות הצפנה כדי להגן על נתוני המשתמשים.

בקריפטוגרפיה, לשגיאות יישום קטנות עלולות להיות השלכות חמורות, ולהבין כיצד ליישם נכון קריפטוגרפיה זו משימה מורכבת וגוזלת זמן.

במדריך זה נתאר את טינק - ספריית הצפנה רב-שפתית, חוצה פלטפורמות, שיכולה לסייע לנו ביישום קוד הצפנה מאובטח.

2. תלות

אנו יכולים להשתמש ב- Maven או ב- Gradle כדי לייבא את Tink.

להדרכה שלנו, פשוט נוסיף את התלות של Maven של טינק:

 com.google.crypto.tink tink 1.2.2 

אם כי היינו יכולים להשתמש ב- Gradle במקום זאת:

תלות {הידור 'com.google.crypto.tink: tink: האחרון'}

3. אתחול

לפני השימוש באחד מממשקי ה- API של Tink עלינו לאתחל אותם.

אם נצטרך להשתמש בכל היישומים של כל הפרימיטיבים בטינק, נוכל להשתמש ב- TinkConfig.register () שיטה:

TinkConfig.register ();

אמנם, למשל, אם אנו זקוקים רק לפרימיטיב AEAD, נוכל להשתמש בו AeadConfig.register () שיטה:

AeadConfig.register ();

ניתן לבצע אתחול הניתן להתאמה אישית לכל יישום.

4. פרימיטיבי טינק

האובייקטים העיקריים שהספרייה משתמשת בהם נקראים פרימיטיבים אשר, בהתאם לסוג, מכילים פונקציונליות קריפטוגרפית שונה.

פרימיטיבי יכול להיות בעל מספר רב של יישומים:

פְּרִימִיטִיבִייישומים
AEADAES-EAX, AES-GCM, AES-CTR-HMAC, מעטפת KMS, CHACHA20-POLY1305
סטרימינג AEADAES-GCM-HKDF-STREAMING, AES-CTR-HMAC-STREAMING
AEAD דטרמיניסטיAEAD: AES-SIV
מקHMAC-SHA2
חתימה דיגיטליתECDSA מעל עקומות NIST, ED25519
הצפנה היברידיתECIES עם AEAD ו- HKDF, (NaCl CryptoBox)

אנו יכולים להשיג פרימיטיבי על ידי קריאה לשיטה getPrimitive () ממעמד המפעל המקביל העובר אותו א KeysetHandle:

Aead aead = AeadFactory.getPrimitive (keysetHandle); 

4.1. KeysetHandle

בסדר כדי לספק פונקציונליות קריפטוגרפית, כל פרימיטיבי זקוק למבנה מפתח המכיל את כל החומר והפרמטרים העיקריים.

טינק מספק אובייקט - KeysetHandle - העוטף ערכת מקשים עם כמה פרמטרים ומטא נתונים נוספים.

לכן, לפני שמפעילים פרימיטיבי, עלינו ליצור KeysetHandle לְהִתְנַגֵד:

KeysetHandle keysetHandle = KeysetHandle.generateNew (AeadKeyTemplates.AES256_GCM);

ואחרי שנוצר מפתח, אולי נרצה להחזיק אותו:

מחרוזת keysetFilename = "keyset.json"; CleartextKeysetHandle.write (keysetHandle, JsonKeysetWriter.withFile (קובץ חדש (keyetFilename)));

לאחר מכן נוכל לטעון אותו לאחר מכן:

מחרוזת keysetFilename = "keyset.json"; KeysetHandle keysetHandle = CleartextKeysetHandle.read (JsonKeysetReader.withFile (קובץ חדש (keyetFilename)));

5. הצפנה

Tink מספק מספר דרכים ליישום האלגוריתם של AEAD. בואו נסתכל.

5.1. AEAD

AEAD מספק הצפנה מאומתת עם נתונים משויכים כלומר אנו יכולים להצפין טקסט רגיל, ובאופציה, לספק נתונים משויכים שצריכים להיות מאומתים אך אינם מוצפנים.

שים לב שאלגוריתם זה מבטיח את האותנטיות והשלמות של הנתונים המשויכים אך לא את סודיותם.

כדי להצפין נתונים עם אחת מיישומי AEAD, כפי שראינו בעבר, עלינו לאתחל את הספרייה וליצור מקלדת ידית:

AeadConfig.register (); KeysetHandle keysetHandle = KeysetHandle.generateNew (AeadKeyTemplates.AES256_GCM);

לאחר שנעשה זאת, נוכל להשיג את הפרימיטיבי ולהצפין את הנתונים הרצויים:

מחרוזת טקסט פשוט = "baeldung"; String associatedData = "Tink"; Aead aead = AeadFactory.getPrimitive (keysetHandle); בתים [] ciphertext = aead.encrypt (plaintext.getBytes (), associatedData.getBytes ());

בשלב הבא נוכל לפענח את ה- טקסט צופן משתמש ב לפענח () שיטה:

מחרוזת מפוענחת = מחרוזת חדשה (aead.decrypt (ciphertext, associatedData.getBytes ()));

5.2. סטרימינג AEAD

בדומה לכך, כאשר הנתונים להצפנה גדולים מכדי שיעבדו אותם בשלב אחד, נוכל להשתמש בסטרימינג AEAD הפרימיטיבי:

AeadConfig.register (); KeysetHandle keysetHandle = KeysetHandle.generateNew (StreamingAeadKeyTemplates.AES128_CTR_HMAC_SHA256_4KB); StreamingAead streamingAead = StreamingAeadFactory.getPrimitive (keysetHandle); FileChannel cipherTextDestination = FileOutputStream חדש ("cipherTextFile"). GetChannel (); WritableByteChannel encryptingChannel = streamingAead.newEncryptingChannel (cipherTextDestination, associatedData.getBytes ()); חיץ ByteBuffer = ByteBuffer.allocate (CHUNK_SIZE); InputStream in = FileInputStream חדש ("plainTextFile"); בעוד (in.available ()> 0) {in.read (buffer.array ()); encryptingChannel.write (חיץ); } encryptingChannel.close (); בקרוב();

בעיקרון היינו צריכים WriteableByteChannel כדי להשיג זאת.

אז, כדי לפענח את cipherTextFile, נרצה להשתמש ב- ReadableByteChannel:

FileChannel cipherTextSource = FileInputStream חדש ("cipherTextFile"). GetChannel (); ReadableByteChannel decryptingChannel = streamingAead.newDecryptingChannel (cipherTextSource, associatedData.getBytes ()); OutputStream out = FileOutputStream חדש ("plainTextFile"); int cnt = 1; לעשות {buffer.clear (); cnt = decryptingChannel.read (חיץ); out.write (buffer.array ()); } תוך (cnt> 0); decryptingChannel.close (); out.close ();

6. הצפנה היברידית

בנוסף להצפנה סימטרית, Tink מיישם כמה פרימיטיבים להצפנה היברידית.

בעזרת הצפנה היברידית אנו יכולים להשיג את היעילות של מפתחות סימטריים ואת הנוחות של מפתחות אסימטריים.

במילים פשוטות, נשתמש במקש סימטרי כדי להצפין את הטקסט הרגיל ומפתח ציבורי להצפנת המפתח הסימטרי בלבד.

שימו לב שהוא מספק סודיות בלבד, ולא אותנטיות זהות של השולח.

אז בואו נראה כיצד להשתמש HybridEncrypt ו HybridDecrypt:

TinkConfig.register (); KeysetHandle privateKeysetHandle = KeysetHandle.generateNew (HybridKeyTemplates.ECIES_P256_HKDF_HMAC_SHA256_AES128_CTR_HMAC_SHA256); KeysetHandle publicKeysetHandle = privateKeysetHandle.getPublicKeysetHandle (); מחרוזת טקסט פשוט = "baeldung"; מחרוזת contextInfo = "טינק"; HybridEncrypt hybridEncrypt = HybridEncryptFactory.getPrimitive (publicKeysetHandle); HybridDecrypt hybridDecrypt = HybridDecryptFactory.getPrimitive (privateKeysetHandle); בתים [] ciphertext = hybridEncrypt.encrypt (plaintext.getBytes (), contextInfo.getBytes ()); בתים [] plaintextDecrypted = hybridDecrypt.decrypt (ciphertext, contextInfo.getBytes ());

ה contextInfo הם נתונים ציבוריים מרומזים מההקשר שיכולים להיות ריק או ריק או משמש כקלט "נתונים משויכים" להצפנת AEAD או כקלט "CtxInfo" עבור HKDF.

ה טקסט צופן מאפשר לבדוק את תקינות contextInfo אבל לא את הסודיות או האותנטיות שלה.

7. קוד אימות הודעה

Tink תומך גם בקודי אימות הודעות או ב- MAC.

MAC הוא חסימה של כמה בתים שבהם נוכל להשתמש כדי לאמת הודעה.

בואו נראה איך נוכל ליצור MAC ואז לאמת את האותנטיות שלו:

TinkConfig.register (); KeysetHandle keysetHandle = KeysetHandle.generateNew (MacKeyTemplates.HMAC_SHA256_128BITTAG); נתוני מחרוזת = "baeldung"; Mac mac = MacFactory.getPrimitive (keysetHandle); בייט [] תג = mac.computeMac (data.getBytes ()); mac.verifyMac (תג, data.getBytes ());

במקרה שהנתונים אינם אותנטיים, השיטה verifyMac () זורק א GeneralSecurityException.

8. חתימה דיגיטלית

כמו גם ממשקי API להצפנה, Tink תומך בחתימות דיגיטליות.

כדי ליישם חתימה דיגיטלית, הספרייה משתמשת ב- PublicKeySign פרימיטיבי לחתימת נתונים, ו PublickeyVerify לאימות:

TinkConfig.register (); KeysetHandle privateKeysetHandle = KeysetHandle.generateNew (SignatureKeyTemplates.ECDSA_P256); KeysetHandle publicKeysetHandle = privateKeysetHandle.getPublicKeysetHandle (); נתוני מחרוזת = "baeldung"; PublicKeySign signer = PublicKeySignFactory.getPrimitive (privateKeysetHandle); PublicKeyVerify verifier = PublicKeyVerifyFactory.getPrimitive (publicKeysetHandle); בייט [] חתימה = signer.sign (data.getBytes ()); verifier.verify (חתימה, data.getBytes ());

בדומה לשיטת ההצפנה הקודמת, כאשר החתימה אינה חוקית, נקבל GeneralSecurityException.

9. מסקנה

במאמר זה הצגנו את ספריית גוגל טינק באמצעות הטמעת Java שלה.

ראינו כיצד להשתמש בהצפנת נתונים ובפענוחם וכיצד להגן על שלמותם ואותנטיותם. יתר על כן, ראינו כיצד לחתום על נתונים באמצעות ממשקי API לחתימה דיגיטלית.

כמו תמיד, קוד הדוגמה זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found