GVKun编程网logo

使用Android KeyStore存储用户身份验证凭据(安卓凭据存储)

19

本文将为您提供关于使用AndroidKeyStore存储用户身份验证凭据的详细介绍,我们还将为您解释安卓凭据存储的相关知识,同时,我们还将为您提供关于AndroidJava更新证书和AndroidKe

本文将为您提供关于使用Android KeyStore存储用户身份验证凭据的详细介绍,我们还将为您解释安卓凭据存储的相关知识,同时,我们还将为您提供关于Android Java更新证书和Android KeyStore中的私钥、android keystore、Android keystore 调试、Android Keystore存储访问令牌的实用信息。

本文目录一览:

使用Android KeyStore存储用户身份验证凭据(安卓凭据存储)

使用Android KeyStore存储用户身份验证凭据(安卓凭据存储)

我正在尝试用户身份验证方法(准确的指纹),我也在研究 Android KeyStore.我正在尝试构建一个允许用户设置指纹的系统,该指纹将用户登录到我的服务器.目前,服务器需要POST请求,该请求需要有效的用户名/密码组合.

我有一些关于它如何工作的问题,因为我只有初学者对Fingerprint API和KeyStore如何工作的理解.

1)当我提示指纹并获得成功的响应时(这很容易完成) – 如何将其转换为有效的用户名/密码,以便我可以启动POST请求?我是否需要将用户名和密码存储到KeyStore中?

2)当我设置KeyStore时,它的外观究竟如何?我是否需要为用户名和密码设置别名? “myapp_user”,“myapp_pass”例如?

3)如何将用户名和密码的值存储到KeyStore中?

4)我是否正确地解决了这个问题?有没有更好的方法将指纹安全地链接到用户名/密码组合?

感谢您的任何帮助!

解决方法

使用AndroidKeystore的一般过程是在AndroidKeyStore中生成密钥.该密钥永远不会离开密钥库(无法导出),但只要您使用特定算法(并非所有算法都受支持),您就可以使用它.你可以看到 here哪个Android版支持哪种加密类型.

在Android API 23上,您可以直接生成AES密钥(在AndroidKeyStore中)并使​​用该AES密钥加密您的使用数据,例如您提到的用户凭据.

在API23之前需要执行其他步骤:首先在AndroidKeyStore中生成RSA密钥,然后在AndroidKeystore之外生成随机AES密钥(因为不支持AES内部).然后使用您在AndroidKeyStore中生成的RSA密钥加密生成的AES密钥,并将加密的AES密钥保存到私有app数据目录中.

之后,您可以在选项1中使用生成的AES密钥加密用户凭据.

Android Java更新证书和Android KeyStore中的私钥

Android Java更新证书和Android KeyStore中的私钥

我有一个使用HTTPS客户端证书进行身份验证的系统,但根据以下过程生成证书本身:

>客户端设备生成证书(包括公钥和私钥)
>客户端设备将公钥发送到服务器,该服务器对公钥进行签名,并将其作为签名证书返回
>客户端以安全的方式存储证书,然后将其用作HTTPS客户端证书

我们有这个系统在iOS上工作,我正在尝试移植到android,但遇到了很多问题,因为Android的文档记录不清,安全API混乱.

我的代码大致如下:

生成证书

keyStore = KeyStore.getInstance(ANDROID_KEYSTORE);
keyStore.load(null);

Date startDate = new Date();
Date endDate = new Date(startDate.getTime() + FORTY_YEARS_IN_MILLISECONDS);

KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
        .setAlias(alias)
        .setKeySize(2048)
        .setKeyType(KeyProperties.KEY_ALGORITHM_RSA)
        .setSubject(new X500Principal("CN=" + alias))
        .setSerialNumber(BigInteger.TEN)
        .setStartDate(startDate)
        .setEndDate(endDate)
        .build();

KeyPairGenerator generator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA,ANDROID_KEYSTORE);
generator.initialize(spec);
KeyPair keyPair = generator.generateKeyPair(); // this will put a certificate and key pair in the keyStore.
dumpKeyStore(keyStore);

