我们在哪里存储密钥/密码/盐encryption?

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

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

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

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

选项#1不适合我。 选项#2和#3似乎固有的缺陷,除非我严重误解如何去做这个(希望我是)。 如果我们不能和#1一起去,那么推荐的方法是什么? 我们是否为一名攻击者join了一大堆混淆的箍环,并希望获得最好的结果?

谢谢

“我们是否为一个攻击者join了一堆混乱的箍环,并希望最好的? 基本上是的。 箍的大小和数量是多么艰难,你想要做到这一点。

如果您不使用服务器,那么无论您如何对数据进行隐藏和encryption都是可逆的。 但是,你可以很难做到这一点。 例如,我用来保护一些video资产的技术。

  1. 将头部的前1024个字节(它是MP4)replace为应用程序图像资源中间的1024个字节。 我尝试了几个维修人员,所有这些都无法自动恢复文件 – 尽pipe可以手动完成。 然后…

  2. 使用从另一个图像资源获取的256字节的私钥encryption文件。

  3. 当密钥被提取时,通过algorithm进行哈希处理,该algorithm执行各种不合理的math来破坏密钥。

  4. 使用了一个预编译的obsfucator。

我已经尝试过对此进行逆向工程,即使知道它是如何完成的,也很难做出不值得的结果。

有关于SO的大量讨论总结为: 如果你只是想停止复制,使其难以成本(成本vs奖励),否则睡觉容易,因为最终什么都不能做。 如果数据在商业上是敏感的,则需要与系统级安全性(例如,整个设备encryption并且没有根)耦合的服务器。

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

基本上,想一下你是谁保护你的数据,为什么。 由于用户需要这个,所以没有太多的努力来保护它们。 如果您将其存储在私人文件中,则其他应用程序将无法在无根据的手机上读取它。 如果你想在根植的手机上保护它,encryption可能会有所帮助,但只要密钥驻留在应用程序中,或者是基于设备上的某些东西派生的,只会使其更难以恢复。

Android确实有一个全系统的keystore服务,但它没有公共的API,并且可能会改变。 如果您愿意承担未来版本的应用程序风险,可以使用它来保护您的密钥。 这里有一些细节: http : //nelenkov.blogspot.com/2012/05/storing-application-secrets-in-androids.html