Android KeyStore - 密钥并不总是持久存在

2024-02-19

在我的应用程序中,我们使用 RSA 密钥,该密钥是应用程序在第一次启动时生成的(使用 Android 密钥存储)。由于未知原因,应用程序无法从某些设备上的密钥存储中检索密钥。我检查了日志,但找不到此错误与特定操作系统版本或特定设备型号之间的关联。另外,我确信应用程序仅在创建密钥后才尝试读取它。所以 - 我的问题是:据我所知,android 密钥存储应该是持久的。什么会导致这样的错误?

以下是相关代码示例。

密钥生成:

try {
        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", keyStore.getProvider());

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
            KeyGenParameterSpec spec;
            spec = new KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT| KeyProperties.PURPOSE_SIGN| KeyProperties.PURPOSE_VERIFY)
                    .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
                    .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
                    .setKeySize(2048)
                    .build();

            generator.initialize(spec);
        } else {
            Calendar start = new GregorianCalendar();
            Calendar end = new GregorianCalendar();
            end.add(Calendar.YEAR, 500);

            KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
                    .setAlias(alias)
                    .setSubject(new X500Principal("CN="+ subject))
                    .setSerialNumber(BigInteger.valueOf(new Random().nextInt(Integer.MAX_VALUE)))
                    .setStartDate(start.getTime())
                    .setEndDate(end.getTime())
                    .setKeySize(2048)
                    .build();

            generator.initialize(spec);
        }
        return generator.generateKeyPair();
    } catch (Exception e) {
        logger.warn("Failed to create private key in store", e);
        return null;
    }

密钥库本身使用以下代码进行初始化:

KeyStore androidKeyStore = KeyStore.getInstance("AndroidKeyStore");
            androidKeyStore.load(null);
            return androidKeyStore;

我们使用以下代码来检索密钥,错误是在某些设备上密钥库返回 null:

        try {
        Key key = keyStore.getKey(alias, null);

        if (key == null){
            logger.warn("Key not found in key store");
            return null;
        }

        if (key instanceof PrivateKey) {
            // Get certificate of public key
            Certificate cert = keyStore.getCertificate(alias);

            // Get public key
            PublicKey publicKey = cert.getPublicKey();

            // Return a key pair
            return new KeyPair(publicKey, (PrivateKey) key);
        } else {
            logger.warn("Key found, but not from current type. type found: " + key.getClass().getSimpleName());
        }
        return null;
    }catch (Exception e){
        logger.warn("Failed to get private key in store", e);
        return null;
    }

谢谢, 奥马尔


