在 Android 应用程序中加密数据的最佳实践

信息安全 tls 安卓
2021-08-30 19:20:46

我正在编写一个应用程序来恢复有关用户的统计数据。我仍在思考什么是加密数据的最佳方式。我没有任何移动应用程序的经验。但我正在考虑对 RSA 公钥进行硬编码并在通过网络发送之前以这种方式对其进行加密。

另一个从事该项目的人建议使用 AES 并对密码进行硬编码,但这对我来说似乎是一种不好的方法,因为可以通过反编译程序找到硬编码的密码。(我怀疑有人会这样做,但以防万一)。

还有其他更适合的方法吗(不幸的是,设置 ssl 连接不是一种选择)?

我还在考虑如何提供完整性,我在考虑对文件进行哈希处理,然后在加密之前将整个消息包 + 哈希压缩到一个文件中。如果您有更好的解决方案,请随时分享。

4个回答

我只是将 SSL 与服务器的硬编码公钥一起使用。途中没有人可以操纵或阅读您发送的内容。无需发明自己的协议。

当然,用户自己也可以通过这种方式操作和读取数据,但解决这个问题是 DRM 问题而不是安全问题。

我相信 BouncyCastle 可以用于那个 Android。我更喜欢带有基于 DHE AES128 的密码套件的 TLS 1.2,但根据您的服务器支持的内容,您可能需要降级到较小的套件。

实施您自己的 ad-hoc-ish 加密解决方案不是一个好主意。你可能会出错。(例如,带有硬编码密码的 AES 很糟糕。任何人都可以通过下载应用程序并提取密码来获取密码。我不知道你为什么怀疑有人会这样做。)

我建议您使用经过严格审查的标准解决方案。如果您有需要保护的通信渠道,请使用 SSL/TLS。如果要保护存储的数据,请使用 GPG/PGP/OpenPGP。两者都有可用的库和代码,它们应该可以很容易地集成到您的软件中。

我可能会选择 OP 提到的解决方案,并使用 RSA 并且在应用程序中只有公钥。您通常希望避免应用程序能够同时进行加密和解密(尤其是使用硬编码密钥),因为密钥最终会泄露。如果用户输入是可能的,那么对称加密也是可能的。

存在通过使用中的 sbox 查找众所周知的加密和散列函数的逆向工程工具,如果将密钥存储在二进制文件中,从那里提取密钥通常非常简单。

请记住,rsa 非常慢,这是它的大多数用途涉及使用它来加密用于执行实际加密的对称密钥的原因之一。

我仍在思考什么是加密数据的最佳方式。

如果您想将数据存储在设备本身上,您可以要求输入用户密码并使用密钥派生函数派生对称密钥。Bcrypt 和 PBKDF2 是众所周知的例子。