标签: android-keystore

在Jenkins控制台输出中回声

我正在按照指南如何使用Jenkins签署Android apk.我已经使用KSTOREPWD和KEYPWD参与了Jenkins的工作.Jenkins的作业配置(Build-> Execute shell)的一部分是获取这些参数并将它们存储为环境变量:

export KSTOREPWD=${KSTOREPWD}
export KEYPWD=${KEYPWD}
...
./gradlew assembleRelease
Run Code Online (Sandbox Code Playgroud)

问题是当构建结束时,任何人都可以访问构建"控制台输出"并查看输入的密码; 部分输出:

08:06:57 + export KSTOREPWD=secretStorePwd
08:06:57 + KSTOREPWD=secretStorePwd
08:06:57 + export KEYPWD=secretPwd
08:06:57 + KEYPWD=secretPwd
Run Code Online (Sandbox Code Playgroud)

所以我想在export命令输出之前抑制回声并在export命令后重新启用echo .

echo jenkins android-keystore android-gradle-plugin

54
推荐指数
2
解决办法
4万
查看次数

如何使用Android KeyStore安全存储任意字符串?

我希望能够在Android KeyStore中安全地存储一些敏感字符串.我从服务器获取字符串但我有一个用例需要我坚持它们.KeyStore只允许从与分配给我的应用程序的UID相同的UID进行访问,并且它将使用设备主密码加密数据,因此我的理解是我不需要进行任何额外的加密来保护我的数据.我的麻烦是,我遗漏了一些关于如何写数据的事情.只要省略对KeyStore.store(null)的调用,我下面的代码就可以完美地工作.该代码失败,只要我将数据放入KeyStore后就无法存储,那么我就无法坚持下去.

我想我错过了关于KeyStore API的一些内容,但我不知道是什么.任何帮助赞赏!

String metaKey = "ourSecretKey";
String encodedKey = "this is supposed to be a secret";
byte[] encodedKeyBytes = new byte[(int)encodedKey.length()];
encodedKeyBytes = encodedKey.getBytes("UTF-8");
KeyStoreParameter ksp = null;

//String algorithm = "DES";
String algorithm = "DESede";
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithm);
SecretKeySpec secretKeySpec = new SecretKeySpec(encodedKeyBytes, algorithm);
SecretKey secretKey = secretKeyFactory.generateSecret(secretKeySpec);

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

keyStore.load(null);

KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey);
keyStore.setEntry(metaKey, secretKeyEntry, ksp);

keyStore.store(null);

