【问题标题】:crypto.subtle don't exist even with webcrypto-shim即使使用 webcrypto-shim,crypto.subtle 也不存在
【发布时间】:2017-02-03 11:42:34
【问题描述】:

我正在制作一个带骨干网的 Cordova 应用程序,我的目标是使用 JSON Web 令牌 (JWT) 实现套接字身份验证。

为了签署我的 JWT,我使用了webcrypto-jwt,并且在浏览器中使用该应用时效果很好。

然后我在我的手机和 BBAAMM 上尝试了该应用... webcrypto-jwt 使用浏览器的 window.crypto.subtle 模块。

var cryptoSubtle = (window.crypto && crypto.subtle) ||
(window.crypto && crypto.webkitSubtle) ||
  (window.msCrypto && window.msCrypto.Subtle);

但在 android web view 上没有任何微妙之处!

所以我使用webcrypto-shim 来添加crypto.subtle。但它不起作用。

这是我的科尔多瓦window 对象的屏幕截图。它确实有一个加密密钥,但其中没有任何微妙之处!

所以我无法签署我的 JWT。

【问题讨论】:

  • 除非真的有必要,否则不要在标题中添加标签(例如如何将技术 X 与 Y 结合起来?

标签: javascript cordova backbone.js cryptography jwt


【解决方案1】:

https://github.com/PeculiarVentures/webcrypto-liner 将在大多数平台上为您提供一个有效的网络加密。

我已经用 https://github.com/square/js-jose 很好了。

您可以使用此测试您的浏览器对 WebCrypto 的支持 - https://peculiarventures.github.io/pv-webcrypto-tests/

瑞恩

【讨论】:

    【解决方案2】:

    Android WebView 不支持 WebCryptographyApi,webcrypto-shim 不针对该组件

    该库旨在修复这些具有前缀和错误 webcrypto api 实现的浏览器:

    Internet Explorer 11、移动 Internet Explorer 11、 Safari 8+,iOS Safari 8+。

    所以你得到了预期的行为。我认为 window.crypto 表明 Cordova 是旧的实现。

    如果您需要密钥存储,我建议使用 Android 原生密钥库(或 iOS,如果您为其构建)。如果您正在寻找加密函数,请包含一个纯 JavaScript 库

    【讨论】:

    • 感谢您的回答。那我就搜索jwt登录纯JS吧。
    【解决方案3】:

    经过更多的研究和测试,我发现了一个可以在 cordova 上运行的纯 js 库。

    jsrsasign

    我用它来验证我的 JWT。它不使用 crypto.subtle 模块。

            // Header
            var oHeader = { alg: 'HS256', typ: 'JWT' };
            // Payload
            var oPayload = {};
            var tNow = KJUR.jws.IntDate.get('now');
            var tEnd = KJUR.jws.IntDate.get('now + 1day');
            oPayload.iss = "http://foobar.com";
            oPayload.sub = "mailto:someone@hello.com";
            oPayload.iat = tNow;
            oPayload.exp = tEnd;
            oPayload.jti = "id123";
            oPayload.aud = "http://someUrl";
            oPayload.email = "userEmail";
            oPayload.pwd = "userPassword";
            oPayload.deviceId = "deviceId";
    
            // Sign JWT.
            var sHeader = JSON.stringify(oHeader);
            var sPayload = JSON.stringify(oPayload);
            //secret -> your secret that the server gave you.
            var sJWT = KJUR.jws.JWS.sign("HS256", sHeader, sPayload, secret);
            console.log(sJWT);
    

    就是这样。它解决了我的问题。
    我知道未定义的 crypto.subtle 错误仍然存​​在。我没有找到任何解决该问题的方法。
    我想有一天负责cordova的开发人员会努力支持我们可以在所有其他浏览器中找到的cryto模块,但目前唯一的解决方案是使用第三方库。

    【讨论】:

      猜你喜欢
      • 2018-06-13
      • 1970-01-01
      • 2019-11-10
      • 2018-09-25
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多