我应该开发一个 phonegap 应用程序。我需要加密我对服务器端的请求,然后解密。
HTTPS 不是解决方案,因为我需要签署请求以确保数据不是伪造的。我可以使用任何异步加密(该应用程序将生成 private/public
key 并将公钥发送到服务器)。但是这样我需要将我的私钥保存在设备上。
问题是:如何将私钥安全地保存在设备上?
我可以使用 sqlclipher (加密我的本地 SQLite DB)和 integrate它进入我的 phonegap 应用程序。太好了,但在这里我必须保留数据库的 key :)
var db = window.sqlitePlugin.openDatabase({name: "DB", key: "secret1"});
任何有权访问手机的人都可以获得此 key 。所以在这里我有同样的问题:)
请给我任何建议。
谢谢!
附注适用于 iOS 和 Android 的应用
最佳答案
您必须区分加密和身份验证。
首先,我建议使用 https 来加密您的消息并安全地传输它们。
其次,我建议使用 HMAC 来验证您的消息。它基本上是这样工作的:
在编译时为您的应用和服务器生成一个 secret 字符串。您将此 secret 直接存储在应用程序的源代码中,因此它永远不会传输到服务器或从服务器传输。这可能是您的私钥/公钥方法的主要区别:您将 secret 直接编译到您的应用程序中,而不是稍后将其写入某些用户可访问的存储中。 “直接进入您的应用程序”意味着在 Phonegap 的情况下不在您的 HTML/JS 文件中,而是在 native 源代码中!如有必要,您必须将访问器桥接到 javascript。
当用户首次启动您的应用时,在您的应用中设置一个用户 ID(=key;长,随机!)。如果你想验证你的用户,你可能有某种登录/密码机制。 (存储用户 ID 以及从用户 ID 生成的 HMAC 和设备上的共享 key 。每次读取用户 ID 时,都要对照哈希检查它,以确保用户 ID 没有被欺骗。)
在您的应用中
- 在每条消息中包含一个用户 ID。
- 在每条消息中包含时间戳。
- 根据消息、服务器地址、请求 URI 和共享 key 组合在一起的字符串计算 HMAC 哈希。
- 在您的请求 header 中包含哈希值。
在服务器端
- 检查时间戳是否有效,e。 G。不超过 2 分钟左右。这可以防止重播攻击(至少在 2 分钟后)。
- 如果用户 ID 有效,请检查您的数据库。
- 根据消息、服务器地址、请求 URI 和共享 secret 组成的字符串计算 HMAC 散列。包含请求 URI 可以防止人们向您服务器上的另一个 URI 发送相同的有效请求; e. G。在 REST 环境中,如果您向
/comment/1
或/user/1
发送相同的 DELETE 请求,情况会大不相同。 - 将它与您在 header 中提交的哈希值进行比较,它们必须相等。
- 如果任何检查失败,发送一个错误。否则发送响应。
有机会通过反编译您的源代码来获取共享 secret 和有关您如何计算 HMAC 散列的信息。我认为没有办法避免这种风险。 ...无需深入研究原生开发:
iOS 钥匙串(keychain)
Android 安全功能
http://developer.android.com/training/articles/security-tips.html
关于android - phonegap 应用程序中的本地存储保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20406291/