【问题标题】:Where do we store key/passphrase/salt for encryption?我们在哪里存储密钥/密码/盐以进行加密?
【发布时间】:2012-09-28 12:18:34
【问题描述】:

我的应用需要加密一些数据(用户会话令牌)。我看到的大多数示例都有一个使用密码和盐生成密钥的方法,例如:

public static Key generateKey(char[] passphrase, byte[] salt) {
    ...
}

我的理解是,我们有三个选项来生成密码:

  1. 让用户在每次应用启动时都输入它(对用户来说很烦人)。
  2. 将密码短语硬编码到应用程序本身中。对用户来说更方便,但有人可以找出您的应用二进制文件中的密码。
  3. 随机生成密码,但我们必须将生成的密钥存储在磁盘上。现在我们刚刚将问题转移到必须将密钥安全地存储在磁盘上,这似乎也是不可能的。如果攻击者找到生成的密钥,问题就大了。

选项 #1 对我不起作用。选项 #2 和 #3 似乎天生就有缺陷,除非我严重误解了如何解决这个问题(希望我是这样)。如果我们不能使用#1,推荐的方法是什么?我们是否设置了一堆模糊的箍让攻击者跳过并寄希望于最好的结果?

谢谢

【问题讨论】:

    标签: java android encryption


    【解决方案1】:

    “我们是否设置了一堆模糊的箍让攻击者跳过并希望得到最好的结果?”基本上是的。箍的大小和数量取决于您想要制作的难度。

    如果您不使用服务器,那么您对数据进行混淆和加密的任何操作都是可逆的。但是,你可以让它变得非常困难。例如,我用来保护某些视频资产的技术。

    1. 将标头的前 1024 个字节(它是 MP4)替换为取自其中一个应用图像资产中间的 1024 个字节。我尝试了几个修复程序,但都无法自动恢复文件 - 尽管可以手动完成。那么……

    2. 使用取自另一个图像资产的 256 字节的私钥加密文件。

    3. 提取密钥后,会通过一种算法对其进行散列处理,该算法会执行各种无意义的数学运算来破坏密钥。

    4. 使用了预编译混淆器。

    我已经尝试过自己对此进行逆向工程,即使知道它是如何完成的,而且很难让努力不值得结果。

    关于 SO 的讨论很多,总结为:如果你只是想停止复制,那就让它变得困难(成本与回报),否则就睡得安稳,因为最终你无能为力。如果数据是商业敏感数据,则需要配备系统级安全性(例如整个设备加密且无 root)的服务器。

    【讨论】:

      【解决方案2】:

      您将盐与加密数据一起存储,它不是秘密信息。您可以根据用户输入的内容或某种设备属性获取密钥:(散列)IMEI、MAC 地址等。

      基本上,想一想您在保护您的数据免受谁的侵害以及原因。由于用户需要这个,因此试图保护它免受他们的侵害没有多大意义。如果您将其存储在私人文件中,其他应用程序无法在非 root 手机上读取它。如果您想在有根手机上保护它,加密可能会有所帮助,但只要密钥位于应用程序中,或者是基于设备上的某些内容派生的,它只会使其更难恢复,而不是不可能恢复。

      Android 确实具有系统范围的密钥库服务,但它没有公共 API,并且可能会发生变化。如果您愿意冒您的应用程序在未来版本上中断的风险,您可以使用它来保护您的密钥。这里有一些细节:http://nelenkov.blogspot.com/2012/05/storing-application-secrets-in-androids.html

      【讨论】:

        猜你喜欢
        • 2011-04-30
        • 1970-01-01
        • 1970-01-01
        • 2019-03-10
        • 2015-11-08
        • 1970-01-01
        • 2016-11-22
        • 1970-01-01
        相关资源
        最近更新 更多