package Ġcom . mut ual mobile . android keystore . android . crypto . misc Ċ Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Process Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . Data OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Unsupported EncodingException Ċ Ċ // ĠBased Ġon Ġhttp :// android - developers . blogspot . jp / 2 0 1 3 / 0 8 / some - se cur er andom - thought s . html Ċ object ĠPR NG Fixes Ġ{ ĊĊĠ Ġprivate Ġval ĠBUILD _ F ING ER PRINT _ AND _ DEVICE _ SERIAL Ġ= Ġbuild Fingerprint And Device Serial ĊĊĠ Ġprivate // ĠWe 're Ġusing Ġthe ĠReflection ĠAPI Ġbecause ĠBuild . SERIAL Ġis Ġonly Ġavailable ĊĠ Ġ// Ġsince ĠAPI ĠLevel Ġ 9 Ġ( G inger bread , ĠAndroid Ġ 2 . 3 ). ĊĠ Ġval Ġdevice SerialNumber : ĠString ? ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBuild :: class . java . getField (" SERIAL "). get ( null ) Ġas ĠString ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġval Ġbuild Fingerprint And Device Serial : ĠByteArray ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġval Ġresult Ġ= ĠStringBuilder () ĊĠĠĠĠĠ Ġval Ġfingerprint Ġ= ĠBuild . F ING ER PRINT ĊĠĠĠĠĠ Ġif Ġ( fingerprint Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . append ( fingerprint ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġserial Ġ= Ġdevice SerialNumber ĊĠĠĠĠĠ Ġif Ġ( serial Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . append ( serial ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . toString (). toByteArray ( charset (" UTF - 8 ")) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUnsupported EncodingException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" UTF - 8 Ġencoding Ġnot Ġsupported ") ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġapply () Ġ{ ĊĠĠĠ Ġapply Open SSL Fix () ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( Security Exception :: class ) ĊĠ Ġfun Ġapply Open SSL Fix () Ġ{ ĊĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . J EL LY _ BE AN Ġ|| ĠBuild . VERSION . SDK _ INT Ġ> ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠNo Ġneed Ġto Ġapply Ġthe Ġfix ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġ// ĠMix Ġin Ġthe Ġdevice - Ġand Ġinvocation - specific Ġseed . ĊĠĠĠĠĠ ĠClass . forName (" org . apache . har mony . x net . provider . js se . Native Crypto ") ĊĠĠĠĠĠĠĠĠĠ Ġ. getMethod (" RAND _ seed ", ĠByteArray :: class . java ) ĊĠĠĠĠĠĠĠĠĠ Ġ. invoke ( null , Ġgenerate Seed ()) ĊĊĠĠĠĠĠ Ġ// ĠMix Ġoutput Ġof ĠLinux ĠPR NG Ġinto ĠOpenSSL 's ĠPR NG ĊĠĠĠĠĠ Ġval Ġbytes Read Ġ= ĠClass ĊĠĠĠĠĠĠĠĠĠ Ġ. forName ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" org . apache . har mony . x net . provider . js se . Native Crypto ") ĊĠĠĠĠĠĠĠĠĠ Ġ. getMethod (" RAND _ load _ file ", ĠString :: class . java , ĠLong :: class . java Primitive Type ) ĊĠĠĠĠĠĠĠĠĠ Ġ. invoke ( null , Ġ"/ dev / ur andom ", Ġ 1 0 2 4 ) Ġas ĠInt ĊĠĠĠĠĠ Ġif Ġ( bytes Read Ġ!= Ġ 1 0 2 4 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unexpected Ġnumber Ġof Ġbytes Ġread Ġfrom ĠLinux ĠPR NG : Ġ$ bytes Read ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠSecurity Exception (" Failed Ġto Ġseed ĠOpenSSL ĠPR NG ", Ġe ) ĊĠĠĠ Ġ} ĊĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate Seed (): ĠByteArray Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġseed Buffer Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠ Ġval Ġseed Buffer Out Ġ= ĠData OutputStream ( seed Buffer ) ĊĠĠĠĠĠ Ġseed Buffer Out . write Long ( System . currentTimeMillis ()) ĊĠĠĠĠĠ Ġseed Buffer Out . write Long ( System . nano Time ()) ĊĠĠĠĠĠ Ġseed Buffer Out . writeInt ( Process . my Pid ()) ĊĠĠĠĠĠ Ġseed Buffer Out . writeInt ( Process . my Uid ()) ĊĠĠĠĠĠ Ġseed Buffer Out . write ( ĊĠĠĠĠĠĠĠĠĠ ĠBUILD _ F ING ER PRINT _ AND _ DEVICE _ SERIAL ) ĊĠĠĠĠĠ Ġseed Buffer Out . close () ĊĠĠĠĠĠ Ġreturn Ġseed Buffer . toByteArray () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠSecurity Exception (" Failed Ġto Ġgenerate Ġseed ", Ġe ) ĊĠĠĠ Ġ} ĊĊĠ Ġ} Ċ } Ċ