String recoveredSecret = "";
if (keyStore.containsAlias(metaKey)) {
    KeyStore.SecretKeyEntry recoveredEntry = (KeyStore.SecretKeyEntry)keyStore.getEntry(metaKey, ksp);
    byte[] bytes …
Run Code Online (Sandbox Code Playgroud)

android android-keystore

43
推荐指数
3
解决办法
3万
查看次数

Android指纹API加密和解密

我正在使用Android M指纹API来允许用户登录该应用程序.为此,我需要在设备上存储用户名和密码.目前我有登录工作,以及指纹API,但用户名和密码都存储为纯文本.我想在存储之前加密密码,并且能够在用户使用指纹进行身份验证后检索密码.

我正在努力解决这个问题.我一直试图从Android安全样本中应用我能做的,但每个例子似乎只处理加密或签名,而不是解密.

到目前为止,我必须获得AndroidKeyStorea KeyPairGenerator和a 的实例Cipher,使用非对称加密技术来允许使用Android KeyGenParameterSpec.Builder().setUserAuthenticationRequired(true).非对称加密的原因是因为如果用户未经过身份验证,该setUserAuthenticationRequired方法将阻止对密钥的任何使用,但是:

此授权仅适用于密钥和私钥操作.公钥操作不受限制.

这应该允许我在用户使用其指纹进行身份验证之前使用公钥加密密码,然后仅在用户通过身份验证后使用私钥进行解密.

public KeyStore getKeyStore() {
    try {
        return KeyStore.getInstance("AndroidKeyStore");
    } catch (KeyStoreException exception) {
        throw new RuntimeException("Failed to get an instance of KeyStore", exception);
    }
}

public KeyPairGenerator getKeyPairGenerator() {
    try {
        return KeyPairGenerator.getInstance("EC", "AndroidKeyStore");
    } catch(NoSuchAlgorithmException | NoSuchProviderException exception) {
        throw new RuntimeException("Failed to get an instance of KeyPairGenerator", exception);
    }
}

public Cipher getCipher() {
    try {
        return …
Run Code Online (Sandbox Code Playgroud)

encryption android android-keystore android-fingerprint-api

41
推荐指数
1
解决办法
1万
查看次数

Android密钥库错误"无法在密钥库中生成密钥"

尝试为某些设备生成密钥时出错.我能够在运行4.4.2的三星Galaxy Note上重现错误.

java.lang.IllegalStateException: could not generate key in keystore
        at android.security.AndroidKeyPairGenerator.generateKeyPair(AndroidKeyPairGenerator.java:100)
        at java.security.KeyPairGenerator$KeyPairGeneratorImpl.generateKeyPair(KeyPairGenerator.java:275)
        at com.eric.demo.MainActivity.generateKeyPair(MainActivity.java:65)
        at com.eric.demo.MainActivity.onClickButton(MainActivity.java:43)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at android.view.View$1.onClick(View.java:3964)
        at android.view.View.performClick(View.java:4640)
        at android.view.View$PerformClick.run(View.java:19421)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5476)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
        at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
        at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

我创建了一个小应用程序,只通过从Android开发者页面https://developer.android.com/training/articles/keystore.html "生成新私钥"下逐行复制代码来生成密钥.

 public void onClickButton (View view) {
    try {
        generateKeyPair(this, "test3");
    } catch (Exception e){
        Log.wtf("exception", e);
    }
}

private void generateKeyPair(Context context, String alias)
    throws Exception { …
Run Code Online (Sandbox Code Playgroud)

java android runtime-error android-keystore

39
推荐指数
1
解决办法
3780
查看次数

有什么理由我不应该将我的密钥库存储在版本控制中吗?

我正在使用密钥库(.jks)来存储我用来签署我的Android应用程序的证书.Android文档和社区给我留下了深刻印象,从不丢失这个文件的重要性,但我没有找到任何关于我应该保留它的指导.

将它存储在Git中是一个糟糕的想法(即它会产生安全后果)吗?

假设密钥库本身和它们内部的私钥都有强密码.

java security android keystore android-keystore

34
推荐指数
2
解决办法
6117
查看次数

检索私钥时,链为空

我正在使用我存储在Android密钥库中的RSA密钥对加密我的应用程序中的数据.

我一直NullPointerException在Play商店看到s,但我无法重现它们:

java.lang.NullPointerException: chain == null
    at java.security.KeyStore$PrivateKeyEntry.<init>(KeyStore.java:1205)
    at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:374)
    at java.security.KeyStore.getEntry(KeyStore.java:644)
    at MyClass.getKeyStoreEntry(MyClass.java:111)
Run Code Online (Sandbox Code Playgroud)

创建密钥对的源代码

Calendar start = Calendar.getInstance();
start.setTimeInMillis(0);
Calendar end = Calendar.getInstance();
end.set(Calendar.YEAR, 3000);

KeyPairGeneratorSpec.Builder keySpecBuilder = new KeyPairGeneratorSpec.Builder(context)
    .setAlias(keyName)
    .setSubject(new X500Principal("CN=" + keyName))
    .setSerialNumber(BigInteger.TEN)
    .setStartDate(start.getTime())
    .setEndDate(end.getTime())
    .setKeySize(RSA_KEY_SIZE);

KeyPairGeneratorSpec spec = keySpecBuilder.build();
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
gen.initialize(spec);
gen.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)

然后检索密钥:

private KeyStore.PrivateKeyEntry getKeyStoreEntry() {
    KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
    keyStore.load(null);

    if (!keyStore.containsAlias(keyName)) {
        throw new KeyNotFoundException();
    }
    return (KeyStore.PrivateKeyEntry) keyStore.getEntry(keyName, null);
}
Run Code Online (Sandbox Code Playgroud)

只有当我使用KeyPairGeneratorSpecon API级别19-22 时才会发生这种情况.23+实现工作正常. …

android android-keystore private-key android-security

34
推荐指数
1
解决办法
1879
查看次数

如何从Android Studio检索已保存的密钥库密码?

新的Android Studio允许我们保存密钥库密码供以后使用.这些密码存储在我的计算机(OSX)上的哪里,有没有办法检索保存的值?

在此输入图像描述

编辑 我正在寻找别名密码,而不是密钥库密码

android android-keystore android-studio

28
推荐指数
7
解决办法
1万
查看次数

Android P - KeyStore异常android.os.ServiceSpecificException

如果我在Android P上运行此代码,我会收到以下异常:

private static KeyStore.PrivateKeyEntry getPrivateKeyEntry(String alias) {
        try {
            KeyStore ks = KeyStore
                    .getInstance(SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
            ks.load(null);
            KeyStore.Entry entry = ks.getEntry(alias, null);

            if (entry == null) {
                Log.w(TAG, "No key found under alias: " + alias);
                Log.w(TAG, "Exiting signData()...");
                return null;
            }

            if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
                Log.w(TAG, "Not an instance of a PrivateKeyEntry");
                Log.w(TAG, "Exiting signData()...");
                return null;
            }
            return (KeyStore.PrivateKeyEntry) entry;
        } catch (Exception e) {
            Log.e(TAG, e.getMessage(), e);
            return null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

例外:

在android.os.Parcel.readException的android.os.Parcel.readException(Parcel.java:1910)的android.os.Parcel.createException(Parcel.java:1956)上的KeyStore异常android.os.ServiceSpecificException :(代码7) (Parcel.java:1860)位于android.security.keynd.KandStoreStoreSpi的android.security.IKeystoreService $ Stub …

java android keystore android-keystore

26
推荐指数
2
解决办法
8026
查看次数

在Android M和旧版本中使用KeyStore加密和解密用户名?

我正在尝试使用KeyStore在应用程序中加密和解密用户名,

使用KeyPairGeneratorSpec在旧版本中创建密钥,如18到22,

KeyPairGeneratorSpec如被depricated android的M的23版本,但版本的Android M支持KeyGenParameterSpec.

此KeyGenParameterSpec是否支持向后兼容性或如何执行此操作?

我尝试了这样的事情,有没有更好的解决方案.现在工作正常!

在加密和解密的Ciper.getInstance时我需要这样做.是否有任何单个参数"RSA/ECB/OAEPWithSHA-256AndMGF1Padding"或"RSA/ECB/PKCS1Padding"我可以通过这两个版本

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
            c =  Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
        }else{
            c =  Cipher.getInstance("RSA/ECB/PKCS1Padding");
        }
Run Code Online (Sandbox Code Playgroud)

下面的代码现在工作正常,让我知道如何改善这一点.

密钥生成器:

genkey(){
KeyPairGenerator generator = KeyPairGenerator .getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
            if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
                TCLog.e(TAG,"Current version is 23(MashMello)");
                //Api level 23

                KeyGenParameterSpec spec = new  KeyGenParameterSpec.Builder(
                             keyName,
                            KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT )
                            .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
                            .build();
                generator.initialize(spec);
            }else{
                TCLog.e(TAG,"Current version is < 23(MashMello)");
                //api level 17+ 4.4.3
                KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(getActivity())
                        .setAlias(keyName)
                        .setSubject(new X500Principal("CN=Sample Name, O=Android Authority"))
                        .setSerialNumber(BigInteger.ONE)
                        .setStartDate(start.getTime())
                        .setEndDate(end.getTime())
                        .build(); …
Run Code Online (Sandbox Code Playgroud)

encryption android cryptography rsa android-keystore

25
推荐指数
1
解决办法
5642
查看次数

Android Studio - Keystore被篡改,或密码不正确

我正在尝试使用Android Studio v1.4中的内置小部件生成已签名的APK.

但是,我遇到了这个恼人的错误

错误:任务':app:packageRelease'的执行失败.无法从商店"C:\ Users\Lancelot\Desktop\release.jks"读取密钥cckey:密钥库被篡改,或密码不正确

我能够检索我的密钥别名,如下面的截图 在此输入图像描述

(为了到达这里,密钥库密码必须正确;否则它将显示错误)

然后我输入了我的密码,但是在签署APK时没有运气......我甚至尝试使用命令行更改密钥密码keytool -keypasswd -alias cckey -keystore C:\Users\Lancelot\Desktop\release.jks.通过运行这个我需要在输入新密码之前正确输入旧密码,这一切都经过了; 这证明密钥密码首先没有错.

所以问题是,如果我的密钥存储密码,密钥别名和密钥密码都是正确的,那么它有什么问题呢?

java android keystore android-keystore

23
推荐指数
6
解决办法
4万
查看次数