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 库。
我用它来验证我的 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/
瑞安
我正在使用 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 库。
我用它来验证我的 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/
瑞安