以防万一有人遇到同样的问题: 我发现适用于 Android 的 Azure Active Directory 库也遇到类似的问题issue https://github.com/AzureAD/azure-activedirectory-library-for-android/pull/615,通过阅读代码,我看到它们链接到two https://code.google.com/p/android/issues/detail?id=61989 issues https://code.google.com/p/android/issues/detail?id=177459与这个问题以及我们遇到的另一个问题类似。因此,我计划使用基于 p12 文件的密钥库,存储在应用程序私有存储中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android KeyStore - 密钥并不总是持久存在 的相关文章

  • Flutter android 风味生成 apk

    我正在尝试使用 flutter 设置 Android 风格 我有两个入口点 lib main prod dart lib main dev dart 我还在我的 gradle 文件中添加了以下内容 flavorDimensions vers
  • Android ListView 子项

    我最近为 Android 应用程序创建了一个新的 ListView 对象 但遇到了一些错误 当我尝试使用简单适配器创建一个包含列表中子项目的项目时 创建的最新项目与其他项目重叠 我正在使用地图列表来创建项目 例如 如果我向地图列表中添加一个
  • 如何以编程方式禁用 Android AppWidget 按钮上的 onClick 处理程序

    我在 appwidget 上有一个按钮 我需要从服务中以编程方式 启用 禁用 第一个想法是打电话setBoolean R id buttonid setClickable false 禁用它 但显然你不能打电话setClickable远程
  • 使用 Gradle 检测 IDE 环境

    无论如何 有没有办法检测我正在运行我的项目的环境 像这样的事情 构建 gradle def usingIntelliJ def usingAndroidStudio if usingIntelliJ buildConfigField Str
  • 使用 Firebase Java API 检索/格式化数据的最佳方式

    我在用着Firebase用于数据存储Android项目 并使用Firebase Java API来处理数据 不过 我不确定我是否尽可能高效地完成此操作 并且我希望获得一些有关检索和格式化数据的最佳实践的建议 我的Firebase存储库看起来
  • Kotlin自定义get执行方法调用

    为了提高对 SharedPreferences Editor 调用的可读性 我想使用一个 Kotlin 变量 每次需要新的 SharedPreferences Editor 时都会执行 getSharedPreferences edit 最
  • Android Studio 3.2.1 升级后构建错误

    我正在从 Udacity 构建一个示例项目 到目前为止 一切正常 但升级到 Android Studio 3 2 1 后 我遇到了下面的构建错误 摇篮版本 4 6 项目链接 https github com udacity ud851 Su
  • 是否可以将 BitmapDescriptor 转换为 Bitmap?

    我需要将 BitmapDescriptor 转换为 Bitmap 我可以使用以下代码将位图转换为 BitmapDescriptor BitmapDescriptor bd BitmapDescriptorFactory fromBitmap
  • 无法解析 ListView 适配器中的 getSystemService 方法

    我正在研究约翰霍顿的Android 编程初学者 目前正在尝试创建一个笔记应用程序 霍顿刚刚介绍ListViews 但是 我遇到了麻烦adapter class public class NoteAdapter extends BaseAda
  • Facebook 登录按钮:应用自定义样式

    我在使用新的 Facebook android sdk 4 时遇到了一个奇怪的问题 对于旧的 sdk 版本 我使用的是
  • android 中的 lang.NumberFormatException

    我有以下代码 除了在后台线程中从数据库读取一些值并使用这些值之外什么也不做 我使用 jar 绘制折线图 对于我用于每个数组值的折线图 问题是第三个我传递给绘制 LineChart 的构造函数的参数是 float float viteza S
  • 在选择项目之前设置微调器的文本

    我有一个包含三个项目的微调器 我使用 XML 字符串数组资源来为其提供数据 当您打开活动时 微调器通常会显示数组列表中的第一项 我想更改它并在选择项目之前在微调器中显示文本 选择一个 我怎样才能做到这一点 您可以通过以下两种方式之一进行操作
  • 多次调用 startService 时实际会发生什么

    我正在打电话startService 多次对同一服务有不同的意图 很明显 任何时候都只存在一个服务实例startCommand 被称为每个startService 我的问题是 调用时有性能影响吗startService 多次 意图会按照调用
  • 如何在Android上读取/写入外部USB存储设备?

    我目前正在制作一个应用程序 需要能够读取和写入通过 USB OTG 适配器连接的 USB 闪存驱动器 有没有一种简单的方法可以通过标准访问此存储Java io File蜜蜂 该应用程序只能在运行 Android 4 2 2 的已 root
  • 如何将 onClick 侦听器附加到应用程序小部件上的列表视图项

    我喜欢向列表视图的每个项目添加一个 onClick 侦听器 但我尝试过的方法都不起作用 这是我的 RemoteViewsFactory public class MyRemoteViewsFactory implements RemoteV
  • Android - 将值从 sqlite 数据库加载到数组列表

    我是安卓新手 我有一个使用 SQLite DB 的应用程序 我需要将值从数据库推送到对象类型的数组列表 我使用的代码在这里给出 private ArrayList
  • 从应用程序打开无线设置

    我想直接从我的应用程序打开 设置 gt 无线和网络 我怎样才能做到这一点 尝试这个 startActivity new Intent android provider Settings ACTION WIRELESS SETTINGS 或者
  • cordova-plugin-whitelist 适用于 Android,但不适用于 iOS (Phonegap Build)

    我正在开发一个用 Cordova 封装并使用 Phonegap Build 构建的 JavaScript 应用程序 我们包括cordova plugin whitelist来自我们构建中的 npm 并添加了
  • android.media.Ringtone.play() 在播放 28 次后停止工作

    我有一个打开了几个小时的应用程序 并使用后台服务并附加了前台通知 每隔一段时间就会使用以下方式播放声音 try Ringtone r RingtoneManager getRingtone context uri r play catch
  • 找不到图标路径的 Cordova Android 版本

    打字时cordova build android在 DOS 框中 没有构建任何内容 但我看到一条错误消息 错误 源路径不存在 resources android icon drawable hdpi icon png 我已经更新了 Cord

