소스 검색

指纹功能初步验证完成

bjb 4 달 전
부모
커밋
dc289fb97c

+ 20 - 5
app/src/main/java/com/iscs/bozzys/ui/pages/home/SettingsCompose.kt

@@ -49,10 +49,14 @@ import com.iscs.bozzys.ui.pages.compose.CardContainer
 import com.iscs.bozzys.ui.pages.login.openPageLogin
 import com.iscs.bozzys.ui.pages.vm.VMHome
 import com.iscs.bozzys.ui.theme.Text
+import com.iscs.bozzys.utils.BiometricKeyStore
 import com.iscs.bozzys.utils.Storage
+import com.iscs.bozzys.utils.Storage.saveTokenIv
+import com.iscs.bozzys.utils.Storage.saveTokenIvValue
 import com.iscs.bozzys.utils.SystemUtil
 import com.iscs.bozzys.utils.SystemUtil.isBiometricCanUse
 
+@OptIn(ExperimentalStdlibApi::class)
 @Composable
 fun SettingsCompose(pv: PaddingValues, zIndex: Float, vm: VMHome) {
     var showExitDialog by remember { mutableStateOf(false) }
@@ -77,12 +81,23 @@ fun SettingsCompose(pv: PaddingValues, zIndex: Float, vm: VMHome) {
             modifier = Modifier
                 .padding(horizontal = 16.dp)
                 .height(46.dp)
-                .clickable {
-                    if (ctx is Activity) SystemUtil.showFingerAuth(ctx)
-                }
         ) {
-            Row(modifier = Modifier.fillMaxSize()) {
-                Text("开启指纹登录")
+            Row(
+                modifier = Modifier
+                    .fillMaxSize()
+                    .clickable {
+                        if (ctx is Activity) {
+                            BiometricKeyStore.createKeyIfNeeded()
+                            val cipher = BiometricKeyStore.encryptCipher()
+                            cipher.iv.saveTokenIv()
+                            SystemUtil.showFingerAuth(ctx, cipher, Storage.readToken().toByteArray()) {
+                                it.saveTokenIvValue()
+                            }
+                        }
+                    }
+                    .padding(horizontal = 16.dp), verticalAlignment = Alignment.CenterVertically
+            ) {
+                Text("开启指纹登录", fontSize = 14.sp, color = Text)
             }
         }
         Spacer(modifier = Modifier.weight(1f))

+ 9 - 1
app/src/main/java/com/iscs/bozzys/ui/pages/login/PageLogin.kt

@@ -53,7 +53,10 @@ import com.iscs.bozzys.ui.pages.vm.VMLogin
 import com.iscs.bozzys.ui.theme.Main
 import com.iscs.bozzys.ui.theme.Text
 import com.iscs.bozzys.ui.theme.TextDesc
+import com.iscs.bozzys.utils.BiometricKeyStore
+import com.iscs.bozzys.utils.LogUtil
 import com.iscs.bozzys.utils.Storage
+import com.iscs.bozzys.utils.SystemUtil
 import com.iscs.bozzys.utils.SystemUtil.isBiometricCanUse
 
 /**
@@ -116,6 +119,7 @@ class PageLogin : PageBase() {
         }
     }
 
+    @OptIn(ExperimentalStdlibApi::class)
     @Composable
     fun LoginCompose(kb: SoftwareKeyboardController?, vm: VMLogin = viewModel()) {
         val ctx = LocalContext.current
@@ -299,7 +303,11 @@ class PageLogin : PageBase() {
                         .size(50.dp)
                         .clip(RoundedCornerShape(50))
                         .clickable {
-
+                            val cipher = BiometricKeyStore.decryptCipher(Storage.readTokenIv())
+                            SystemUtil.showFingerAuth(this@PageLogin, cipher, Storage.readTokenIvValue()) {
+                                LogUtil.i("xiaoming", "当前 token -> ${Storage.readToken()}")
+                                LogUtil.i("xiaoming", "解密 token -> ${String(it)}")
+                            }
                         }
                         .background(Color(0xFFF5F5F5))
                         .padding(13.dp),

+ 14 - 0
app/src/main/java/com/iscs/bozzys/utils/Storage.kt

@@ -96,6 +96,13 @@ object Storage {
         return mmkv.encode("user_token_iv", this)
     }
 
+    /**
+     * 保存Token生成的向量产生的值
+     */
+    fun ByteArray.saveTokenIvValue(): Boolean {
+        return mmkv.encode("user_token_iv_value", this)
+    }
+
     /**
      * 读取Token向量
      */
@@ -103,4 +110,11 @@ object Storage {
         return mmkv.decodeBytes("user_token_iv", byteArrayOf()) ?: byteArrayOf()
     }
 
+    /**
+     * 读取Token向量的值
+     */
+    fun readTokenIvValue(): ByteArray {
+        return mmkv.decodeBytes("user_token_iv_value", byteArrayOf()) ?: byteArrayOf()
+    }
+
 }

+ 5 - 11
app/src/main/java/com/iscs/bozzys/utils/SystemUtil.kt

@@ -6,11 +6,9 @@ import android.os.Build
 import android.os.CancellationSignal
 import android.security.keystore.KeyGenParameterSpec
 import android.security.keystore.KeyProperties
-import android.util.Log
 import androidx.biometric.BiometricManager
 import androidx.biometric.BiometricPrompt
 import androidx.fragment.app.FragmentActivity
-import com.iscs.bozzys.utils.Storage.saveTokenIv
 import java.security.KeyStore
 import javax.crypto.Cipher
 import javax.crypto.KeyGenerator
@@ -48,14 +46,13 @@ object SystemUtil {
      *
      * @param act
      */
-    fun showFingerAuth(act: Activity) {
+    @OptIn(ExperimentalStdlibApi::class)
+    fun showFingerAuth(act: Activity, cipher: Cipher, value: ByteArray, done: (doFinalValue: ByteArray) -> Unit) {
         if (act is FragmentActivity) {
             val bp = BiometricPrompt(act, act.mainExecutor, object : BiometricPrompt.AuthenticationCallback() {
 
             })
         } else {
-            BiometricKeyStore.createKeyIfNeeded()
-            val cipher = BiometricKeyStore.encryptCipher()
             val bp = android.hardware.biometrics.BiometricPrompt.Builder(act)
                 .setTitle("请验证")
                 .setNegativeButton("取消", act.mainExecutor) { _, _ ->
@@ -69,16 +66,13 @@ object SystemUtil {
                 object : android.hardware.biometrics.BiometricPrompt.AuthenticationCallback() {
 
                     override fun onAuthenticationSucceeded(result: android.hardware.biometrics.BiometricPrompt.AuthenticationResult) {
+                        LogUtil.i("SystemUtil -> showFingerAuth", "Auth succeeded")
                         val cipher = result.cryptoObject?.cipher
-                        cipher?.doFinal(Storage.readToken().toByteArray())?.let {
-                            (it + cipher.iv).saveTokenIv()
-                        }
-                        // val  = BiometricKeyStore.decryptCipher(Storage.readTokenIv())
-                        // Log.d("xiaoming", "验证成功 ${String(Storage.readTokenIv())}")
+                        cipher?.doFinal(value)?.let { done(it) }
                     }
 
                     override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
-                        Log.d("xiaoming", "验证失败")
+                        LogUtil.i("SystemUtil -> showFingerAuth", "Auth error code : $errorCode msg : $errString")
                     }
                 }
             )