如何在chrome中使用SubtleCrypto(window.crypto.subtle未定义)

gue*_*est 11 javascript cryptography google-chrome

这真是令人尴尬

几乎在互联网上的任何网站上,

window.crypto.subtle
Run Code Online (Sandbox Code Playgroud)

回报

SubtleCrypto {}
  __proto__: SubtleCrypto
Run Code Online (Sandbox Code Playgroud)

在chrome控制台中(v61(官方版)(64位))

除了

我的网页和blank.org

哪里

window.crypto.subtle
Run Code Online (Sandbox Code Playgroud)

回报

undefined
Run Code Online (Sandbox Code Playgroud)

根据https://developer.mozilla.org/en-US/docs/Web/API/Crypto/subtle 它是一个只读属性,应始终返回SubtleCrypto对象.

我可以做些什么,或者什么有空白做了它可能没有?

ps:在Firefox中,它似乎在我的网站和blank.org上按预期工作

Zma*_*art 35

根据规范(通过Github问题)来自WebCrypto的这个Google页面:

crypto.subtle在不安全的上下文中应该是未定义的

  • 因此它只能通过 https 使用,而不是 http。 (6认同)
  • 我注意到,当针对本地 HTTP URL(例如 http://localhost:8080/)时,“window.crypto.subtle”可用,这对于本地 Web 开发和互联网外的测试非常有用。也许本地 HTTP 连接也被视为“安全上下文”?尽管如此,“window.crypto.subtle”对于远程 HTTP URL 来说仍然是“未定义”。(使用 Firefox/Windows 进行测试,加上本地 dev+test 配置中的 Docker) (5认同)

小智 6

看起来你必须使用带有 https://...... 的网站,而不是普通的 http://......

从规范中 - 很容易错过(并由上面的 Zmart 链接):

对 WebCrypto API 的访问仅限于安全来源(即 https://pages)。

  • http://localhost 和 http://127.0.0.1 也被视为安全上下文,请参阅 https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts (6认同)

Roh*_*hit 5

检查您的网址

如果是 https://localhost:PORT0.0.0.0:port127.0.0.0:port

将其更改为正确的主机名URL,例如 http://localhost:PORT

为我工作!谢谢@Zmart


use*_*280 5

如果您不运行您的网站SSLhttps答案是:您不能使用window.crypto.subtle. 您必须配置SSL您的网络服务器。查看有关Crypto.subtle的 MDN 文档,页面顶部有一个很大的警告,表示“安全上下文”,这意味着它仅在https.

如果您仍然需要支持,还有一个替代解决方案http。并且它不涉及使用window.crypto.subtle而是其他开源第三方库。具体方法如下:

您可以使用Forge,它是一个具有相同功能的加密库,window.crypto.sybtle它具有满足您需求的所有加密算法。

您可以使用 forge,而不是window.crypto在 上运行服务http

请注意,API 非常不同,您需要使用forge与使用window.crypto. 您需要阅读Forge 文档,以使特定的加密方法适合您的用例。使用forge时,您不能使用在 window.crypto.subtle 中工作的相同代码,您需要找到自己的方式如何使用 forge 进行加密。

供您参考,了解forgeVS window.crypto.subtleCode 有何不同,请阅读下文。

链接到原始window.crypto.subtle的 darkwire.io 代码和翻译后的 darkwire.io 代码,而forge不是使用window.crypto.subtle

  • 原始代码使用window.crypto.subtle这里

  • 代码翻译为使用 forgehttp ,可以在没有SSL: here的情况下运行

我已经将 darkwire.io 翻译为将 forge 用于我自己的项目,该项目运行http并需要客户端之间的加密通信方法。