四个框的不同填法:同一句 hello 送进去是四条串
这页脚本段我逐字切出来在 Node 里原样跑,哈希库那一步换成内置 crypto 对 UTF-8 字节算 MD5,拼接与切片一行未动。要量的只有一行:const text = pre + raw + suf;。模板实测 3635 字节、84 行行行 CRLF。
原串固定填 hello,四组填法捕获到的送哈希串逐字是 hello、salt1hello、hellosalt2、salt1hellosalt2:三段之间没有分隔符也不做 trim。
| 前置盐 | 后置盐 | 送哈希的串 | 32 位小写 |
|---|---|---|---|
| 空 | 空 | hello | 5d41402abc4b2a76b9719d911017c592 |
salt1 | 空 | salt1hello | 95a2e8514b40b95ef41fb464a6e382ee |
| 空 | salt2 | hellosalt2 | d25f7bdb12f78be4238273d49591f882 |
salt1 | salt2 | salt1hellosalt2 | 7be7c42377de79b9012a2fba496208c6 |
去重计数实测 4/4 互不相同;两组盐对调拼出 salt2hellosalt1,实测结果与都填那条也不同——顺序一变串就变。这页 文本 MD5 在线工具 的哈希调用点只有 calcMd5() 一处。
图 1:三段拼接的顺序,与两类同值的来路
边界平移:拼出来是同一条字符串
前中后三格按 ab|c|、a|bc|、|abc| 等五种切法填,捕获值五条逐一都是 abc,32 位结果全等于 900150983cd24fb0d6963f7d28e17f72。中文同型一组 测试|文|一下 与 测|试文|一下 都拼成 测试文一下,两条同为 8f76011a697386edf2f3132d4e4f57de。函数只看拼完的那条串,边界切在哪不算它的口径;上面的两盐对调换的是串本身,所以换的是结果。
textarea 从不按行拆分
函数体没有 split、也没有按行的循环,换行只是串里一个普通码元:
| 输入(JSON 转义写法) | 码元 | 换行码元 | 32 位小写 |
|---|---|---|---|
"alpha\nbeta\ngamma" | 16 | 2 | b81e722771977ee32a6822155f761acd |
"alphabetagamma" | 14 | 0 | 11db5b10e1c21d2e7e4dfa597552e331 |
"alpha\nbeta" | 10 | 1 | 6d76416219367970d143155ecd77d609 |
"alpha\r\nbeta" | 多一枚 \r | 1 | 0ff5fc67c03065f1c72d4ac72aeefdbf |
1 到 6 行的样本串长 5、10、16、22、30、35 码元、换行码元从 0 到 5,而每一次的哈希调用都是 1 次、结果 1 条。intro 那句「批量处理:支持多行文本批量生成MD5」判 [冲突]:输出只有 4 个单值只读框。
监听器 1 对 0 对 0
#md5-input 上挂着 1 个 input 监听,两个盐框各 0 个;监听体逐字是 if (this.value) calcMd5();。从空态逐字符敲入 hello 触发 5 次,捕获的串依次是 h、he、hel、hell、hello;再逐字符退格触发 4 次,删到空那一步 0 次调用、0 次提示,屏幕停在 h 的 2510c39011c5be704182423e3a695e91 上,总计数 9 = 5 + 4。
图 2:input 监听的触发计数
空输入被守卫拦住,框里留着上一次的值
守卫逐字是 if (!raw) { UU.toast('请输入要加密的文本', 'error'); return; }:盐框填什么都拦,盐框留空则按空段参与拼接。三帧实测——帧 A 预填 ab、hello、cd,捕获 abhellocd,32 位小写 07663b565bdbcf17432e20d56eb1a51b,结果容器转为显示;帧 B 打字清空输入,监听判空不调用、连提示都不弹;帧 C 点按钮,提示计数 +1,return 之后的赋值一条没执行,四个只读框与容器状态和帧 A 逐字符相同。d41d8cd98f00b204e9800998ecf8427e 确是空串的 MD5、与 intro 那条例常量逐字符 0 处差异,但本页的空输入进不到哈希调用点,这条例值没有任何路径能复现。清空按钮走另一条:一次抹掉 7 个 id 的值。
中文与 emoji 按 UTF-8 字节进哈希
中 是 1 码元 / 3 字节(e4b8ad),测试文本 是 4 码元 / 12 字节(e6b58be8af95e69687e69cac),一枚 U+1F600 的 emoji 与 U+20000 那个增平面汉字都是 2 码元 / 4 字节。两条路径在 6 条样本上 6/6 一致,RFC 1321 的 5 条向量 5/5 命中——进哈希的始终是字节,不是屏幕上的字数。
对着 intro 只登记三句
- 「大小写切换」:没有可切的动作,两个大写值与两个小写值在同一次点击里同时写进 4 个框。[部分一致]
- 「16位是取中间16个字符」:
substring(8, 24)取到 1 基第 9 到第 24 个字符、长 16,6 条输入上它与 32 位串同区间逐位相同 6/6。这句SHA-256 与 MD5 对比旧文写过,不展开。[一致] - 「批量」见上面的换行表,[冲突]。intro 的安全提示块与加盐条目的评价句只登记、不评价;文件那一页(文件 MD5 计算)本篇没测,也不外推别的哈希页。
FAQ
Q:盐放前边还是后边,结果一样吗?
看拼出来的那条串:只填前盐是 salt1hello、只填后盐是 hellosalt2,两条两个结果。平移只在拼完是同一条字符串时同值;两盐对调拼的不是同一条,结果也不同。
Q:贴 3 行能得到 3 个哈希吗?
不能,实测 1 次调用、1 条结果。删掉换行实测会让结果换一条,CRLF 与 LF 也是两条串。
Q:改了盐值结果没动,是没算吗?
盐框没有监听,改完不点按钮就不算;空输入被守卫拦下时只弹提示,四个框仍保持上一次的值。