Java 加密应用程序数据的正确方法

Java 加密应用程序数据的正确方法,java,android,encryption,password-encryption,Java,Android,Encryption,Password Encryption,只是一个关于应用程序数据加密使用的快速问题 假设您有一个移动应用程序,此应用程序需要存储一些潜在的敏感数据。在本例中,需要隐藏的公司ip地址列表 显而易见的答案是使用用户密码的散列进行加密。但是,在这种情况下,用户帐户是可选的,因此密码可能不存在。加密存储数据的下一个最佳方法是什么 我的第一个猜测(可能是最不安全的)是应用程序中内置的一个密钥,但这里的问题是可能导致密码恢复的不同攻击的风险 下一个猜测是找到设备的某种标识符,可以用作密码生成器的种子。这似乎又是一种有缺陷的方法 最后一个想法是安全

只是一个关于应用程序数据加密使用的快速问题

假设您有一个移动应用程序,此应用程序需要存储一些潜在的敏感数据。在本例中,需要隐藏的公司ip地址列表

显而易见的答案是使用用户密码的散列进行加密。但是,在这种情况下,用户帐户是可选的,因此密码可能不存在。加密存储数据的下一个最佳方法是什么

我的第一个猜测(可能是最不安全的)是应用程序中内置的一个密钥,但这里的问题是可能导致密码恢复的不同攻击的风险


下一个猜测是找到设备的某种标识符,可以用作密码生成器的种子。这似乎又是一种有缺陷的方法

最后一个想法是安全地随机生成密码,并使用上述方法之一对其进行加密存储

我的思路是正确的还是偏离了正轨

我对密码算法有相当的了解,但找到正确的应用程序让我抓狂。任何帮助都将不胜感激


谢谢

下一个猜测是找到设备的某种标识符,可以用作密码生成器的种子。这似乎又是一个有缺陷的计划。 ---?

您可以用ANDROID_ID或UUID的哈希值代替密码对其进行加密


您对此有何看法?

重点是:只要您的数据只驻留在移动设备上,那么最终您将受到限制。在这个意义上:如果你需要以安全可靠的方式存储信息,那么你应该考虑一个“服务器端”解决方案。 如果这是不可能的,下一个最好的办法是让你的应用程序向用户询问一个不同的密码,然后将其用作问题中所述的密钥。您肯定不想要一个适用于所有用户/设备的单一通用密钥

但当然,要求用户在每次使用应用程序时键入一个特殊密码并不是您的用户喜欢的解决方案。因此,您必须以某种方式向用户提供存储该密码的服务,这再次增加了潜在攻击的范围


长话短说:如果没有“远程”服务,你只需在“用户体验”和“足够的安全性”之间取得平衡。根据您的用户集,您必须确定哪些对这些人更重要-安全性还是方便性

如果你在这里得不到好的答案,可能是一个可以访问的地方。过去几年发布的许多Android设备都有硬件备份密钥存储库,可以在可信的执行环境中存储(有时生成)秘密/私钥。应用程序甚至操作系统都无法访问这些密钥的密钥材料。尽管另一个与您的应用程序以相同用户身份运行的应用程序可能会在其所在的设备上使用您的密钥,即使他们无法提取密钥以供其他地方使用。。我还没有调查过。我很感激你的迅速复出!我认为ANDROID_是或UUID的唯一原因是它们在设备上很容易被发现。因此,如果假设有一个胭脂应用程序,它将简化破解加密文件的过程。salt会降低这种可能性,但如果不仔细编程,可以通过应用程序的反向工程找到。可能是错的。也许UUID用作远程密钥管理器的标识符?但对于应用程序来说,这开始变得有点太复杂了。坏主意:使用android id意味着——一旦有人发现了机制,你就知道如何破坏任何设备。我同意,这就是为什么我认为使用唯一的公共标识符是个坏主意。除了使用密码和将安全性限制在设备内置的密码密钥库之外,似乎没有太多选择。更好的方法是使用带有非对称加密的在线数据库来证明身份。这确实给简单的应用程序数据保存功能增加了很多复杂性。事实上,正如@GhostCat所说的,如果有人知道这种机制,那么这将是一个坏主意,因为他不必每次都要求用户输入密码。他可以在登录页面上点击“记住我”按钮,如果点击该按钮,他可以将用户密码存储到数据库中,如果他注销,他可以从数据库中删除密码。@Yusufğağlar你是对的-我在这里有点太懒了。请看我的更新。这似乎是我必须去的地方。问题是必须有后台运行的守护进程需要使用存储的数据。他们要么需要访问该数据,要么必须将数据存储在设备之外,并通过服务或根据请求提供远程访问。在这种情况下,尽管不同的安全级别可以使用不同的密钥,但所需的用户名和密码会影响便利性。守护进程通信可以使用一个密钥,而数据访问可能需要在主通道后面使用更安全的密钥