当前位置: 首页 > 知识库问答 >
问题:

良好的做法:如何处理密钥库密码在android/java?[重复]

蒋培
2023-03-14

假设密钥库的密码不是由用户密码提供或绑定的(这或多或少意味着它只是代码中的一个字符串或数组[]),它是否是一个足够的保护,只是不能或只能勉强被提取出来字节码的?

我知道密钥库(JKS/BKS)的密码只是用来验证密钥库的完整性。此外,很明显,我必须假设一个应用程序在一个或多或少受信任的环境中运行才能“安全”。但无论如何,是否有可能仅从apk文件中提取密码?

在应用程序的源代码中硬编码任何密码都是错误的,所以也许有一些想法,如何让它实际上不那么危险。例如,让密码在外部配置文件中可配置,还是在安装应用程序时随机生成密码(以及密码应该存储在哪里)?

共有3个答案

楚骞尧
2023-03-14

尝试使用null而不是密码(请参见此问题)

final KeyStore keyStore = KeyStore.getInstance("BKS");
    keyStore.load(context.getResources().openRawResource(R.raw.serverkeys), null);

    final KeyManagerFactory keyManager = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    keyManager.init(keyStore, null);

    final TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustFactory.init(keyStore);

    sslContext = SSLContext.getInstance("TLS");
    sslContext.init(keyManager.getKeyManagers(), trustFactory.getTrustManagers(), null);
陆绍辉
2023-03-14

用密码加密密钥库是很常见的,但这并不是必需的。

将密码存储在密钥存储库附近或多或少相当于拥有未加密的密钥存储库。这可能完全没问题。也就是说,在服务器上使用两个证书和私钥的未加密密钥库并不少见,在服务器上密钥库文件受到其他方式的保护。

在这里,您似乎试图防止的攻击类型是,如果有人能够更改密钥库的内容。密码可用于验证密钥库的完整性,但前提是攻击者不知道密码。它无法想象攻击者可以访问您的密钥库,但无法访问应用程序的字节码或应用程序的其他配置的典型场景。

Android应用程序的文件系统是合理的安全,但不是防弹的任何方式。如果不信任该文件系统,则需要使用用户键入的密码或从设备外部的其他地方获取的密码对密钥库进行加密。另一方面,如果你信任文件系统,你实际上根本不需要加密密钥库(或者你可以用一个众所周知的密码加密它,如果这让你的开发更容易)。

郭坚壁
2023-03-14

它是否是一种足够的保护,以至于无法或只能很难从字节码中提取出来?

“充分”是一个主观术语;只有你才能决定你觉得什么对你来说是足够的。

是否可以从apk文件中提取密码?

是的,因为APK文件可以反编译,未加密的网络对话可以被嗅探,等等。

如何使它实际上不那么具有威胁性

您可以购买DexGuard的许可证并使用它,因为这将加密硬编码字符串,如密码。这是否值得额外的辩护由你决定。

在外部配置文件中使密码可配置会更好吗

任何使用该设备的人都可以获取该文件。

或者在安装应用程序时随机生成(然后存储在哪里)?

它至少会存储在根设备用户可用的地方。

 类似资料:
  • 问题内容: 假设密钥库的密码不是由用户密码提供或未绑定到用户密码(这或多或少意味着它只是某处代码中的String或Array []),是否足以保护它只是不能或几乎不能从字节码中提取出来? 我知道密钥库(JKS / BKS)的密码仅用于验证密钥库的完整性。此外,很明显,我必须假设应用程序在或多或少受信任的环境中运行才能“安全”。但是无论如何,是否可以仅从apk文件提取密码? 在应用程序源中对任何密码

  • 我用过这个命令 生成密钥库。它工作正常,但从我读到的内容来看,这个命令还应该提示您输入密钥密码(而不是存储密码)?我从来没有收到过这样的提示。我能跑 查看密钥库的内容。钥匙似乎就在那里。。。正确的别名在那里。在哪里获取/设置特定别名的密码? 我有一个key.properties在Android目录 在build.gradle我有: 当我试图生成一个发布版本时,我得到了 我想它可能与keyPassw

  • 问题内容: 我需要将2个密钥存储到KeyStore中,这是相关代码: 尽管我得到了执行,但“私钥必须带有证书链” 那到底是什么?以及我将如何生成它? 问题答案: 您还需要提供私钥条目的证书(公钥)。对于由CA签名的证书,链是CA的证书和最终证书。对于自签名证书,您只有自签名证书。 示例: 要生成证书,请点击以下链接: 示例:

  • 我试图为某些设备生成密钥时出错。我能够在运行4.4.2的三星Galaxy Note上重现错误。 我创建了一个小应用程序,只能通过从Android开发者页面“生成新私钥”下的https://developer.android.com/training/articles/keystore.html逐行复制代码来生成密钥 错误似乎发生在kpg.generateKeyPair(),在Android Key

  • KeyToolException:无法从存储区“C:\Keystore\Keystore.jks”中读取密钥“app name”密钥:密钥存储区被篡改,或者密码不正确 我最好的解决办法是什么?

  • 我正试图更改存储在p12密钥库中的证书的密码。我设法通过使用ikeycmd更改了keystore密码,但对于键控器,似乎什么都不起作用。这是我正在尝试的命令: keytool-keypasswd-storetype pkcs12-keystore$keystore_file-alias$key_alias-keypass$key_password-new$new_pass-storepass$st