将密钥库密码的明文存储改为 AES 加密存储

This commit is contained in:
luckyloogn
2024-12-31 21:48:29 +08:00
parent 925f22ccc8
commit 5232725cbb
4 changed files with 82 additions and 8 deletions

View File

@@ -12,6 +12,7 @@ import com.mcal.apksigner.ApkSigner
import com.reandroid.arsc.chunk.TableBlock
import org.apache.commons.io.FileUtils.copyFile
import org.apache.commons.io.FileUtils.copyInputStreamToFile
import org.autojs.autojs.apkbuilder.keystore.AESUtils
import org.autojs.autojs.app.GlobalAppContext
import org.autojs.autojs.engine.encryption.AdvancedEncryptionStandard
import org.autojs.autojs.pio.PFiles
@@ -292,9 +293,9 @@ open class ApkBuilder(apkInputStream: InputStream?, private val outApkFile: File
mAppConfig.keyStore?.let {
keyStoreFile = File(it.absolutePath)
password = it.password
password = AESUtils.decrypt(it.password)
alias = it.alias
aliasPassword = it.aliasPassword
aliasPassword = AESUtils.decrypt(it.aliasPassword)
}
// 使用 ApkSigner 重新签名

View File

@@ -0,0 +1,71 @@
package org.autojs.autojs.apkbuilder.keystore
import android.util.Base64
import javax.crypto.Cipher
import javax.crypto.SecretKey
import javax.crypto.spec.GCMParameterSpec
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import java.security.KeyStore
import javax.crypto.KeyGenerator
object AESUtils {
private const val TRANSFORMATION = "AES/GCM/NoPadding"
private const val TAG_LENGTH = 128
private const val KEY_ALIAS = "autojs6_key_store_aes_key"
private fun getKey(): SecretKey {
val keyStore = KeyStore.getInstance("AndroidKeyStore")
keyStore.load(null)
val key = keyStore.getKey(KEY_ALIAS, null)
if (key != null) {
return key as SecretKey
}
val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
val keyGenParameterSpec = KeyGenParameterSpec.Builder(KEY_ALIAS, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.build()
keyGenerator.init(keyGenParameterSpec)
return keyGenerator.generateKey()
}
// 加密
fun encrypt(data: String): String {
val secretKey: SecretKey = getKey()
val cipher = Cipher.getInstance(TRANSFORMATION)
cipher.init(Cipher.ENCRYPT_MODE, secretKey)
val encryptedData = cipher.doFinal(data.toByteArray())
val encryptedBase64 = Base64.encodeToString(encryptedData, Base64.NO_WRAP)
val ivBase64 = Base64.encodeToString(cipher.iv, Base64.NO_WRAP)
return "$ivBase64:$encryptedBase64"
}
// 解密
fun decrypt(encryptedData: String): String {
val parts = encryptedData.split(":")
val ivBase64 = parts[0]
val encryptedBase64 = parts[1]
val iv = Base64.decode(ivBase64, Base64.NO_WRAP)
val encrypted = Base64.decode(encryptedBase64, Base64.NO_WRAP)
val secretKey: SecretKey = getKey()
val cipher = Cipher.getInstance(TRANSFORMATION)
val gcmSpec = GCMParameterSpec(TAG_LENGTH, iv)
cipher.init(Cipher.DECRYPT_MODE, secretKey, gcmSpec)
val decryptedData = cipher.doFinal(encrypted)
return String(decryptedData)
}
}

View File

@@ -16,6 +16,7 @@ import com.afollestad.materialdialogs.MaterialDialog
import com.mcal.apksigner.CertCreator
import com.mcal.apksigner.utils.DistinguishedNameValues
import com.mcal.apksigner.utils.KeyStoreHelper
import org.autojs.autojs.apkbuilder.keystore.AESUtils
import org.autojs.autojs.apkbuilder.keystore.KeyStore
import org.autojs.autojs.core.pref.Pref
import org.autojs.autojs6.R
@@ -174,9 +175,9 @@ class ManageKeyStoreActivity : BaseActivity() {
val newKeyStore = KeyStore(
absolutePath = file.absolutePath,
filename = file.name,
password = configs.password,
password = AESUtils.encrypt(configs.password),
alias = configs.alias,
aliasPassword = configs.aliasPassword,
aliasPassword = AESUtils.encrypt(configs.aliasPassword),
verified = true
)
keyStoreViewModel.upsertKeyStore(newKeyStore)
@@ -247,9 +248,9 @@ class ManageKeyStoreActivity : BaseActivity() {
val verifiedKeyStore = KeyStore(
absolutePath = keyStore.absolutePath,
filename = keyStore.filename,
password = configs.password,
password = AESUtils.encrypt(configs.password),
alias = configs.alias,
aliasPassword = configs.aliasPassword,
aliasPassword = AESUtils.encrypt(configs.aliasPassword),
verified = true
)
keyStoreViewModel.upsertKeyStore(verifiedKeyStore)

View File

@@ -11,6 +11,7 @@ import android.view.ViewGroup
import android.view.WindowManager
import android.widget.LinearLayout
import androidx.fragment.app.DialogFragment
import org.autojs.autojs.apkbuilder.keystore.AESUtils
import org.autojs.autojs.apkbuilder.keystore.KeyStore
import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.DialogVerifyKeyStoreBinding
@@ -43,9 +44,9 @@ open class VerifyKeyStoreDialog(
if (keyStore.verified) {
binding.imgVerifyState.setImageResource(R.drawable.ic_key_store_verified)
binding.textVerifyState.text = getString(R.string.text_verified)
binding.password.setText(keyStore.password)
binding.password.setText(AESUtils.decrypt(keyStore.password))
binding.alias.setText(keyStore.alias)
binding.aliasPassword.setText(keyStore.aliasPassword)
binding.aliasPassword.setText(AESUtils.decrypt(keyStore.aliasPassword))
} else {
binding.imgVerifyState.setImageResource(R.drawable.ic_key_store_unverified)
binding.textVerifyState.text = getString(R.string.text_unverified)