AndroidKeyStore getEntry 在某个点之后始终失败

2023-11-29

我正在使用 AndroidKeyStore 生成 RSA 密钥对,用于加密/解密内部数据。

执行此操作的代码如下 - 它尝试检索现有的 RSA 密钥对(通过别名)。如果不存在,那么它会尝试生成一个新的。 代码如下 -

private void initializePublicPrivateKeys(){
    try
    {
        KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
        keyStore.load(null);
        KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(APP_RSA_KEY_PAIR_SECRET_ALIAS, null);
        _app_privateRSAKey = entry.getPrivateKey();
        _app_publicRSAKey = entry.getCertificate().getPublicKey();
    }
    catch(Exception e){

    }
}

private void initializeRSAKeyPairs() {

    initializePublicPrivateKeys();
    boolean isKeyNotGenerated = _app_privateRSAKey == null || _app_publicRSAKey == null;

    if(isKeyNotGenerated)
    {
        //Check here, if we already stored some data with previous RSA key pair - if a entry is present in SharedPreference then that would mean we had previously generated a RSA key pair and the entry is in-turn encrypted by this key pair.

        generateAppRSAPublicPrivateKeys();
        initializePublicPrivateKeys();// initialize it again , since we have new keys generated.
    }
}

@TargetApi(18)
private void generateAppRSAPublicPrivateKeys(){
    Calendar cal = Calendar.getInstance();
    Date now = cal.getTime();
    // the certificate created would be valid for 25 years. This is just a random value.
    cal.add(Calendar.YEAR, 25);
    Date end = cal.getTime();

    try{
        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
        Context appContext = getApplicationContext();


        KeyPairGeneratorSpec.Builder keyPairGeneratorBuilder =
                new KeyPairGeneratorSpec.Builder(appContext)
                        .setAlias("myrsaalias")
                        .setStartDate(now)
                        .setEndDate(end)
                        .setSerialNumber(BigInteger.valueOf(1))
                        .setSubject(new X500Principal(String.format("CN=%s, OU=%s", "myrsaalias",
                                appContext.getApplicationInfo().packageName)));

        if(Build.VERSION.SDK_INT >= 19){
            keyPairGeneratorBuilder.setKeySize(2048); 
        }

        generator.initialize(keyPairGeneratorBuilder.build());
        generator.generateKeyPair();
    }
    catch(Exception e){
        e.printStackTrace();
        throw new IllegalArgumentException("Failed to generate RSA Public Private Key pair");
    }
}

这段代码工作正常。生成密钥对后,我使用它们来加密/解密数据(将此数据存储在共享首选项中),但是在某个时间点(在某些应用程序重新启动后)之后,initializePublicPrivateKeys 函数无法检索密钥对。(在这一点之后持续失败) 因此,以加密形式存储在共享首选项中的任何数据都会丢失,因为我根本没有相应的公钥来解密它。 (如果我生成一个新的,我想,这会有所不同,并且当我解密数据时会返回错误的结果)

我想知道在什么情况下这个初始化公钥函数会失败?

PS:目前,我无法捕获异常详细信息,因为问题发生在我无权访问的某些客户设备上,我需要自己找出问题的根源。 此外,在此期间设备密码或 PIN 码不会更改(我与客户确认了这一点)

提前致谢,


用户是否有可能将屏幕锁定类型更改为不安全的方法(例如 None 或 Swipe),从而触发 AndroidKeyStore 中的所有密钥被删除?也许用户在设置中添加或删除了指纹?中的密钥无效AndroidKeyStore是本博客文章中讨论的已知问题(功能):https://doridori.github.io/android-security-the-forgetful-keystore/

这里还提到:https://code.google.com/p/android/issues/detail?id=61989

如果您没有严格的安全要求,并且希望您的应用程序即使用户没有屏幕锁定也能工作,那么也许只需使用存储在数据区域的密钥库文件中的密钥对并跳过AndroidKeyStore.

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