byte[] entireKey = keyPair.getPublic().getEncoded();
// chop off first 24 bytes; the java key pair generator puts an object ID of  1.2.840.113549.1.1.1 RSA (RSA_SIGN) before the key which gets mangled when the server signs and sends back the certificate
byte[] publicKeyBytes = Arrays.copyOfRange(entireKey,24,entireKey.length);

dumpKeyStore是一个实用程序方法,它迭代密钥库,调用keyStore.getEntry来获取每个条目,并且只记录事物.
此时,它报告存在具有给定别名的单个条目,并且其类型为KeyStore.PrivateKeyEntry.它有一个关联的证书和公钥,可以从PrivateKeyEntry中重新获得.

发送到服务器

publicKeyBytes被发送到服务器,服务器将其作为新的签名x509证书的公钥,该证书将在响应中发回.我没有放入代码,它只是基本的网络.返回的证书加载,看起来很好.

保存并关联证书

我试图用相同的别名将它放入keyStore,因此它(理论上)可以与之前的正确私钥相关联.到目前为止我的代码是这样的:

KeyStore keyStore;
try {
    keyStore = KeyStore.getInstance(ANDROID_KEYSTORE);
    keyStore.load(null);
}catch (IOException | NoSuchAlgorithmException | CertificateException e) {
    Log.wtf(TAG,e);
    throw new FatalError(TAG,e);
}

CertificateFactory certificateFactory;
try {
    certificateFactory = CertificateFactory.getInstance("X.509");
} catch (CertificateException e) {
    Log.wtf(TAG,e);
}

Certificate cert = certificateFactory.generateCertificate(new ByteArrayInputStream(certificateFromServer));

// find the existing certificate,copy it''s private key out,then replace the certificate with the one from the server but keeping the private key
try {
    KeyStore.PrivateKeyEntry existingPrivateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias,null);

    KeyStore.PrivateKeyEntry newEntry = new KeyStore.PrivateKeyEntry(existingPrivateKeyEntry.getPrivateKey(),new Certificate[]{ cert });
    keyStore.setEntry(alias,newEntry,null);
} catch (Exception e) {
    Log.wtf(TAG,e);
}
dumpKeyStore(keyStore);

此时,最终的dumpKeyStore指示存在具有正确别名的条目,但是当它尝试调用keyStore.getEntry时会引发“NoSuchAlgorithmException:UnkNown key entry”异常.

我想在android中做什么(替换证书但保留私钥)?如果是这样,我该怎么做?看起来这不是真的有效

谢谢

猎户座

解决方法

事实证明,我做错了.您不需要替换或修改KeyStore中的证书,只需在初始化HttpsURLConnection使用的SSLContext时使用自定义KeyManager,并且KeyManager可以选择您想要的任何证书或私钥.

这极大地简化了KeyStore管理.我的情景现在

>使用KeyPairGenerator生成公钥/私钥对,别名为X.
>将公钥发送到服务器,该服务器从该公钥生成新的签名证书,然后将其发回
>使用带有别名X-Signed的setCertificateEntry将此签名证书放入KeyStore

当我建立HttpsURLConnection时,它是这样的:

KeyStore androidKeyStore = KeyStore.getInstance(LocalKeyStore.ANDROID_KEYSTORE);
androidKeyStore.load(null);

X509Certificate signedClientCertificate = (X509Certificate)androidKeyStore.getCertificate("X-Signed");
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)androidKeyStore.getEntry("X",null);