随机推荐

  • Android Phonegap 滑动类型

    我正在 Android Phonegap 中开发一个应用程序 我需要在我的应用程序中应用 swype 如何申请 任何人都好心指导我 您可以使用 jGestures jQuery 库 http jgestures codeplex com j
  • 核心数据 - 使用谓词过滤一对多关系

    我的核心数据模型中有以下两个实体 Manufacture name other attributes Product name other attributes 我已经设置了一对多关系 Manufacturer manufactures l
  • Postman请求带body表单数据转json

    我和邮递员有问题 For one side I can make this request with the body in form data 但是 当我尝试使用 raw json 中的正文发送相同的请求时 我得到了 我正在尝试通过 An
  • 为什么 javascript 不在加载 Ext.Ajax.Request 的 .php 文件中执行?

    我想通过 ajax 加载 php 文件 该文件在加载时执行 ExtJS 脚本 从而修改 DOM 中已存在的现有 ExtJS 对象 但是 我什至无法从正在加载的页面执行 JavascriptExt Ajax request Firebug N
  • 如何通过代码编程获取设备的 IMEI/ESN 号码但在 android > 6 中

    我的安卓版本是棉花糖6 0 如何以编程方式在 android gt 6 中查找 获取 imei 号码 注意 我在 AndroidManifest xml 文件中添加了 READ PHONE STATE 权限
  • Laravel - 会话返回 null

    我第一次在 Laravel 中使用会话 并且尝试执行多步骤形式 所以我认为使用会话将是一个明智之举 但是下面的代码返回一个空值 我做错了什么 user information name gt request gt name email gt
  • 扩展 CodeIgniter 中的控制器类

    I have class MY Controller extends CI Controller和大配置文件部分的通用逻辑 所以我尝试创建class Profile extends MY Controller正如我所理解的那样 配置文件部分
  • 如何使用自定义元素将子自定义元素包装到 div 中

    我正在尝试创建一个包装器自定义元素 将其子自定义元素包装到 div 中 但子元素没有被包装 相反 一个空的 div 被插入到子元素之前的包装元素中
  • 如何对私有变量进行单元测试?

    考虑一个链表类 我维护 2 个私有变量 1 firstNode 和 2 lastNode 因此 这些变量仅供内部使用 不通过 getter 公开 我想测试操作是否按预期修改这两个变量 例如 如果最后一个节点是重复的 则消除排序链表中的重复应
  • Blade 文件中的 if else 条件(laravel 5.3)

    我想检查一下if else我的刀片文件中的状况 我想检查一下情况 user gt status waiting 如下面给出的代码 输出按我的预期正确返回 但随着我的输出 我发现打印了大括号 我想删除结果中的大括号 我的有什么问题吗if健康
  • 计时器每 5 分钟运行一次

    如何每 5 分钟运行一些函数 示例 我想跑步sendRequest 仅在 14 00 14 05 14 10 等时间 我想用 C 以编程方式完成它 该应用程序是 Windows 服务 Use System Threading Timer h
  • Mockito:模拟对象,不是成员,但内联创建

    我有一个类执行以下操作 public class Transformer public void transform final Car car throws IOException switch car getType case OFFR
  • 如何以 vmware 清晰度动态切换主题

    Vmware Clarity 0 10 16 刚刚发布了新的深色主题 这很棒 他们描述了如何添加新主题 但没有描述在页面内动态更改它的可能性 是因为不可行吗 如果是的话 我该如何使用 Angular 4 来做到这一点 有什么网站可以帮助我解
  • 在 Debezium Mysql Connector 中将更多表列入白名单的有效方法

    将新表列入 debezium mysql 连接器白名单是否遵循任何最佳实践 我们在 CDC 流程中使用 debezium mysql 连接器 并且出现了一个用例 将更多表列入连接器配置的白名单 以下是正在使用的 Debezium 的版本详细
  • RoR,无法从 DateTime/TimeWithZone 迭代

    我有一个简单的任务 我想获取开始日期和结束日期并循环天 日期 这段代码正在我的 db seed rake 任务中使用 目前 我的代码已经经历了以下尝试 someModel start date to datetime someModel e
  • 使用confirm()作为if的条件?

    我有这个功能 function RemoveProduct if confirm Poista return true return true else return false 当您单击页面上的 删除 按钮时 它应该询问是否应该删除产品
  • HTML SRC 属性 - 使用 html 代码而不是 URL

    有没有办法使用纯 html 代码在框架内显示 而不必链接到特定的 URL 文件 例如 不是这样的 但就像这样 也许您可以将 HTML 注入 iFrame Frame 中 如本文所述 将 HTML 注入 IFrame http softwar
  • 如果兄弟节点具有特定值,如何使用 XPath 选择节点?

    我有以下文件 a a
  • 执行控制台命令并获取其输出

    我想知道 在 Visual Basic 2008 中 如何执行外部控制台 命令行 命令并在没有中间文件的帮助下获取其输出 以加快速度 看一下ProcessStartInfo RedirectStandardOutput http msdn
  • Android KeyStore - 密钥并不总是持久存在

    在我的应用程序中 我们使用 RSA 密钥 该密钥是应用程序在第一次启动时生成的 使用 Android 密钥存储 由于未知原因 应用程序无法从某些设备上的密钥存储中检索密钥 我检查了日志 但找不到此错误与特定操作系统版本或特定设备型号之间的关