【问题标题】:Android convert AES key generated to string (base 64 / hex ...)Android将AES密钥生成转换为字符串(base64 / hex ...)
【发布时间】:2020-05-26 13:01:35
【问题描述】:

问题描述:

我正在开发一个将生成 AES 密钥并将其存储在密钥库中的 android 应用程序。

每当我需要向服务器发送数据时,我使用 AES 密钥对数据进行加密,使用服务器公钥对 AES 密钥进行加密,然后将加密数据 + 加密密钥发送到服务器以解密全部负载。

在android中生成Key的代码如下:

public void generateKey()
{
    try {
        if (!keyStore.containsAlias(KEY_ALIAS)) {
            KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, AndroidKeyStore);
            keyGenerator.init(
                    new KeyGenParameterSpec.Builder(KEY_ALIAS,
                            KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                            .setBlockModes(KeyProperties.BLOCK_MODE_GCM).setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                            .setRandomizedEncryptionRequired(false)
                            .build());
            keyGenerator.generateKey();
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

当我需要加密数据时,我使用此函数获取密钥

private java.security.Key getSecretKey(Context context) throws Exception {
    return keyStore.getKey(KEY_ALIAS, null);
}

使用这个密钥我能够加密数据。但问题是尝试加密密钥以将其发送到服务器。

我试图将密钥作为字节 [] 来加密它,但使用函数

key.getEncoded();

生成的字节数组始终为空。

这里出了什么问题以及如何解决?

应用适用于 Android 23+

【问题讨论】:

    标签: java android encryption


    【解决方案1】:

    我不确定,但是您在进行加密之前没有保存密钥,请确保您之前在 android 密钥库中拥有它。

    这个 kotlin 示例会有所帮助:

    
    @Throws(IOException::class, KeyStoreException::class, CertificateException::class, NoSuchAlgorithmException::class)
        fun saveKeyPair(pair: KeyPair, storeAlias: String) {
            val certificate = generateCertificate(pair)
            val keyStore = KeyStore.getInstance("AndroidKeyStore")
            keyStore!!.load(null, null)
            val x509CertificateObject = X509CertificateObject(certificate)
            keyStore.setKeyEntry(storeAlias, pair!!.private, null, arrayOf<java.security.cert.Certificate?>(x509CertificateObject))
        }
    

    希望能有所帮助。

    【讨论】:

    • 生成密钥功能将密钥保存在密钥库中。因为我能够在加密/解密期间从商店本身获取密钥。但显然根据stackoverflow.com/questions/42348944/…,我无法在密钥库中编码密钥!似乎需要另辟蹊径
    • 对不起,如果遗漏了什么,但请确保保存密钥,
    • 因为你只是准备生成器,生成器实例只会根据你的规范生成请求的密钥而不保存它,对于提到的问题,看看他的问题,他这样做了,但你错过了。希望你明白我的意思。
    猜你喜欢
    • 2012-11-01
    • 2014-04-20
    • 2021-08-22
    • 1970-01-01
    • 2015-03-18
    • 2018-08-05
    • 2020-04-22
    • 2012-12-31
    • 2018-04-14
    相关资源
    最近更新 更多