Útmutató a Google Tinkhez

1. Bemutatkozás

Manapság sok fejlesztő kriptográfiai technikákat alkalmaz a felhasználói adatok védelmére.

A rejtjelezésben a kicsi implementációs hibáknak súlyos következményei lehetnek, és a kriptográfia helyes megvalósításának megértése összetett és időigényes feladat.

Ebben az oktatóanyagban leírjuk a Tink - egy többnyelvű, platformokon átívelő kriptográfiai könyvtárat, amely segíthet nekünk a biztonságos, kriptográfiai kód megvalósításában.

2. Függőségek

Használhatjuk a Mavenet vagy a Gradle-t a Tink importálásához.

Az oktatóanyagunkhoz csak hozzáadjuk Tink Maven-függőségét:

 com.google.crypto.tink tink 1.2.2 

Bár használhattuk volna helyette a Gradle-t is:

függőségek {compile 'com.google.crypto.tink: tink: latest'}

3. Inicializálás

Mielőtt bármelyik Tink API-t használnánk, inicializálnunk kell őket.

Ha az összes primitív megvalósítását a Tink-ben kell használnunk, akkor a TinkConfig.register () módszer:

TinkConfig.register ();

Míg például, ha csak AEAD primitívre van szükségünk, használhatjuk AeadConfig.register () módszer:

AeadConfig.register ();

Minden megvalósításhoz testreszabható inicializálás is biztosított.

4. Tink primitívek

A könyvtár által használt fő objektumokat primitíveknek nevezik, amelyek a típustól függően különböző rejtjelezési funkciókat tartalmaznak.

Egy primitívnek több megvalósítása lehet:

PrimitívVégrehajtások
ELŐREAES-EAX, AES-GCM, AES-CTR-HMAC, KMS boríték, CHACHA20-POLY1305
Streaming AEADAES-GCM-HKDF-STREAMING, AES-CTR-HMAC-STREAMING
Determinisztikus AEADELŐTT: AES-SIV
MACHMAC-SHA2
Digitális aláírásECDSA a NIST görbék felett, ED25519
Hibrid titkosításECIES AEAD-tal és HKDF-del, (NaCl CryptoBox)

A módszer meghívásával primitívet kaphatunk getPrimitive () a megfelelő gyári osztályból átmegy a KeysetHandle:

Aead aead = AeadFactory.getPrimitive (keysetHandle); 

4.1. KeysetHandle

Sorrendben a kriptográfiai funkcionalitás biztosításához minden primitívnek kulcsszerkezetre van szüksége amely tartalmazza az összes legfontosabb anyagot és paramétert.

Tink biztosít egy tárgyat - KeysetHandle - amely csomagol egy kulcscsomagot néhány további paraméterrel és metaadattal.

Tehát egy primitív példányosítása előtt létre kell hoznunk a KeysetHandle tárgy:

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

A kulcs előállítása után érdemes megőrizni:

String keysetFilename = "keyset.json"; CleartextKeysetHandle.write (keysetHandle, JsonKeysetWriter.withFile (új Fájl (keysetFilename)));

Ezután később betölthetjük:

String keysetFilename = "keyset.json"; KeysetHandle keysetHandle = CleartextKeysetHandle.read (JsonKeysetReader.withFile (új fájl (keysetFilename)));

5. Titkosítás

A Tink az AEAD algoritmus alkalmazásának többféle lehetőségét kínálja. Lássuk.

5.1. ELŐRE

Az AEAD hitelesített titkosítást biztosít a társított adatokkal, ami azt jelenti titkosíthatjuk a sima szöveget, és adott esetben megadhatunk kapcsolódó adatokat, amelyeket hitelesíteni kell, de nem titkosítani.

Vegye figyelembe, hogy ez az algoritmus biztosítja a társított adatok hitelességét és integritását, de nem titkosságát.

Az adatok titkosításához az AEAD egyik megvalósításával, amint azt korábban láttuk, inicializálnunk kell a könyvtárat, és létre kell hoznunk egy keyetHandle:

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

Miután ezt megtettük, megszerezhetjük a primitívet és titkosíthatjuk a kívánt adatokat:

Karakterlánc egyszerű szöveg = "baeldung"; String associatedData = "Tink"; Aead aead = AeadFactory.getPrimitive (keysetHandle); byte [] ciphertext = aead.encrypt (egyszerű szöveg.getBytes (), társítottData.getBytes ());

Ezután visszafejthetjük a rejtjelezett szöveg használni a visszafejteni () módszer:

Karaktersorozat visszafejtve = new Karakterlánc (aead.decrypt (titkosított szöveg, társítottData.getBytes ()));

5.2. Streaming AEAD

Hasonlóképpen, Ha a titkosítandó adatok túl nagyok ahhoz, hogy egyetlen lépésben feldolgozzák őket, használhatjuk az AEAD streaming primitív:

AeadConfig.register (); KeysetHandle keysetHandle = KeysetHandle.generateNew (StreamingAeadKeyTemplates.AES128_CTR_HMAC_SHA256_4KB); StreamingAead streamingAead = StreamingAeadFactory.getPrimitive (keysetHandle); FileChannel cipherTextDestination = új FileOutputStream ("cipherTextFile"). GetChannel (); WritableByteChannel encryptingChannel = streamingAead.newEncryptingChannel (cipherTextDestination, associatedData.getBytes ()); ByteBuffer buffer = ByteBuffer.allocate (CHUNK_SIZE); InputStream in = új FileInputStream ("plainTextFile"); while (in.available ()> 0) {in.read (buffer.array ()); encryptingChannel.write (puffer); } encryptingChannel.close (); körülkerít();

