2015 Password Hashing Competition 胜出者 —— argon2
终于有人移植成网页版了:
https://github.com/P-H-C/phc-winner-argon2
不过该算法重度依赖 64 位整数计算,而 js/asm.js 并不原生支持 int64,只能用两个 32 位整数模拟,所以性能很低。还是期待 WebAssembly~
为什么要在浏览器端 Hash 口令?这对安全有很大的提升,网站拖库后攻击者破解 Hash 的难度将会增加上百万倍!具体可参考之前写的:https://www.cnblogs.com/index-html/p/frontend-slow-hash.html
看见好多人在用 CSP 日志来跟踪运营商广告,其实 CSP 原本是用来拦截 XSS 的,上报外部资源只是个辅助功能,各种不好用。。。
其实现在的主流浏览器有一个接口:performance.getEntries()
,可以取出网页加载过的所有资源:
几行代码就可以检测有没有加载异常的资源,比 CSP 灵活多了。
另外还有一种跟踪资源加载的方案:
document.addEventListener('load', e => {
console.log(e.target.src)
}, true)
虽然覆盖面没有前面那个大,但实时性强,并且兼容性更好,除了老 IE 外都能运行。熟悉前端的猜猜是什么原理~
Chrome49 支持 <a rel="noopener">
,W3C 总算是重视「跳转 opener」这种古老的钓鱼方式了。。。
WebP 刚出来时感觉特别兴奋,还写了个 flash 版的解码器(用 alchemy 编译)
https://www.etherdream.com/WebP/
后来觉得并没什么卵用,而且解码很慢。不知道现在用 asm.js + worker 会不会快一些~
Number.MAX_VALUE.toString(2)
1024 bit,53 个 1
和 971 个 0
。
"1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
(非原创)前些时候看到一个 js 版的 “文曲星模拟器”:
https://github.com/hackwaly/jswqx
镜像有几十 MB,如果直接 1:1 把 6502 指令翻译成 JS 的话估计超级大,性能可能比模拟还低。
上世纪 80 年代的 6502 CPU 指令“翻译”成 JavaScript~
贪吃蛇 Demo(ASWD 控制): http://www.etherdream.com/FunnyScript/6502snake/main.html
上回看到一个在线的 MOS 6502 CPU 的视觉图,于是突发奇想,能不能将 6502 指令 1:1 翻译成 JavaScrpt 呢?这样能直接在浏览器里运行,而不用模拟器。
于是遐想了几天,写了一些可行性的分析:
https://www.cnblogs.com/index-html/p/translate-machine-code-to-javascript.html
后来发现实现也不困难,借助现有的工具即可。。。就当开开脑洞~
(非原创)一个在线模拟 6502 CPU 的网站:
http://www.visual6502.org/JSSim/
(非原创)一个 asm.js 实现的红白机模拟机,性能不错,还有声音~
演示:https://tsone.kapsi.fi/em-fceux/
源码:https://bitbucket.org/tsone/em-fceux/
内置了几个有趣的卡带,还从没见过开场画面的年份有 2000 之后的 NES 游戏~~~
Chrome 特有的压缩算法 brotli,1G 空文件可以压缩到 13KB。压缩率远超 GZip,和 LZMA 差不多了~
感觉可以用来做压缩炸弹,比如把一个 1G 的 SVG 图片压缩到 10KB,然后通过外链作为论坛的签名~~~
(非原创)JS 版的 Python 解释器~
Demo: https://pypyjs.org/
(非原创)DOSBOX 的 asm.js 移植版,非常流畅,还有声音~
GitHub: https://github.com/dreamlayers/em-dosbox
Demo: https://classicreload.com/
用 js 写算法就应该利用好语言特性。
比如数组越界不会抛出异常,位运算时会当做 0,可以节省一些判断;比如object 天生支持 string 为 key 的哈希表,而且性能很高。。。
类似的特性还有很多,不利用就浪费了。
Chrome 目前要求 WebCrypto API 只能在 HTTPS 页面里使用。
个人感觉没有必要,即使没有这个 API 也可以用 JS 实现,只是性能低而已。
以前画的一个图,哪些环节会泄露你的密码。。。
记得很久以前就有 VRML,现在 VR 出来了是不是该出 VRML5 了~
Mozilla 的又一个黑科技 LLJS
:http://lljs.org/
有点类似 asm.js,可以转换出高性能的 JS 代码。LLJS 语言有点像 C,可惜并不兼容,还得有学习成本,估计流行不了。
貌似项目已经挂了。。。
神秘代码(番号)提取~~~
document.body.textContent.match(/[A-Z]{2,}-\d{3,}/g)
TypeScript 里的 const enum
真心不错,直接编译成常量。
过去貌似只有 google closure compiler 里才能实现这种效果。
如果出一个 UglifyTS,压缩效果应该会更好吧,毕竟 TypeScript 能提供更多语言层的信息~
恶作剧:真·乔布斯~
alias jobs="curl -L t.cn/RGp2Cg1"
window[n]
可得到页面第 n 个框架的 contentWindow
(并且不受同源策略限制)
window.length
可得到框架的个数。
虽然是个冷知识,但在 XSS 中会用到。以后再详细介绍。
可提高 zip 压缩率的工具 zopfli
,Google 出品。
https://github.com/google/zopfli
配合 nginx 的 gzip_static
指令,资源先离线压缩,然后发布压缩包到服务器。这样即可节省存储、带宽资源,又避免了运行时压缩,大幅节省 CPU 资源。
另外该项目下还有个叫 zopfli-png
工具用于压缩 PNG 图片,压缩率比 pngout 还高。
br 压缩出现后,这种方案意义就不大了。除了老浏览器,以及非 HTTPS 页面(HTTP 页面不支持 br 压缩)
如何发送日志而不在控制台 Network 里显示?
点击查看答案
扔给 opener 上报(必须存在而且同源)
当然还有其他方案,大家可以想想,甚至都不用 HTTP/TCP 协议~