1
JavaScript加载和SHA-256
这是一个带有实际应用程序的代码难题。当前使用的某些浏览器(如果您输入的网址类似于 data:text/html,<script>alert("hi")</script> 将执行给定的JavaScript代码。现在假设您有一个看起来像(伪代码)的URL: data:text/html,<script> myPublicKey="12345678"; cryptoLib=download("http://example.com/somecryptolib.js"); if(sha256sum(cryptoLib) == "12345678") eval(cryptoLib) </script> 如果您将此代码作为QR代码打印在名片上,那么使用适当的浏览器访问该URL的任何人都将获得一个预加载了公钥的公钥加密客户端,而无需安装任何东西。由于进行了哈希验证,因此即使他们的ISP干扰了流量,您也可以确信他们拥有真正的加密软件。 不幸的是,此伪代码的实际版本对于QR码来说相当长。我的挑战是:您能做到多短?一个实现将: 成为数据:...从Chrome和Firefox的地址栏中正确执行的URL。(要生成有效的数据:URL,您必须将%编码为%25,并删除换行符) 嵌入URL和SHA-256哈希,最好在开头附近添加纯文本字符串文字 使用XMLHttpRequest(或类似的API)从URL下载文件。(请注意,服务器必须包含一个Access-Control-Allow-Origin:*标头,才能正常工作。) 如果该URL成功加载,并且结果是带有预期哈希值的文件,请使用eval()对其进行处理。否则,什么也不做,或显示错误消息。 Chrome和Firefox中都存在的所有内置JavaScript函数都是公平的游戏,但是无法加载库。 使用尽可能少的字节 我使用CryptoJS(缩小版)制作了一个简单的版本: data:text/html,<script> u = 'http://localhost:8000' h = '5e3f73c606a82d68ef40f9f9405200ce24adfd9a4189c2bc39015345f0ee46d4' // Insert CryptoJS here r = new XMLHttpRequest; r.open('GET', u, false); r.send(); if(CryptoJS.SHA256(r.response) == h) eval(r.response); </script> 从缩小器出来的是: data:text/html,<script>u="http://localhost:8000";h="5e3f73c606a82d68ef40f9f9405200ce24adfd9a4189c2bc39015345f0ee46d4";var CryptoJS=CryptoJS||function(k,w){var f={},x=f.lib={},g=function(){},l=x.Base={extend:function(a){g.prototype=this;var c=new g;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return …