X509ExtendedKeyManager keyManager = new X509ExtendedKeyManager() {
    @Override
    public String chooseClientAlias(String[] keyType,Principal[] issuers,Socket socket) {
        return clientCertificatealias;
    }
    @Override
    public String chooseServerAlias(String keyType,Socket socket) {
        return null; // different if you''re validating the server''s cert
    }
    @Override
    public X509Certificate[] getCertificateChain(String alias) {
        return new X509Certificate[] { signedClientCertificate };
    }
    @Override
    public String[] getClientAliases(String keyType,Principal[] issuers) {
        return new String[]{ "X" };
    }

    @Override
    public String[] getServerAliases(String keyType,Principal[] issuers) {
        return null; // different if you''re validating server''s cert
    }
    @Override
    public PrivateKey getPrivateKey(String alias) {
        if(alias != clientCertificatealias) {
            Log.e(TAG,String.format("X509ExtendedKeyManager is asking for privateKey with unkNown alias %s. Expecting it to ask for %s",alias,clientCertificatealias));
            return null;
        }
        return privateKeyEntry.getPrivateKey();
    }
};

x509trustmanager trustServerCertificates = new x509trustmanager() {
    @Override
    public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {
        // do nothing,this method doesn''t get called
    }
    @Override
    public void checkServerTrusted(X509Certificate[] chain,String authType) 
        // code to validate server''s cert in here
    }
    @Override
    public X509Certificate[] getAcceptedissuers() {
        return null; // any issuer
    }
};

m_sslContext = SSLContext.getInstance("TLS");
m_sslContext.init(new KeyManager[]{ keyManager },new TrustManager[] { trustServerCertificates },null);

// later on

conn = (HttpURLConnection)url.openConnection();
SSLContext sslContext = m_sslContext;

if(conn instanceof HttpsURLConnection && sslContext != null) {
    ((HttpsURLConnection)conn).setSSLSocketFactory(sslContext.getSocketFactory());
}

这对我很有用,我可以继续使用AndroidKeyStore,它的每个应用程序隐私和硬件支持的存储

android keystore

android keystore

我用 eclipse 在其他路径生成了一个 keystore,但是 password 是随便写的,现在我能修改 password 吗?

Android keystore 调试

Android keystore 调试

以下以window为例,其他平台相应修改。

默认debug.keystore位置:

C:\Users\[username]\.android\debug.keystore

默认密码为:android

alias为:androiddebugkey

alias密码为:android

 

故需要将正式签名的keysore复制一份做为debug.keystore,并将密码和别名修改为与debug.keystore一致,Eclipse就能识别了。

keytool命令位置:(加到环境变量就可以在cmd中使用)

JAVA_HOME\bin\keytool.exe

 

查看签名

keytool -list -keystore xxx.keystore

修改别名

keytool -changealias -keystore xxx.keystore -alias [原别名] -destalias androiddebugkey 

修改别名密码:

keytool -keypasswd -keystore  xxx.keystore -alias androiddebugkey

修改默认密码:

keytool -storepasswd -keystore  xxx.keystore

最后配置Eclipse:

Window->Preferences->Android->Build->Custom debug keystore

 

Android Keystore存储访问令牌

Android Keystore存储访问令牌

在我的应用程序中,当用户使用OAuth成功进行身份验证时,我需要存储REST API返回的访问令牌.我正在考虑使用密钥库来存储此令牌,以便在应用程序中进一步使用.但到目前为止,我还没有看到使用android密钥库API存储已生成密钥的实现.是否有任何存储已生成令牌的示例或代码段.

此外,如果我使用密钥库来存储访问令牌,那么有根电话的用户是否可以访问这些令牌?

谢谢.

最佳答案
以下博客文章提供了有关如何执行此操作的非常好的解释.

http://nelenkov.blogspot.com/2012/05/storing-application-secrets-in-androids.html

如果有根电话的用户可以获得对这些令牌的访问权限(如果它们是加密的话)也无关紧要.幸运的是,Android的系统密钥库守护程序使用AES加密密钥.

今天关于使用Android KeyStore存储用户身份验证凭据安卓凭据存储的分享就到这里,希望大家有所收获,若想了解更多关于Android Java更新证书和Android KeyStore中的私钥、android keystore、Android keystore 调试、Android Keystore存储访问令牌等相关知识,可以在本站进行查询。

本文标签: