首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >存储RSA私钥Android

存储RSA私钥Android
EN

Stack Overflow用户
提问于 2013-11-21 01:18:36
回答 3查看 29.5K关注 0票数 22

在创建简单消息传递android应用程序的过程中,我决定使用RSA公钥/私钥加密。问题是如何存储私钥,以便即使手机被恶意扎根,密钥也会保持安全?据我所知,KeyStore是用来认证的,不能用来做这个吗?我应该用AES将私钥加密为文本文件吗?我在安全方面的经验很少,所以请随时纠正我的想法,并给出你的意见!

致以亲切的问候。

EN

回答 3

Stack Overflow用户

发布于 2013-11-21 01:41:38

我认为KeyStore可以适合您的使用。它能够存储RSA密钥并使用AES对其进行加密,因此即使使用root访问,也无法在没有密码或暴力破解的情况下提取它们。

这里有一个关于使用KeyStore的很好的帖子:http://nelenkov.blogspot.fr/2012/05/storing-application-secrets-in-androids.html

票数 9
EN

Stack Overflow用户

发布于 2014-04-01 15:04:49

你可以使用android上的SharedPreference保存你的RSA公钥/私钥。为了在手机被恶意扎根时保护您的密钥安全,您可以执行以下步骤:

1:当你想要加密任何数据时,生成一个密钥对。

2:提示用户输入密码。

3:使用该密码生成对称密钥来加密您的私钥。

4:您可以使用公钥对数据进行加密,使用私钥进行解密。

5:您可以为步骤2中提示的密码保留会话,在会话期间,您可以使用对称密钥(由密码生成)对私钥进行加密/解密。

下面的代码片段展示了如何存储和获取公钥

代码语言:javascript
复制
public void setPublicKey(PublicKey publicKey, String key, Context context) {

    byte[] pubKey = publicKey.getEncoded();
    String pubKeyString = Base64.encodeBytes(pubKey);
    this.setString(key, pubKeyString, context);
}

public PublicKey getPublicKey(String key,Context context) {

    PublicKey pKey = null;
    try {

        String pubString = this.getString(key, context);

        if(pubString!=null) {
            byte[] binCpk = Base64.decode(pubString);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(binCpk);
            pKey = keyFactory.generatePublic(publicKeySpec);
        }
        }catch(Exception e){
    }
    return pKey;
}

下面的代码片段展示了如何存储和获取私钥。

代码语言:javascript
复制
public void setPrivateKey(PrivateKey privateKey, String key, Context context) {

    byte[] priKey = privateKey.getEncoded();
    String priKeyString = Base64.encodeBytes(priKey);
    this.setString(key, priKeyString, context);
}

public PrivateKey getPrivateKey(String key, Context context) {

    PrivateKey privateKey = null;

    try {
        String privateString = this.getString(key, context);
        if(privateString!=null){
            byte[] binCpk = Base64.decode(privateString);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(binCpk);
            privateKey = keyFactory.generatePrivate(privateKeySpec);
        }
    } 
    catch(Exception e){
    }
    return privateKey;
}
票数 4
EN

Stack Overflow用户

发布于 2015-08-21 19:16:14

文件系统中的密钥存储库(P12、JKS、AKS)都不能足够安全,无法保存RSA私钥。只有SmartCard或安全令牌可以提供高级别安全性。阅读这本书:"Android安全内部原理“。在这本书中,你会找到很好的Android安全和JCA提供商的描述。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20102570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档