如何为不同的变体设置不同的签名配置?
例如,我们目前有两种版本的buildtypes Debug/Beta/Release,免费和付费,产生了6种变体.为了使它更容易一点,让我们忘记Debug变体,只关注freeBeta/paidBeta/freeRelease/paidRelease.
我想要的是,每个变体都使用单独的不同的signedConfig.
到目前为止,我能找到的唯一解决方案是将signingConfigs置于buildTypes中,以便所有Beta变体都具有相同的signingConfigs:
buildTypes {
beta {
signingConfigs.beta
}
release {
signingConfigs.release
}
}
Run Code Online (Sandbox Code Playgroud)
或者,使用flavor,在这种情况下,所有免费变体都具有相同的signingConfigs:
productFlavors {
free {
signingConfig signingConfigs.free
applicationId 'com.example.free'
}
paid {
signingConfig signingConfigs.paid
applicationId 'com.example.paid'
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在当前的productFlavor闭包中执行此操作?只能通过覆盖android.applicationVariants.all { variant ->并根据某些命名方案或其他一些丑陋的黑客手动为每个应用程序变体应用signingConfig 来解决这个问题吗?
我也找到了这个答案,但它似乎不适用于最新的构建工具; 编译时我收到以下错误:
FAILURE:构建因异常而失败.
其中:构建文件'/home/dev/projects/app/build.gradle'行:61
出了什么问题:评估项目':app'时出现问题.
在ProductFlavor容器上找不到属性'free'.
我尝试使用Google示例(BasicAndroidKeyStore)生成密钥对.我做的唯一修改是设置setUserAuthenticationRequired(true)在KeyGenParameterSpec.Builder.
我认为它可以在带有嵌入式指纹扫描仪的设备上正常工作,但是在OnePlus One上运行(在Android 6.0下工作),我得到以下异常:
At least one fingerprint must be enrolled to create keys requiring user authentication for every use
手机确实设置了锁定屏幕以使用该模式,但显然它需要指纹进行身份验证.知道如何在没有实际指纹识别器的情况下使用API 23密钥库吗?
android android-keystore android-security android-fingerprint-api
我正在尝试更新现有的 Android 应用程序,但在生成签名 APK 时出现以下错误消息:算法 HmacPBESHA256 不可用
我在互联网上搜索了解决方案,包括在 StackOverflow 上搜索,但我在任何地方都找不到解决方案。我知道当前的密钥库使用 SHA1withRSA,但如何将其转换为 HmacPBESHA256 我不知道。不幸的是,Google Play 支持也无法帮助我,因为这个问题太技术性了。
为了清楚起见,以下是完整的通知:
任务“:app:packageRelease”执行失败。执行 com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable com.android.ide.common.signing.KeytoolException 时发生故障:无法从存储“/Users/KDApps/Documents/KDApps/original-signing 读取密钥 1” -keystore.jks”:完整性检查失败:java.security.NoSuchAlgorithmException:算法 HmacPBESHA256 不可用
为什么显示创建密钥库失败?
我尝试了很多但没有成功。我输入了所有正确的信息,但它有效。
出于某种原因,我收到了这条消息:
keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect
我知道我无法"修复"密钥库,但我想重置密钥库,但不知道该怎么做,特别是因为我不知道默认密钥库的位置.
注意:我只想要"空白",所以我从默认重启.我仍然无法察觉他们的位置.
如何使用keytool或类似名称列出默认密钥库及其位置?
我试图在用户通过Android M指纹API进行身份验证后解密加密文本.我一直在尝试遵循Android安全示例以及KeyGenParameterSpec文档中提供的示例.我已经能够成功地加密与公钥的文本,但是当我打电话cipher.doFinal用Cipher在使用私有密钥DECRYPT_MODE,我得到一个KeyStoreException"未知错误":
03-15 10:06:58.074 14702-14702/com.example.app E/LoginFragment: Failed to decrypt password
javax.crypto.IllegalBlockSizeException
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:486)
at javax.crypto.Cipher.doFinal(Cipher.java:1502)
at com.example.app.ui.fragment.util.LoginFragment.onAuthenticationSucceeded(LoginFragment.java:251)
at com.example.app.ui.controller.FingerprintCallback.onAuthenticationSucceeded(FingerprintCallback.java:21)
at android.support.v4.hardware.fingerprint.FingerprintManagerCompat$Api23FingerprintManagerCompatImpl$1.onAuthenticationSucceeded(FingerprintManagerCompat.java:301)
at android.support.v4.hardware.fingerprint.FingerprintManagerCompatApi23$1.onAuthenticationSucceeded(FingerprintManagerCompatApi23.java:96)
at android.hardware.fingerprint.FingerprintManager$MyHandler.sendAuthenticatedSucceeded(FingerprintManager.java:805)
at android.hardware.fingerprint.FingerprintManager$MyHandler.handleMessage(FingerprintManager.java:757)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.security.KeyStoreException: Unknown error
at android.security.KeyStore.getKeyStoreException(KeyStore.java:632)
at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:224)
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:473)
at javax.crypto.Cipher.doFinal(Cipher.java:1502)
at com.example.app.ui.fragment.util.LoginFragment.onAuthenticationSucceeded(LoginFragment.java:251)
at com.example.app.ui.controller.FingerprintCallback.onAuthenticationSucceeded(FingerprintCallback.java:21)
at android.support.v4.hardware.fingerprint.FingerprintManagerCompat$Api23FingerprintManagerCompatImpl$1.onAuthenticationSucceeded(FingerprintManagerCompat.java:301)
at android.support.v4.hardware.fingerprint.FingerprintManagerCompatApi23$1.onAuthenticationSucceeded(FingerprintManagerCompatApi23.java:96)
at android.hardware.fingerprint.FingerprintManager$MyHandler.sendAuthenticatedSucceeded(FingerprintManager.java:805)
at android.hardware.fingerprint.FingerprintManager$MyHandler.handleMessage(FingerprintManager.java:757)
at android.os.Handler.dispatchMessage(Handler.java:102)
at …Run Code Online (Sandbox Code Playgroud) encryption android keystore android-keystore android-fingerprint-api
我在 build.gradle 文件中指定了不同的 productFlavors
dev {
applicationId "com.advancedprogressive.chare.dev"
versionCode 83
versionName "2.2.1"
}
staging {
applicationId "com.advancedprogressive.chare.qa"
versionCode 119
versionName "2.8.1"
}
Run Code Online (Sandbox Code Playgroud)
并且有像这样的签名配置
signingConfigs {
release {
storeFile
storePassword
keyAlias
keyPassword }
debug {
keyPassword
storeFile
keyAlias
storePassword
}
}
Run Code Online (Sandbox Code Playgroud)
我对两种口味都有不同的键控器。我可以为不同的构建类型指定不同的密钥库,例如调试/发布,但我如何为每种风格指定不同的密钥库。
我使用 KeyStore (Android 9) 生成 AES 密钥,并使用isInsideSecureHardware()方法检查密钥是否isInsideSecureHardware。我得到了 return False。示例代码可以在此处和此处找到。
公共布尔 isInsideSecureHardware ()
如果密钥驻留在安全硬件(例如,可信执行环境 (TEE) 或安全元件 (SE))内,则返回 true。此类密钥的密钥材料仅在安全硬件内部以明文形式提供,并且不会暴露在安全硬件外部。
因此,我想进一步确认我的手机设备(华为P20)是否支持TEE。
问题:
如果手机支持TEE,KeyStore生成的密钥会自动存储到TEE中吗?我需要在 Java 中进行任何手动配置吗?我听说只要使用KeyStore.getInstance()、KeyGenerator .getInstance(algorithm, KeyStore Name) ,密钥就会自动存储在 TEE 中。但我不确定这是真的还是假的?
如果问题1的答案是“需要手动配置”,那就成为isInsideSecureHardware () 返回False的原因,对吧?如果 Q1 的答案是“自动”,则忽略 Q2。
有什么方法可以在Java中直接检查手机是否支持TEE?
在我的 Android 项目中,我想以安全的方式存储 API 密钥。该密钥是从应用程序外部生成的,需要在构建应用程序之前以某种方式存储在应用程序中。
我已经看到了一些如何使用 KeyStore 的示例(例如this或this),但据我了解,这些是存储运行时生成的密钥的解决方案,而不是我将存储在代码中某处的密钥。
我还检查了此处解释的其他方法,但由于逆向工程,它们看起来可以很容易地检索 API 密钥。
我也不想将我的密钥存储在我的代码中,也是因为它可以通过逆向工程轻松检索。
其目的是能够在每次调用我制作的网络服务时发送该密钥,因此我确定(或几乎确定)该调用来自我正在制作的原始应用程序,这将是在 Play 商店上发布,而不是从其他地方发布。
我远不是安全专家,所以任何帮助将不胜感激。
谢谢。
在阅读了大量文章和 stackoverflow 帖子后,与使用非加密对应部分相比,我找不到使用 EncryptedSharedPreferences 或 EncryptedFile 的具体原因。
\n首先,我想谈谈必须考虑安全性的设备的两种状态:
\n当设备未受到损害时,应用程序将被沙箱化。只要应用程序遵循Android 的安全最佳实践,那么应用程序就应该没问题——安全方面。由于当设备不包含在内时,内部应用程序数据是安全的,因此无需对其进行加密。
\n当设备受到损害时,应用程序几乎无法保护自己。唯一真正的策略是最大限度地减少设备上的敏感数据量。然而,EncryptedSharedPreferences 和 EncryptedFile 似乎意味着即使设备受到威胁,它也可以保护用户数据,正如 Android 博客Data Encryption on Android with Jetpack Security中所述:
\n\n\n为什么要加密应用程序中的数据?Android从5.0开始默认加密用户数据分区的内容吗?当然可以,但在某些用例中,您可能需要额外级别的保护...在应用程序主目录中,如果您的应用程序处理敏感信息(包括但不限于个人身份信息 (PII)),则您的应用程序应该加密数据、健康记录、财务详细信息或企业数据。
\n
但“额外保护级别”是什么意思呢?根据同一个博客:
\n\n\n在我们开始加密您的数据之前,了解如何保证您的加密密钥的安全非常重要。Jetpack Security 使用主密钥...生成并存储在 AndroidKeyStore 中。
\n
因此Jetpack的EncryptedSharedPreferences和EncyptedFile使用KeyStore来生成和存储用于加密的密钥。这是通过检查源代码来验证的。而这也是问题所在。
\nKeyStore无意生成密钥来加密设备本地数据。正如Android - What are the effective security Benefits …
security encryption android android-keystore android-jetpack
android-keystore ×10
android ×9
encryption ×2
gradle ×2
java ×2
keystore ×2
apk ×1
build.gradle ×1
cryptography ×1
keytool ×1
security ×1
signed-apk ×1