Alapvetően szükségünk volt WriteableByteChannel elérni ezt.

Tehát, hogy visszafejtem a cipherTextFile, szeretnénk használni a ReadableByteChannel:

FileChannel cipherTextSource = új FileInputStream ("cipherTextFile"). GetChannel (); ReadableByteChannel decryptingChannel = streamingAead.newDecryptingChannel (cipherTextSource, associatedData.getBytes ()); OutputStream out = new FileOutputStream ("plainTextFile"); int cnt = 1; do {puffer.clear (); cnt = decryptingChannel.read (puffer); out.write (puffer.array ()); } while (cnt> 0); decryptingChannel.close (); out.close ();

6. Hibrid titkosítás

A szimmetrikus titkosítás mellett a Tink bevezet néhány primitívet a hibrid titkosításhoz.

A hibrid titkosítással megszerezhetjük a szimmetrikus kulcsok hatékonyságát és az aszimmetrikus kulcsok kényelmét.

Egyszerűen fogalmazva, szimmetrikus kulcsot használunk a sima szöveg titkosításához és egy nyilvános kulcs csak a szimmetrikus kulcs titkosításához.

Figyelje meg, hogy csak titoktartást biztosít, a feladó személyazonosságának hitelességét nem.

Tehát nézzük meg, hogyan kell használni HybridEncrypt és HybridDecrypt:

TinkConfig.register (); KeysetHandle privateKeysetHandle = KeysetHandle.generateNew (HybridKeyTemplates.ECIES_P256_HKDF_HMAC_SHA256_AES128_CTR_HMAC_SHA256); KeysetHandle publicKeysetHandle = privateKeysetHandle.getPublicKeysetHandle (); Karakterlánc egyszerű szöveg = "baeldung"; Karakterlánc contextInfo = "Tink"; HybridEncrypt hybridEncrypt = HybridEncryptFactory.getPrimitive (publicKeysetHandle); HybridDecrypt hybridDecrypt = HybridDecryptFactory.getPrimitive (privateKeysetHandle); byte [] ciphertext = hybridEncrypt.encrypt (plaintext.getBytes (), contextInfo.getBytes ()); bájt [] plaintextDecrypted = hybridDecrypt.decrypt (titkosított szöveg, contextInfo.getBytes ());

A contextInfo implicit nyilvános adat a kontextusból, amely lehet nulla vagy üres vagy „társított adat” bemenetként használják az AEAD titkosításhoz vagy „CtxInfo” bemenetként a HKDF számára.

A rejtjelezett szöveg lehetővé teszi a contextInfo de nem titkolózása vagy hitelessége.

7. Üzenet hitelesítési kód

A Tink támogatja az üzenet-hitelesítési kódokat vagy MAC-okat is.

A MAC néhány bájt blokkja, amelyet felhasználhatunk egy üzenet hitelesítéséhez.

Nézzük meg, hogyan hozhatunk létre MAC-et, majd ellenőrizhetjük annak hitelességét:

TinkConfig.register (); KeysetHandle keysetHandle = KeysetHandle.generateNew (MacKeyTemplates.HMAC_SHA256_128BITTAG); Karakterlánc-adatok = "baeldung"; Mac mac = MacFactory.getPrimitive (keysetHandle); bájt [] tag = mac.computeMac (data.getBytes ()); mac.verifyMac (címke, data.getBytes ());

Abban az esetben, ha az adatok nem hitelesek, a módszer VerifyMac () dob egy GeneralSecurityException.

8. Digitális aláírás

A Tink a titkosítási API-k mellett támogatja a digitális aláírásokat is.

A digitális aláírás megvalósításához a könyvtár a PublicKeySign - primitív az adatok aláírásához, és - PublickeyVerify ellenőrzésre:

TinkConfig.register (); KeysetHandle privateKeysetHandle = KeysetHandle.generateNew (SignatureKeyTemplates.ECDSA_P256); KeysetHandle publicKeysetHandle = privateKeysetHandle.getPublicKeysetHandle (); Karakterlánc-adatok = "baeldung"; PublicKeySign aláíró = PublicKeySignFactory.getPrimitive (privateKeysetHandle); PublicKeyVerify verifier = PublicKeyVerifyFactory.getPrimitive (publicKeysetHandle); bájt [] aláírás = aláíró.jel (adat.getBytes ()); verifier.verify (aláírás, data.getBytes ());

Az előző titkosítási módszerhez hasonlóan, ha az aláírás érvénytelen, akkor a GeneralSecurityException.

9. Következtetés

Ebben a cikkben bemutattuk a Google Tink könyvtárat annak Java megvalósításával.

Láttuk, hogyan lehet felhasználni az adatok titkosítását és visszafejtését, valamint miként lehet megvédeni azok integritását és hitelességét. Ráadásul láttuk, hogyan lehet aláírni az adatokat digitális aláírás API-k segítségével.

Mint mindig, a mintakód elérhető a GitHubon.