【问题标题】:Is it safe to store the encryption/decryption key into a static variable?将加密/解密密钥存储到静态变量中是否安全?
【发布时间】:2019-02-26 10:24:07
【问题描述】:

我正在 Android Studio 中开发一个应用程序,我正在通过 JSON 将数据从服务器传递到手机。

我有办法加密 JSON 数据吗?

将加密/解密密钥存储到静态变量中是否安全?如果不是,我应该将密钥存储在 Android 的哪里?

以下这些 SO 问题都没有帮助我:

Can I encrypt my JSON data?

Encrypt json data

【问题讨论】:

  • 为什么不https

标签: java android json encryption


【解决方案1】:

将加密/解密密钥存储到静态变量中绝对不安全。

对于这种通信,不是在服务器和您的应用程序之间共享一个秘密(对称)密钥(您必须安排和跟踪),而是使用非对称密钥对。密钥对是私钥和对应的公钥。

假设您只需要以一种方式加密从服务器到应用程序的数据:您的应用程序生成一个随机的、可有可无的临时密钥对,并将公钥发送到服务器。然后,服务器可以使用该公钥加密它发送回应用程序的消息,而无需看到私钥,并且只能使用从未离开应用程序的私钥解密消息。公钥不能用于解密,只能加密。

如果该密钥对是仅为该交换创建的,则可以将其丢弃并在任何时间(或在到期日期/时间之后)建立新的通信对。

也就是说,这一切都是通过 https 连接在两个方向上自动完成的。因此,设置它可能会满足您的需求。否则,您就是在重新发明轮子。除非你想对安全进行那种严格的控制。即便如此,两者都做!

**注意:以上解释是出于概念目的。严格来说,https 使用 Diffie-Hellman 密钥交换在客户端和服务器之间发送公钥(如上所述),但它们用于计算共享对称密钥,这在计算上更高效。

【讨论】:

    【解决方案2】:

    您的问题的解决方案是证书固定。它可以防止 MITM(中间人)攻击。 证书固定表示您的应用正在通过将网站提供的证书与应用中捆绑的证书进行比较来验证与应用通信的网站是实际网站。 请参考以下链接了解更多信息

    https://davidtruxall.com/android-certificate-pinning/

    【讨论】:

      【解决方案3】:

      是的,Android 和服务器之间的通信是安全的,而且您肯定可以加密您的 JSON 负载。查看这个 git hub 存储库,了解如何加密 JSON 有效负载。 Encrypt your JSON payload(android project)

      您可以生成公钥-私钥对,并且只与客户端(Android)共享您的公钥。您可以在 Android 设备上以任何您想要的方式保存公钥。 https,也是保护客户端和服务器之间通信的好方法,但请查看此question 以帮助指导您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-04
        • 1970-01-01
        • 1970-01-01
        • 2014-10-18
        • 2015-07-04
        • 2015-09-23
        • 1970-01-01
        相关资源
        最近更新 更多