crypto.subtle 即使使用 webcrypto-shim 也不存在

crypto.subtle don't exist even with webcrypto-shim

我正在使用 backbone 制作 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 网络视图上没有任何细微差别!

所以我用webcrypto-shim加了crypto.subtle。但是没用。

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

所以我不能签署我的 JWT。

WebCryptographyApi 在 Android WebView 上不受支持,并且 webcrypto-shim 不针对此组件

The library is targeted to fix these browsers having prefixed and buggy webcrypto api implementations:

Internet Explorer 11, Mobile Internet Explorer 11, Safari 8+, iOS Safari 8+.

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

如果您需要密钥存储,我建议使用 Android 本机密钥库(或者 iOS 如果您为此构建)。如果您正在寻找密码功能,请包含一个纯 javascript 库

经过更多的研究和测试,我发现了一个可以在 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);

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

https://github.com/PeculiarVentures/webcrypto-liner 将为您提供在大多数平台上可用的 webcrypto。

我用过 https://github.com/square/js-jose 很好。

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

瑞安