Android Keystore的密码保护

时间:2016-08-05 06:29:46

标签: android security xamarin xamarin.android android-keystore

我们使用Anroid Keystore存储一些机密数据并为Keystore设置密码。此密码与load,getKey和setKeyEntry方法中的KeyStore类一起使用。

密钥库本身是加密的,应用程序只能查看和查询自己的数据,所以我们可以说数据在密钥库中有些安全,但我们如何保护与密钥库帐户关联的密码?我在网上找到了很多例子,其中大多数都在代码中使用了硬编码密码或者使用了null参数。

请参阅以下示例。我想知道什么是保护硬编码密码的最佳方法? 想在Android设备中找到一种安全的方式来存储这个硬编码的密码。假设将它移动到外部位置,如数据库,服务调用等选项不可用。

Context context;
KeyStore ks;
KeyStore.PasswordProtection prot;

static readonly object fileLock = new object ();

const string FileName = "Xamarin.Social.Accounts";
static readonly char[] Password = "3295043EA18CA264B2C40E0B72051DEF2D07AD2B4593F43DDDE1515A7EC32617".ToCharArray ();

public AndroidAccountStore (Context context)
{
    this.context = context;
    ks = KeyStore.GetInstance (KeyStore.DefaultType);
    **prot = new KeyStore.PasswordProtection (Password);**
    try {
        lock (fileLock) {
            using (var s = context.OpenFileInput (FileName)) {
                ks.Load (s, Password);
            }
        }
    }
    catch (FileNotFoundException) {
        //ks.Load (null, Password);
        LoadEmptyKeyStore (Password);
    }
}

1 个答案:

答案 0 :(得分:0)

假设无法将其移动到数据库,服务呼叫等外部位置

您想在本地用户的计算机上安全地存储敏感信息。 唯一的方法就是加密它。最受欢迎的加密算法是AES,幸运的是,Microsoft在C#中包含了它的实现。

但是,加密使用密钥来加密/解密数据,因此我们基本上将问题移回了-现在我们需要安全地存储该加密密钥。

您可以在应用程序中对该密钥进行硬编码,但是专门的攻击者仍可以获取它并解密密码。

相反,请从用户那里获得该密码。要求他们提供密码,对其进行哈希处理(例如,使用SHA256),然后将哈希值用作加密的密钥。