2

我正在尝试通过 Worklight 实现以下目标。

  1. 我的应用程序有两组功能。只有当应用程序连接到服务器并且用户通过身份验证时,才能访问一组功能。另一组功能可以离线访问,但它们需要来自加密 JSONStore 的数据。
  2. 我在客户端设备上有一个使用密码初始化的 JSONStore。因此,存储中的数据将被加密。此外,此 JSONStore 通过适配器同步到服务器上的数据库。
  3. 我还设置了另一个适配器,它使用存储在数据库中的另一组凭据对用户进行身份验证。只有当应用程序在线时,才能对用户进行身份验证。

我想要做的是统一这两种方法,以便用户无需输入两组凭据即可访问这两组不同的功能。我想到的一种可能的解决方案是加密 JSONStore 并在没有用户干预的情况下执行适配器身份验证。但我不认为它是安全的。

有什么建议或方法来解决这个问题吗?

4

1 回答 1

2

以下只是一个想法,我不是安全专家。

要求:

  • 要使用离线功能,您必须至少在线并通过身份验证一次。
  • 您的应用程序必须具有登录视图才能输入一些凭据(例如用户名/电子邮件和密码)。

脚步:

  1. 用户第一次输入正确的凭据并成功通过服务器进行身份验证:对凭据进行哈希处理。例如:var myHash = md5(loginField.getUser() + loginField.getPassword())。你可以在 Github 上找到md5 JavaScript 库
  2. 使用该哈希来初始化存储。例如:WL.JSONStore.init(..., {password: myHash})
  3. 通过HTTPS将哈希发送到后端,如果用户更改他/她的凭据,您将需要它。无需在设备上保存凭据或哈希 ( loginField = null; myHash = null)。或者,您可以只在服务器上生成哈希并将其存储,而无需客户端将其发回,只需确保客户端和服务器都使用相同的哈希算法。
  4. 离线工作时,向用户询问他/她的凭据,对它们进行哈希处理并使用它来访问商店内的数据。
  5. 如果用户更改他/她的凭据(例如,通过您的应用程序的 Web 界面),哈希将不同并且存储不会初始化。但是,用户应该已经使用新的/有效的凭据成功地通过服务器进行了身份验证。向服务器询问旧哈希,使用旧哈希初始化存储,并根据新/有效凭据更改密码以将存储初始化为新哈希。例如:WL.JSONStore.changePassword(oldHash, newHash)

可选:您可能需要考虑使用salt。例如:var salt = Math.random(), myHash = md5(loginField.getUser() + loginField.getPassword() + salt)

您需要将盐存储在某处,以便在用户返回应用程序后重新生成哈希。您应该能够初始化另一个未加密的存储来保存它。例如WL.JSONStore.init(..., {username: 'metadata'}).then(function(){/*add salt to store*/}). 有关在此处使用两家商店的更多信息。

于 2014-01-26T03:56:00.720 回答