/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠR az ew are ĠLLC Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠNot with standing Ġthe Ġfore going , Ġyou Ġmay Ġnot Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ċ Ġ* Ġdistribute , Ġsublicense , Ġcreate Ġa Ġderivative Ġwork , Ġand / or Ġsell Ġcopies Ġof Ġthe Ċ Ġ* ĠSoftware Ġin Ġany Ġwork Ġthat Ġis Ġdesigned , Ġintended , Ġor Ġmarket ed Ġfor Ġped ag og ical Ġor Ċ Ġ* Ġinstruction al Ġpurposes Ġrelated Ġto Ġprogramming , Ġcoding , Ġapplication Ġdevelopment , Ċ Ġ* Ġor Ġinformation Ġtechnology . Ġ ĠPermission Ġfor Ġsuch Ġuse , Ġcopying , Ġmodification , Ċ Ġ* Ġmer ger , Ġpublication , Ġdistribution , Ġsublic ensing , Ġcreation Ġof Ġderivative Ġworks , Ċ Ġ* Ġor Ġsale Ġis Ġexpress ly Ġwith held . Ċ Ġ* Ċ Ġ* ĠThis Ġproject Ġand Ġsource Ġcode Ġmay Ġuse Ġlibraries Ġor Ġframeworks Ġthat Ġare Ċ Ġ* Ġreleased Ġunder Ġvarious ĠOpen - Source Ġlicenses . ĠUse Ġof Ġthose Ġlibraries Ġand Ċ Ġ* Ġframeworks Ġare Ġgoverned Ġby Ġtheir Ġown Ġindividual Ġlicenses . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . ray w ender lich . android . pe ts ave . core . utils Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . content . Context Ċ import Ġandroid . security . keystore . Key Gen Parameter Spec Ċ import Ġandroid . security . keystore . Key Properties Ċ import Ġandroid . util . Log Ċ import Ġjava . security . KeyStore Ċ import Ġjava . security . Secure Random Ċ import Ġjava . util . HashMap Ċ import Ġjavax . crypto . Cipher Ċ import Ġjavax . crypto . Key Generator Ċ import Ġjavax . crypto . SecretKey Ċ import Ġjavax . crypto . SecretKey Factory Ċ import Ġjavax . crypto . spec . GCM Parameter Spec Ċ import Ġjavax . crypto . spec . Iv Parameter Spec Ċ import Ġjavax . crypto . spec . P BE KeySpec Ċ import Ġjavax . crypto . spec . SecretKey Spec Ċ Ċ class ĠEncryption Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠKEY STORE _ ALIAS Ġ= Ġ" Pet Save Login Key " ĊĠĠĠ Ġprivate Ġconst Ġval ĠPRO VIDER Ġ= Ġ" Android KeyStore " ĊĊĠĠĠ Ġprivate Ġfun Ġget SecretKey (): ĠSecret Key Ġ{ ĊĠĠĠĠĠ Ġval Ġkey Store Ġ= ĠKey Store . getInstance ( PROVIDER ) ĊĊĠĠĠĠĠ Ġ// ĠBefore Ġthe Ġkeystore Ġcan Ġbe Ġaccessed , Ġit Ġmust Ġbe Ġloaded . ĊĠĠĠĠĠ Ġkey Store . load ( null ) ĊĠĠĠĠĠ Ġreturn Ġkey Store . getKey ( KEY STORE _ ALIAS , Ġnull ) Ġas ĠSecret Key ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( 2 3 ) ĊĠĠĠ Ġprivate Ġfun Ġget Cipher (): ĠCipher Ġ{ ĊĠĠĠĠĠ Ġreturn ĠCipher . getInstance ( Key Properties . KEY _ ALGORITHM _ AES Ġ+ Ġ"/" ĊĠĠĠĠĠĠĠĠĠ Ġ+ ĠKey Properties . BLOCK _ MODE _ GCM Ġ+ Ġ"/" ĊĠĠĠĠĠĠĠĠĠ Ġ+ ĠKey Properties . ENCRYPT ION _ P ADDING _ NONE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( 2 3 ) ĊĠĠĠ Ġfun Ġgenerate SecretKey () Ġ{ ĊĠĠĠĠĠ Ġval Ġkey Gen Parameter Spec Ġ= ĠKey Gen Parameter Spec . Builder ( ĊĠĠĠĠĠĠĠĠĠ ĠKEY STORE _ ALIAS , ĊĠĠĠĠĠĠĠĠĠ ĠKey Properties . P URPOSE _ ENCRYPT Ġor ĠKey Properties . P URPOSE _ DE CRYPT ) ĊĠĠĠĠĠĠĠĠĠ Ġ. set Block Modes ( Key Properties . BLOCK _ MODE _ GCM ) Ġ// Ġ 1 ĊĠĠĠĠĠĠĠĠĠ Ġ. set Encryption P add ings ( Key Properties . ENCRYPT ION _ P ADDING _ NONE ) ĊĠĠĠĠĠĠĠĠĠ Ġ. setUser Authentication Required ( true ) Ġ// Ġ 2 ĊĠĠĠĠĠĠĠĠĠ Ġ// For ĠR +, Ġcan Ġuse Ġ ĠKey Properties . AUTH _ BIO METRIC _ STRONG Ġand ĠKey Properties . AUTH _ DEVICE _ CRED ENTIAL ĊĠĠĠĠĠĠĠĠĠ Ġ. setUser Authentication Parameters ( 6 0 0 , ĠKey Properties . AUTH _ BIO METRIC _ STRONG ) ĊĠĠĠĠĠĠĠĠĠ Ġ// Other wise : ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġ. setUser Authentication Validity Duration Seconds ( 6 0 0 ) Ġ// Ġ 3 ĊĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠ Ġval Ġkey Generator Ġ= ĠKey Generator . getInstance ( ĊĠĠĠĠĠĠĠĠĠ ĠKey Properties . KEY _ ALGORITHM _ AES , ĠPRO VIDER ) Ġ// Ġ 4 ĊĠĠĠĠĠ Ġkey Generator . init ( key Gen Parameter Spec ) ĊĠĠĠĠĠ Ġkey Generator . generate Key () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Login Password ( context : ĠContext ): ĠByteArray Ġ{ ĊĠĠĠĠĠ Ġval Ġcipher Ġ= Ġget Cipher () ĊĠĠĠĠĠ Ġval Ġsecret Key Ġ= Ġget SecretKey () ĊĠĠĠĠĠ Ġval Ġrandom Ġ= ĠSecure Random () ĊĠĠĠĠĠ Ġval Ġpassword Bytes Ġ= ĠByteArray ( 2 5 6 ) ĊĠĠĠĠĠ Ġrandom . next Bytes ( password Bytes ) Ġ// Ġ 1 ĊĠĠĠĠĠ Ġcipher . init ( Cipher . ENCRYPT _ MODE , Ġsecret Key ) ĊĠĠĠĠĠ Ġval Ġiv Parameters Ġ= Ġcipher . parameters . getParameter Spec ( GCM Parameter Spec :: class . java ) ĊĠĠĠĠĠ Ġval Ġiv Ġ= Ġiv Parameters . iv ĊĠĠĠĠĠ ĠPreferences Helper . save IV ( context , Ġiv ) Ġ// Ġ 2 ĊĠĠĠĠĠ Ġreturn Ġcipher . do Final ( password Bytes ) Ġ// Ġ 3 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecrypt Password ( context : ĠContext , Ġpassword : ĠByteArray ): ĠByteArray Ġ{ ĊĠĠĠĠĠ Ġval Ġcipher Ġ= Ġget Cipher () ĊĠĠĠĠĠ Ġval Ġsecret Key Ġ= Ġget SecretKey () ĊĠĠĠĠĠ Ġval Ġiv Ġ= ĠPreferences Helper . iv ( context ) Ġ// Ġ 1 ĊĠĠĠĠĠ Ġval Ġiv Parameters Ġ= ĠG CM Parameter Spec ( 1 2 8 , Ġiv ) ĊĠĠĠĠĠ Ġcipher . init ( Cipher . DE CRYPT _ MODE , Ġsecret Key , Ġiv Parameters ) Ġ// Ġ 2 ĊĠĠĠĠĠ Ġreturn Ġcipher . do Final ( password ) Ġ// Ġ 3 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġencrypt ( data To Encrypt : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġpassword : ĠChar Array ): ĠHashMap < String , ĠByteArray > Ġ{ ĊĠĠĠĠĠ Ġval Ġmap Ġ= ĠHashMap < String , ĠByteArray >() ĊĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 ĊĠĠĠĠĠĠĠ Ġ// Random Ġsalt Ġfor Ġnext Ġstep ĊĠĠĠĠĠĠĠ Ġval Ġrandom Ġ= ĠSecure Random () ĊĠĠĠĠĠĠĠ Ġval Ġsalt Ġ= ĠByteArray ( 2 5 6 ) ĊĠĠĠĠĠĠĠ Ġrandom . next Bytes ( salt ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 2 ĊĠĠĠĠĠĠĠ Ġ// PB K DF 2 Ġ- Ġderive Ġthe Ġkey Ġfrom Ġthe Ġpassword , Ġdon 't Ġuse Ġpasswords Ġdirectly ĊĠĠĠĠĠĠĠ Ġval Ġpb KeySpec Ġ= ĠP BE KeySpec ( password , Ġsalt , Ġ 1 3 2 4 , Ġ 2 5 6 ) ĊĠĠĠĠĠĠĠ Ġval Ġsecret Key Factory Ġ= ĠSecret Key Factory . getInstance (" PB K DF 2 With H mac SHA 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġkey Bytes Ġ= Ġsecret Key Factory . generate Secret ( pb KeySpec ). encoded ĊĠĠĠĠĠĠĠ Ġval Ġkey Spec Ġ= ĠSecret KeySpec ( key Bytes , Ġ" AES ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 3 ĊĠĠĠĠĠĠĠ Ġ// Create Ġinitialization Ġvector Ġfor ĠAES ĊĠĠĠĠĠĠĠ Ġval Ġiv Random Ġ= ĠSecure Random () Ġ// not Ġcaching Ġprevious Ġsee ded Ġinstance Ġof ĠSecure Random ĊĠĠĠĠĠĠĠ Ġval Ġiv Ġ= ĠByteArray ( 1 6 ) ĊĠĠĠĠĠĠĠ Ġiv Random . next Bytes ( iv ) ĊĠĠĠĠĠĠĠ Ġval Ġiv Spec Ġ= ĠI v Parameter Spec ( iv ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 4 ĊĠĠĠĠĠĠĠ Ġ// Encrypt ĊĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance (" AES / CBC / PKCS 7 Padding ") ĊĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . ENCRYPT _ MODE , Ġkey Spec , Ġiv Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġencrypted Ġ= Ġcipher . do Final ( data To Encrypt ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 5 ĊĠĠĠĠĠĠĠ Ġmap [" salt "] Ġ= Ġsalt ĊĠĠĠĠĠĠĠ Ġmap [" iv "] Ġ= Ġiv ĊĠĠĠĠĠĠĠ Ġmap [" encrypted "] Ġ= Ġencrypted ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . e (" MY APP ", Ġ" encryption Ġexception ", Ġe ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġmap ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecrypt ( map : ĠHashMap < String , ĠByteArray >, Ġpassword : ĠChar Array ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠ Ġvar Ġdecrypted : ĠByteArray ? Ġ= Ġnull ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġsalt Ġ= Ġmap [" salt "] ĊĠĠĠĠĠĠĠ Ġval Ġiv Ġ= Ġmap [" iv "] ĊĠĠĠĠĠĠĠ Ġval Ġencrypted Ġ= Ġmap [" encrypted "] ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 2 ĊĠĠĠĠĠĠĠ Ġ// regener ate Ġkey Ġfrom Ġpassword ĊĠĠĠĠĠĠĠ Ġval Ġpb KeySpec Ġ= ĠP BE KeySpec ( password , Ġsalt , Ġ 1 3 2 4 , Ġ 2 5 6 ) ĊĠĠĠĠĠĠĠ Ġval Ġsecret Key Factory Ġ= ĠSecret Key Factory . getInstance (" PB K DF 2 With H mac SHA 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġkey Bytes Ġ= Ġsecret Key Factory . generate Secret ( pb KeySpec ). encoded ĊĠĠĠĠĠĠĠ Ġval Ġkey Spec Ġ= ĠSecret KeySpec ( key Bytes , Ġ" AES ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 3 ĊĠĠĠĠĠĠĠ Ġ// Decrypt ĊĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance (" AES / CBC / PKCS 7 Padding ") ĊĠĠĠĠĠĠĠ Ġval Ġiv Spec Ġ= ĠI v Parameter Spec ( iv ) ĊĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . DE CRYPT _ MODE , Ġkey Spec , Ġiv Spec ) ĊĠĠĠĠĠĠĠ Ġdecrypted Ġ= Ġcipher . do Final ( encrypted ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . e (" MY APP ", Ġ" de cryption Ġexception ", Ġe ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġdecrypted ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// NOTE : ĠKe yst ore Ġversion Ġof Ġthe Ġencryption ĊĠĠĠ Ġfun Ġkeystore Encrypt ( data To Encrypt : ĠByteArray ): ĠHashMap < String , ĠByteArray > Ġ{ ĊĠĠĠĠĠ Ġval Ġmap Ġ= ĠHashMap < String , ĠByteArray >() ĊĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Get Ġthe Ġkey ĊĠĠĠĠĠĠĠ Ġval Ġkey Store Ġ= ĠKey Store . getInstance (" Android KeyStore ") ĊĠĠĠĠĠĠĠ Ġkey Store . load ( null ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsecret Key Entry Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store . getEntry ( KEY STORE _ ALIAS , Ġnull ) Ġas ĠKey Store . SecretKey Entry ĊĠĠĠĠĠĠĠ Ġval Ġsecret Key Ġ= Ġsecret Key Entry . secret Key ĊĊĠĠĠĠĠĠĠ Ġ// Encrypt Ġdata ĊĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance (" AES / GCM / No Padding ") ĊĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . ENCRYPT _ MODE , Ġsecret Key ) ĊĠĠĠĠĠĠĠ Ġval Ġiv Bytes Ġ= Ġcipher . iv ĊĠĠĠĠĠĠĠ Ġval Ġencrypted Bytes Ġ= Ġcipher . do Final ( data To Encrypt ) ĊĊĠĠĠĠĠĠĠ Ġmap [" iv "] Ġ= Ġiv Bytes ĊĠĠĠĠĠĠĠ Ġmap [" encrypted "] Ġ= Ġencrypted Bytes ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġkeystore Decrypt ( map : ĠHashMap < String , ĠByteArray >): ĠByteArray ? Ġ{ ĊĠĠĠĠĠ Ġvar Ġdecrypted : ĠByteArray ? Ġ= Ġnull ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Get Ġthe Ġkey ĊĠĠĠĠĠĠĠ Ġval Ġkey Store Ġ= ĠKey Store . getInstance (" Android KeyStore ") ĊĠĠĠĠĠĠĠ Ġkey Store . load ( null ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsecret Key Entry Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store . getEntry ( KEY STORE _ ALIAS , Ġnull ) Ġas ĠKey Store . SecretKey Entry ĊĠĠĠĠĠĠĠ Ġval Ġsecret Key Ġ= Ġsecret Key Entry . secret Key ĊĊĠĠĠĠĠĠĠ Ġ// Extract Ġinfo Ġfrom Ġmap ĊĠĠĠĠĠĠĠ Ġval Ġencrypted Bytes Ġ= Ġmap [" encrypted "] ĊĠĠĠĠĠĠĠ Ġval Ġiv Bytes Ġ= Ġmap [" iv "] ĊĊĠĠĠĠĠĠĠ Ġ// Decrypt Ġdata ĊĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance (" AES / GCM / No Padding ") ĊĠĠĠĠĠĠĠ Ġval Ġspec Ġ= ĠG CM Parameter Spec ( 1 2 8 , Ġiv Bytes ) ĊĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . DE CRYPT _ MODE , Ġsecret Key , Ġspec ) ĊĠĠĠĠĠĠĠ Ġdecrypted Ġ= Ġcipher . do Final ( encrypted Bytes ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġdecrypted ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( 2 3 ) ĊĠĠĠ Ġfun Ġkeystore Test () Ġ{ ĊĊĠĠĠĠĠ Ġval Ġkey Generator Ġ= ĠKey Generator . getInstance ( Key Properties . KEY _ ALGORITHM _ AES , Ġ" Android KeyStore ") ĊĠĠĠĠĠ Ġval Ġkey Gen Parameter Spec Ġ= ĠKey Gen Parameter Spec . Builder ( KEY STORE _ ALIAS , ĊĠĠĠĠĠĠĠĠĠ ĠKey Properties . P URPOSE _ ENCRYPT Ġor ĠKey Properties . P URPOSE _ DE CRYPT ) ĊĠĠĠĠĠĠĠĠĠ Ġ. set Block Modes ( Key Properties . BLOCK _ MODE _ GCM ) ĊĠĠĠĠĠĠĠĠĠ Ġ. set Encryption P add ings ( Key Properties . ENCRYPT ION _ P ADDING _ NONE ) ĊĠĠĠĠĠĠĠĠĠ Ġ// . setUser Authentication Required ( true ) Ġ// Ġrequires Ġlock Ġscreen , Ġinvalid ated Ġif Ġlock Ġscreen Ġis Ġdisabled ĊĠĠĠĠĠĠĠĠĠ Ġ// . setUser Authentication Validity Duration Seconds ( 1 2 0 ) Ġ// Ġonly Ġavailable Ġx Ġseconds Ġfrom Ġpassword Ġauthentication . Ġ- 1 Ġrequires Ġfinger Ġprint Ġ- Ġevery Ġtime ĊĠĠĠĠĠĠĠĠĠ Ġ. set Random ized Encryption Required ( true ) Ġ// Ġdifferent Ġciphertext Ġfor Ġsame Ġplaintext Ġon Ġeach Ġcall ĊĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠ Ġkey Generator . init ( key Gen Parameter Spec ) ĊĠĠĠĠĠ Ġkey Generator . generate Key () ĊĊĠĠĠĠĠ Ġval Ġmap Ġ= Ġkeystore Encrypt (" My Ġvery Ġsensitive Ġstring ! ". toByteArray ( Charsets . UTF _ 8 )) ĊĠĠĠĠĠ Ġval Ġdecrypted Bytes Ġ= Ġkeystore Decrypt ( map ) ĊĠĠĠĠĠ Ġdecrypted Bytes ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdecrypted String Ġ= ĠString ( it , ĠChar sets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ ĠLog . e (" My App ", Ġ" The Ġdecrypted Ġstring Ġis : Ġ$ de crypted String ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġ} Ċ }