AndroidKeyStore getEntry 在某个点之后始终失败 的相关文章

  • 设置文本视图 Android 的文本颜色

    在 string xml 文件中我使用以下标签
  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • 按下按钮时应用不同的样式

    有没有办法在按下按钮时将样式应用于按钮 如果我有一种风格样式 xml
  • Android Q:file.mkdirs() 返回 false

    我们有一个应用程序 使用外部存储来存储一些临时文件 图像 二进制数据 该代码已经运行了几年 直到最近才发生重大变化 在 Android Q 上它不起作用 File f new File Environment getExternalStor
  • Recyclerview 动态部分不使用任何第三个库

    我想将标头添加到 recyclerview 我正在尝试使用来实现它 Override public int getItemViewType int position depends on your problem if position 0
  • Android应用程序组件销毁和重新创建的详细信息

    有人可以向我提供一些具体的 值得信赖的 最好是简洁的 信息 内容如下 系统销毁和 如果适用 重新创建组件的顺序 片段 活动 活动的线程 异步任务 计时器 静态数据 类何时卸载 其他类中的线程 异步任务 定时器 主机 TabActivity
  • Bitmap.getPixels() 中的 IllegalArgumentException

    我想将数据从位图复制到int using getPixels 这是我当前的代码 int pixels new int myBitmap getHeight myBitmap getWidth myBitmap getPixels pixel
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • 在 Cordova 应用程序中获取额外功能

    我们有两个 Android 应用程序 一个使用本机 Java 实现 另一个使用 Ionic 编写 Ionic 应用程序启动我的应用程序 这是使用灯插件 https github com lampaa com lampa startapp 我
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • Android - AudioRecord类不读取数据,audioData和fftArray返回零

    我是 Android 新手 一直在开发音调分析器应用程序 最低 SDK 8 我读了很多关于如何实现 Audiorecord 类的文章 但我想知道为什么它在我录制时不读取任何数据 我尝试显示 audioData 和 fftArray 的值 但
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • 如何在 Android 中从 WorkManager 取消工作?

    我已经保存了 WorkManagerUUID转换成String在领域数据库中 这是代码 Constraints constraints new Constraints Builder setRequiredNetworkType Netwo
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 通过系统应用程序以编程方式静默安装 apk(无需 root)

    我有带有 android sharedUserId android uid system UID 1000 的系统级应用程序 设备未root INSTALL PACKAGES 权限包含在清单中 我可以静默安装下载的 apk 吗 我已经发现这
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 我的应用程序中的后退按钮出现问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在手机关闭时清除共享首选项值 你
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • SSKeychain 不保留数据

    我在用SSKeychain用于存储设备的UUID 然而 有时SSKeychain不保留 UUID 因此我的应用程序必须重新创建新的 UUID 有人可以告诉我一些原因吗SSKeychain不保留数据 提前致谢 对不起我的英语不好 在 Obje
  • SmartGit:文件或目录不是过期错误消息吗?

    有人请帮助我理解我对下面发生的事情的错误 误解 这是一个 SVN 存储库 正如您所看到的 我有两个分支并对版本进行了一些独立的更改 根据上面的日志 两个服务器分支都映射回当前本地发布分支 该分支提前了一些提交 如果我去将发布的更改推送回远程
  • 组合 SQL Server 查询

    我正在使用 SQL Server 并且有两个表 我想将其合并为一个查询 以用于填充网格视图 表1 dbo 工作UID PK 整数 Tech Ticket 整数 RMA Ticket 整数 区域 nchar10 已完成 nchar10 FA
  • 如何在 Rust 中将 Future 的生命周期绑定到 fn 参数

    我想写一个简单的run transactionRust MongoDB 驱动程序的函数 该函数尝试通过 mongo db 客户端执行事务 并在遇到可重试错误时重试该事务 这是该函数的最小可重现示例 use mongodb Client Co
  • 在 XNA 中,处理我不再需要的纹理的最佳方法是什么?

    我开始了一个项目 其概念是在整个游戏中连续重用相同的texture2d对象 定期重新加载新纹理 随着时间的推移 这被证明是一个坏主意 因为我遇到了 System OutOfMemoryException bool loadImages st
  • 从对象获取值并将其推入数组 javascript

    我想从对象中获取值并将其保存到数组中 这就是我的对象的结构 0 name John Deo age 45 gender male 1 name Mary Jeo age 54 gender female 2 name Saly Meo ag
  • 如何使用 fgetcsv 在 while 循环中跳过标题行?

    我无法像我之前使用的代码那样获得我编写的跳过第一行 标题 的新代码 见底部 我没有收到任何错误 但只是无法让它省略第一行 file fopen uploadcsv r column headers array row count 0 whi
  • 带过滤器的列表视图在隐藏键盘或按下回车键之前不会刷新

    我有一个显示联系人列表的列表视图 我在列表视图上方的布局中添加了一个 EditText 以便我可以使用过滤器进行搜索 我已经在 EditText 上使用 onTextChanged Listener 实现了这一点 我的列表视图适配器是一个自
  • 所有动画执行速度都很慢

    我不确定动画过程发生了什么 突然我的所有动画都执行缓慢 我已经重置了我的Simulator 重新启动我的Mac 但没有帮助 我不确定我做了什么或者这是系统问题 请检查下图 每个动画都在缓慢执行 我在用着Xcode7 3 1 Simulato
  • 如何设置连接属性(包括同义词)

    我在 Spring Boot 中的数据库配置是使用 yaml 文件完成的 Common spring jpa properties hibernate show sql true use sql comments truecat forma
  • Misra 规则 19.7:类似宏的函数

    我有一个关于 Misra 规则 19 7 的警告 在下面的行中 应该优先使用函数而不是类似函数的宏 define gOFFSETOF type mem gOFFSET size t char type 0 gt mem char type
  • 与 set-winuserlanguagelist 命令相关的疑问/问题

    我正在构建一个代码来修复 Windows 10 上的键盘布局情况 通过自动化解决方案 我决定使用 powershell 但问题是我在这方面还很陌生 并且面临着某些问题 我设法找到一个脚本来更改键盘布局 但它只更改为一种语言 当我尝试用两种语
  • SVN 中的 -r 和 url@rev 有什么区别?

    有人可以解释一下使用之间的区别吗 r REV and URL REV以下两个 SVN 命令的语法 svn co r6002 https svnserv2 acme com stx project1 trunk gui Mammoth Web
  • 将计数添加到 geom_hex 作为标签

    我想向 geom hex 添加标签 这提出了两个问题 如何获取他们的坐标 我如何提取它们的计数值 最小的例子 pipeline lt read csv url http dl dropboxusercontent com u 7446674
  • 更新Android SDK包列表失败

    每次我尝试打开播放器设置时 它都只显示空白 并且控制台中将显示以下错误 我尝试点击此链接 https answers unity com questions 1320634 unable to list target platforms w
  • 将 JSON 反序列化为 C#

    我看到很多简单的 JSON 反序列化示例 但是当涉及到稍微复杂的东西时 就缺乏示例 我正在研究从 GetResponse 的 API 反序列化响应 简单例如 result updated 1 error null Another resul
  • 如何在多个项目上使用 vagrant

    我是 Vagrant 的新手 我正在尝试 PuPHPet 以便让一切正常运行 我可以启动并运行 Debian 盒子并通过 ssh 进入其中 这更多是我不清楚的工作流程 目前我正在将 PuPHPet 配置下载到名为的文件夹中vagrant我可
  • 如何使用 Injector.get(ActivatedRoute) 检索路由参数?

    我是角度新手 我的目标是拥有一个可以通过 详细 组件 显示单个数据对象字段的组件 扩展的 BaseDetailComponent 由于父类的构造函数将接收服务实例和其他参数 因此我无法在构造函数中使用正常的依赖注入 因此 我需要在 Base
  • Chrome 开发工具中的图层组合

    我有简单的过渡动画div元素 为了防止不必要的绘制事件 我对其应用了更高的 z index 和 0 变换 所以这div可能在它自己的层上 但瀑布图显示了每个动画刻度之后可能发生的图层组成事件 我想知道 这是 GPU 页面渲染之前的最后一层组
  • AndroidKeyStore getEntry 在某个点之后始终失败

    我正在使用 AndroidKeyStore 生成 RSA 密钥对 用于加密 解密内部数据 执行此操作的代码如下 它尝试检索现有的 RSA 密钥对 通过别名 如果不存在 那么它会尝试生成一个新的 代码如下 private void initi