我需要将敏感数据存储在android应用程序中的sqlite数据库中。
我如何确定这些数据是非常安全的?我知道我可以用密钥加密数据,但是我把密钥存储在哪里呢?我也不想让用户填写一个密钥,我只想让它自己工作。因为我害怕逆向工程,所以我也不想在代码中放置加密密钥。
我发现了SQLCipher的事。它说这是加密数据库中数据的一种非常安全的方法,但为什么是这样呢?我不也需要一个钥匙来解锁那个信息吗?或者,这真的是确保数据安全的完美方法吗?
如果不是,那么在sqlite数据库中存储敏感数据的(几乎)可靠的方法是什么呢?
发布于 2012-03-01 11:20:53
对称加密需要密钥进行加密,而解密则需要相同的密钥。这是无法避免的。
不要将密钥存储在代码中,因为它可以被解压缩(正如您已经说过的)。
在第一次使用时向用户询问密码,并使用PBKDF2派生用于加密的加密安全密钥。
要么用户必须输入密码,要么您需要将其存储在内存中。我要做的是,要求用户指定将密钥缓存在内存中用于解密的持续时间。
如果持续时间已过期,用户将不得不再次输入密码。
我没有彻底检查SQLCipher,但它说它使用的是AES-256。AES是一种对称密码算法,它需要加密密钥和解密密钥。
发布于 2012-03-01 13:18:11
你说..。
我也不想让用户填写一个密钥,我只想让它自己工作。因为我害怕逆向工程,所以我也不想在代码中放置加密密钥。
不幸的是,你需要做这些事情之一(嗯,可能)。您可以向用户询问密码,然后使用为此目的设计的算法(称为基于密码的加密( PBE )和Android包含一些优秀的PBE算法标准)从密码中获得密钥。您可以将密钥存储在代码中,或者将其作为APK中的资源存储,但随后会有人将其反向工程。您可以这样做,并混淆您的代码,这将减慢反向工程过程,但您不能使它不可能(您的代码将需要确定关键在某个时刻,所以这只是一个攻击者知道它是如何做的问题)。
这里尝试过的其他方法包括:迫使客户端返回到服务器以通过network...but检索密钥,如果网络连接被中断会发生什么,以及是什么阻止服务器将密钥分发给任何人,比如攻击者?那么,您可以使用相互验证的SSL来确保只允许您的客户端获得it...but,然后您需要存储客户端SSL私有key...which与您现在遇到的问题完全相同。:)
So...the的底线是,您需要一个密钥(或类似的东西)来加密/解密数据。你可以储存它,使它更难让人反向工程它。您可以给用户带来不便,并让他们输入密码。But...you不知何故需要这种秘密知识。
发布于 2014-08-10 07:02:36
有可能让应用程序自动生成一个随机密码吗?可能来自地点,时间或其他信息,这将不需要询问用户的通行证。
https://stackoverflow.com/questions/9515057
复制相似问题