【问题标题】:Worklight JSONStore rejecting some user passwords and not othersWorklight JSONStore 拒绝某些用户密码而不是其他用户密码
【发布时间】:2014-07-05 10:35:01
【问题描述】:

这里有一个奇怪的。 iOS 7.1 上 Worklight 6.1.0.01 中的 JSONStore 似乎任意拒绝某些密码。

这是我们用来初始化 JSONstore 的代码:

var bitArray = sjcl.hash.sha256.hash(username + ':'+ password);
var digest_sha256 = (sjcl.codec.hex.fromBits(bitArray));

options.username = username
options.password = digest_sha256;

options.localKeyGen =  true;
options.clear = false;
collections[this.collection1] = collection1;
collections[this.collection2] = collection2;
collections[this.collection3] = collection3;

WL.JSONStore.init(collections, options).then(function() {
    onSuccess();
}).fail(function(errorObject) {
    onFailure();
});

我有一个用户:ad1tst 密码: 此用户的 sha256 哈希输出为 b5de1dfbbd09c5f8cf78d858eb4ed09e3b9826f9c35c950d164e8accf7775082

使用这个哈希作为密码,用户可以初始化数据库。

我有另一个用户 ad2tst 密码: 该用户的 sha256 输出为 607c04ef944b36ec939d39f7c6b24757776918b8425e5a3b912738d6dea0ebea

使用此哈希作为密码,此用户无法初始化数据库。

如果用户 ad2tst 使用密码(其哈希值为 1feff7f75cfd73fc796d9dd612261b3f72f4292ce76ae3a5e92f7b1dbb2fd038),则用户可以初始化数据库。

此问题不仅限于这 2 个测试用户。我们的在线用户也出现了同样的问题。

我们从 JSONStore 运行时收到以下错误:

__33-[JsonStoreQueue setDatabaseKey:]_block_invoke [Line 128] Invalid password
2014-05-16 16:39:26.611 Audits[865:60b] THREAD WARNING: ['StoragePlugin'] took '71.429932' ms. Plugin should use a background thread.
2014-05-16 16:39:26.612 Audits[865:60b] [ERROR] [wl.jsonstore] {"src":"initCollection","err":-3,"msg":"INVALID_KEY_ON_PROVISION","col":"collection1","usr":"ad2tst","doc":{},"res":{}}

INVALID_KEY_ON_PROVISION 错误是由 JSONStore 插件的 'provision' 方法在 Worklight 的本机代码深处生成的。

在下面的一个尝试答案之后;应用程序的每次运行都是在全新安装时完成的。测试周期为:

  1. 安装应用程序
  2. 与其中一位测试用户一起运行
  3. 观察失败或通过,具体取决于提供的用户名/密码对
  4. 删除应用
  5. 转到第 1 步

所以,这不是数据库已经用另一个密码加密的情况。

【问题讨论】:

    标签: ibm-mobilefirst jsonstore


    【解决方案1】:

    如果您有任何问题,StackOverflow 是您获得答案的好地方。但是,对于错误报告,我建议opening a PMR。如果您正在寻找新功能,我建议opening a feature request。这里不适合处理这两个问题。

    我想指出几点:

    与 Android 不同,Android 使用 Shared Preferences 来保存加密的数据保护密钥 (DPK)。 iOS 使用 Keychain 代替。在不同之处中,共享首选项中的数据会在卸载应用程序时被删除。卸载应用程序时不会删除钥匙串中的数据,除非采取其他步骤。这是一个answer,它显示了在重新安装应用程序时如何清除钥匙串。我相信有一个与NSUserDefaults 一起工作的Worklight Hybrid API,记录在here 中。我还没有真正使用它,所以你的米数可能会有所不同。 JSONStore 的 Shared Preferences 和 Keychain 的使用记录在 here

    如果您每次重新安装应用程序时始终调用 JSONStore destroy API,我认为您的问题将得到修复(或至少得到缓解),这样您将获得相同的行为安卓展品。如果您在使用新的用户名和密码调用init API 之前调用closeAll API,则可以使用同一应用程序与不同的用户合作。 changePassword API 将更新用于访问商店内容的密码。

    我根据你的问题创建了一个新的QUnit test,看看here。这个想法是用一个用户+通行证开一家商店,添加,查找和关闭。然后用另一个用户+通行证打开另一个商店,添加,关闭,再次打开并找到存储的数据。所述测试用例正在使用 Worklight v6.1 在 iOS 7.1 上传递。请注意,我使用您输入的用户名和密码:

    • ad1tst + b5de1dfbbd09c5f8cf78d858eb4ed09e3b9826f9c35c950d164e8accf7775082
    • ad2tst + 607c04ef944b36ec939d39f7c6b24757776918b8425e5a3b912738d6dea0ebea

    重申一下我的答案:

    • 如果您想报告问题,请打开 PMR。我希望我上面的建议能解决这个问题,但它可能是其他问题,我误解了这个问题。
    • 如果您想要更好的 API 来处理特定用户场景,请打开功能请求。我认为提出的用例是有效的,值得追求。

    【讨论】:

      【解决方案2】:

      提供的密钥无效意味着您首先使用一个密码加密了商店,然后尝试使用另一个(错误的)密码打开它。

      在尝试使用新密码之前,请确保您使用的是不同的用户名,或者先破坏商店。

      如果您破坏了商店,然后使用另一个密码,它应该可以使用它。

      【讨论】:

      • 在上述缺陷的情况下,每次运行都是在刚刚安装的干净应用程序上完成的,因此没有 jsonstore 数据库的先前副本。测试周期是:1)安装应用程序,2)与测试用户之一运行,3)观察它失败或观察它通过,4)删除应用程序,5)重复步骤 1。所以,虽然你的观点是有效的,它不适用于这种情况。
      • 实际上,情况仍然可能如此,这取决于您所说的干净应用程序的含义。如果您删除了旧应用程序并安装了新应用程序而没有在任何一种情况下调用destroy,并且没有清除钥匙串,如果您使用相同的用户名,它仍然会为该应用程序存储密钥。那是因为删除应用程序后没有清除 iOS 钥匙串。这是一种不太可能发生的情况,但它可能就是这里正在发生的事情。如果不是这种情况,那么我们将不得不尝试和重现它。
      • Daniel:我想这是 IBM 员工的问题,WL 是否将密码存储在钥匙串中?此外,不得不调用destroy虽然是一种解决方法,但也不是很干净,因为用户可以在应用程序不知情的情况下随时删除应用程序。因此,应用程序总是需要检查设备上的首次运行,如果是首次运行,则销毁 JSONstore,以防它实际上不是设备上应用程序的首次运行。
      • 是的,安全工件(不是密码本身,而是与密码相关)存储在钥匙串中。似乎这是一个缺陷。你能确认这就是正在发生的事情吗?
      • 我们已经解决了这个问题,方法是保留一个用户偏好,该偏好指示该应用程序之前是否启动过。如果应用程序之前没有启动过(但钥匙串中可能有一些杂乱无章的东西),那么我们运行 WL.JSONStore.destroy()。在销毁的成功承诺中,我们初始化了数据库。这似乎有效,但它确实会生成关于没有 DPK 文档的虚假警告。
      猜你喜欢
      • 2015-02-16
      • 2013-01-22
      • 2019-09-26
      • 2023-04-11
      • 2017-04-02
      • 2013-11-01
      • 2015-12-20
      • 2018-08-20
      • 2011-08-06
      相关资源
      最近更新 更多