密码存储为何从MD5走向Argon2——一场持续六十年的攻防博弈

title: “密码存储为何从MD5走向Argon2——一场持续六十年的攻防博弈” date: “2026-03-06T08:45:20+08:00” description: “从1960年代MIT CTSS系统的首次密码泄露,到1979年Morris和Thompson发明salt机制,再到1999年bcrypt、2009年scrypt、2015年Argon2的相继问世,系统梳理密码存储技术六十年的攻防演进。深入分析彩虹表攻击的原理与防御、内存硬函数的设计哲学、GPU/FPGA破解技术的威胁演变,以及OWASP与NIST最新的参数配置建议。” draft: false categories: [“密码学”, “信息安全”, “Web安全”] tags: [“密码存储”, “bcrypt”, “scrypt”, “Argon2”, “PBKDF2”, “彩虹表”, “内存硬函数”, “密码哈希”, “GPU破解”, “salt”] 1962年,MIT的CTSS(Compatible Time-Sharing System)发生了一件小事:博士候选人Allan Scherr为了获得更多CPU时间,找到了一种方法打印出系统中所有用户的密码文件。这是历史上首次有记录的密码泄露事件,虽然影响范围有限,却暴露了一个根本性问题——当密码以明文存储时,任何获得数据库访问权限的人都能直接读取所有用户的凭证。 ...

11 min · 5396 words

为什么代码在本地正常部署到生产就崩溃:从环境差异到配置管理的完整排查指南

2012年6月30日,一次闰秒插入导致Reddit、LinkedIn等知名网站相继瘫痪。Linux内核处理闰秒时触发死锁,服务器CPU飙升至100%。这个事故揭示了一个被严重低估的问题:在分布式系统中,时间是最大的不确定性来源。 ...

11 min · 5364 words

setTimeout(fn, 0) 为什么总是比 Promise 慢:事件循环的任务调度真相

2014年,Philip Roberts 在 JSConf EU 上做了一场名为"What the heck is the event loop anyway?“的演讲。这个演讲后来在 YouTube 上突破了百万播放量,成为理解 JavaScript 异步机制的入门必修课。然而,演讲中并未触及一个更深层的问题:当 setTimeout(fn, 0) 和 Promise.resolve().then(fn) 同时存在时,谁先执行? ...

10 min · 4773 words

八十岁的大脑为何还能像五十岁一样运转?SuperAgers研究正在改写认知衰老的百年迷思

1990年代中期,当西北大学阿尔茨海默病研究中心收到一份特殊的脑组织标本时,研究人员没有预料到它将改变一个持续了一个世纪的科学假设。 标本来自一位81岁的女性,她在生前参与了一项纵向研究。令人惊讶的是,她的记忆测试成绩"优异"——不是"对于81岁来说很优秀",而是达到了56岁人群的平均水平。更令研究者困惑的是,在显微镜下,她的大脑几乎找不到神经纤维缠结——阿尔茨海默病标志性病理改变,而同龄人中几乎无人能逃过这种"正常"的病理累积。 ...

12 min · 5854 words

为什么分布式系统没有完美时钟:从Lamport到TrueTime的四十年博弈

1978年,Leslie Lamport在《Time, Clocks, and the Ordering of Events in a Distributed System》论文的开篇写道:“A distributed system can be described as one in which the failure of a computer you didn’t even know existed can render your own computer unusable.” 他当时大概没想到,这篇论文定义的"happened-before"关系,会成为分布式系统此后近五十年的基石。 ...

10 min · 4972 words

分布式事务为何成了架构师的噩梦——从两阶段提交到Saga模式的技术权衡

1978年,图灵奖得主Jim Gray在《Notes on Data Base Operating Systems》中正式描述了两阶段提交协议(Two-Phase Commit, 2PC)。这个协议的核心目标简单而直接:让分布在不同机器上的多个数据库,能够像操作单一数据库一样实现"全有或全无"的原子性保证。 ...

15 min · 7231 words

火焰图背后的采样:浏览器性能分析的底层原理

title: “火焰图背后的采样:浏览器性能分析的底层原理” date: “2026-03-06T07:53:58+08:00” description: “深入剖析浏览器DevTools Performance面板的底层实现原理。从V8引擎的CPU profiler采样机制、Chrome Tracing架构、Trace Event Format数据格式,到火焰图的可视化原理与safepoint bias问题,揭示性能分析工具如何从原始栈快照生成开发者日常使用的性能报告。基于V8官方文档、Chrome源码、Brendan Gregg的火焰图原论文以及Google的RAIL性能模型,系统梳理浏览器性能分析的完整技术链路。” draft: false categories: [“浏览器技术”, “性能优化”, “JavaScript引擎”] tags: [“性能分析”, “Chrome DevTools”, “V8引擎”, “火焰图”, “采样profiler”, “RAIL模型”, “JavaScript性能”] 2011年,性能工程师Brendan Gregg在Joyent公共云上调试一个MySQL性能问题时,面对的是一份长达591,622行的DTrace输出。即使只显示唯一栈跟踪,仍有27,053条记录。他把整个输出缩小到屏幕上时,看到的是一个毫无意义的灰色方块。 ...

13 min · 6503 words