我正在尝试通过 Worklight 实现以下目标。
- 我的应用程序有两组功能。仅当应用程序连接到服务器并且用户经过身份验证时才能访问一组功能。另一组功能可以离线访问,但它们需要来自加密 JSONStore 的数据。
- 我在客户端设备上有一个 JSONStore,它是使用密码初始化的。因此,存储中的数据将被加密。此外,此 JSONStore 通过适配器同步到服务器上的数据库。
- 我还设置了另一个适配器,它通过使用数据库中存储的另一组凭据对用户进行身份验证。只有当应用程序在线时才能对用户进行身份验证。
我想要做的是统一这两种方法,以便用户无需输入两组凭据即可访问这两组不同的功能。我想到的一种可能的解决方案是加密 JSONStore 并执行适配器身份验证,而无需用户干预。但我不认为它是安全的。
有什么建议或方法来解决这个问题吗?
以下只是一个想法,我不是安全专家。
要求:
- 要使用离线功能,您必须已在线并至少经过一次身份验证。
- 您的应用程序必须有一个登录视图来输入一些凭据(例如用户名/电子邮件和密码)。
Steps:
- 用户第一次输入正确的凭据并成功通过服务器进行身份验证时:对凭据进行哈希处理。例如:
var myHash = md5(loginField.getUser() + loginField.getPassword())
。你可以找到Github 上的 md5 JavaScript 库 https://github.com/blueimp/JavaScript-MD5.
- 使用该哈希来初始化存储。例如:
WL.JSONStore.init(..., {password: myHash})
.
- 将哈希值发送到后端HTTPS http://en.wikipedia.org/wiki/HTTP_Secure,如果用户更改他/她的凭据,您将需要它。无需在设备上保存凭据或哈希值(
loginField = null; myHash = null
)。或者,您可以只在服务器上生成哈希值并将其存储,而无需客户端将其发回,只需确保客户端和服务器使用相同的哈希算法即可。
- 离线工作时,询问用户他/她的凭据,对其进行哈希处理并使用它来访问商店内的数据。
- 如果用户更改他/她的凭据(例如通过应用程序的 Web 界面),哈希值将会不同,并且存储不会初始化。但是,用户应该已使用新的/有效的凭据成功通过服务器的身份验证。向服务器请求旧哈希值,使用旧哈希值初始化存储,然后根据新/有效凭据更改密码以将存储初始化为新哈希值。例如:
WL.JSONStore.changePassword(oldHash, newHash)
.
选修的:您可能需要考虑使用salt http://en.wikipedia.org/wiki/Salt_(cryptography)。例如:var salt = Math.random(), myHash = md5(loginField.getUser() + loginField.getPassword() + salt)
.
您需要将盐存储在某处,以便用户返回应用程序后可以重新生成哈希值。您应该能够初始化另一个未加密的存储来保存它。例如WL.JSONStore.init(..., {username: 'metadata'}).then(function(){/*add salt to store*/})
。有关使用两家商店的更多信息here https://stackoverflow.com/a/19850557/186909.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)