以下只是一个想法,我不是安全专家。
要求:
- 要使用离线功能,您必须至少在线并通过身份验证一次。
- 您的应用程序必须具有登录视图才能输入一些凭据(例如用户名/电子邮件和密码)。
脚步:
- 用户第一次输入正确的凭据并成功通过服务器进行身份验证:对凭据进行哈希处理。例如:
var myHash = md5(loginField.getUser() + loginField.getPassword())
。你可以在 Github 上找到md5 JavaScript 库。
- 使用该哈希来初始化存储。例如:
WL.JSONStore.init(..., {password: myHash})
。
- 通过HTTPS将哈希发送到后端,如果用户更改他/她的凭据,您将需要它。无需在设备上保存凭据或哈希 (
loginField = null; myHash = null
)。或者,您可以只在服务器上生成哈希并将其存储,而无需客户端将其发回,只需确保客户端和服务器都使用相同的哈希算法。
- 离线工作时,向用户询问他/她的凭据,对它们进行哈希处理并使用它来访问商店内的数据。
- 如果用户更改他/她的凭据(例如,通过您的应用程序的 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*/})
. 有关在此处使用两家商店的更多信息。