杂记 › 技术笔记 › 改了盐值不点按钮,四个框一动不动:MD5 页的三段拼接与多行输入实测

改了盐值不点按钮,四个框一动不动:MD5 页的三段拼接与多行输入实测

三段拼接顺序与四组盐填法实测互不相同,盐与原串边界平移拼成同一条串才同值;textarea从不按行拆分,多行只出1条哈希;空输入走守卫,四个框留着上一次的值。

四个框的不同填法:同一句 hello 送进去是四条串

这页脚本段我逐字切出来在 Node 里原样跑,哈希库那一步换成内置 crypto 对 UTF-8 字节算 MD5,拼接与切片一行未动。要量的只有一行:const text = pre + raw + suf;。模板实测 3635 字节、84 行行行 CRLF。

原串固定填 hello,四组填法捕获到的送哈希串逐字是 hello、salt1hello、hellosalt2、salt1hellosalt2:三段之间没有分隔符也不做 trim。

前置盐后置盐送哈希的串32 位小写
空空hello5d41402abc4b2a76b9719d911017c592
salt1空salt1hello95a2e8514b40b95ef41fb464a6e382ee
空salt2hellosalt2d25f7bdb12f78be4238273d49591f882
salt1salt2salt1hellosalt27be7c42377de79b9012a2fba496208c6

去重计数实测 4/4 互不相同;两组盐对调拼出 salt2hellosalt1,实测结果与都填那条也不同——顺序一变串就变。这页 文本 MD5 在线工具 的哈希调用点只有 calcMd5() 一处。

三段顺序固定:前置盐 + 原串 + 后置盐,拼成一条串再哈希 pre 前置盐 + raw 原串 + suf 后置盐 = 一条 text 原串填 hello:四组填法捕获 4 条串,32 位结果去重 4 对 4 两盐对调是第五条串,结果不同 边界 5 种切法都拼成 abc:同一条串、同一个结果 测试|文|一下 与 测|试文|一下 都是 测试文一下:5 码元 15 字节 函数只看拼完的那条字符串

图 1:三段拼接的顺序,与两类同值的来路

边界平移:拼出来是同一条字符串

前中后三格按 ab|c|、a|bc|、|abc| 等五种切法填,捕获值五条逐一都是 abc,32 位结果全等于 900150983cd24fb0d6963f7d28e17f72。中文同型一组 测试|文|一下 与 测|试文|一下 都拼成 测试文一下,两条同为 8f76011a697386edf2f3132d4e4f57de。函数只看拼完的那条串,边界切在哪不算它的口径;上面的两盐对调换的是串本身,所以换的是结果。

textarea 从不按行拆分

函数体没有 split、也没有按行的循环,换行只是串里一个普通码元:

输入(JSON 转义写法)码元换行码元32 位小写
"alpha\nbeta\ngamma"162b81e722771977ee32a6822155f761acd
"alphabetagamma"14011db5b10e1c21d2e7e4dfa597552e331
"alpha\nbeta"1016d76416219367970d143155ecd77d609
"alpha\r\nbeta"多一枚 \r10ff5fc67c03065f1c72d4ac72aeefdbf

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。

input 监听只在原串非空时整算一遍 h he hel hell hello 退格 4 步 删空不触发 总计数 9 = 5 + 4,删到空调用 0 次、提示 0 次 两个盐框监听 0 个:改前盐不点按钮,输出逐字符不变 点一下才把新盐拼进串,salt9hello 另得一条结果

图 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:改了盐值结果没动,是没算吗?

盐框没有监听,改完不点按钮就不算;空输入被守卫拦下时只弹提示,四个框仍保持上一次的值。

📎 相关文章

取色器只收六位数:三位短写摘出能算、页面永远走不到,全空间恒等率 10.5813% 2026-11-08 60 位时间戳在这一页只剩 28 个位:UUID 生成器 v1 分支的移位与掩码逐毫秒实测 2026-11-08 替换次数报 5 还是报 1:批量查找替换的三个开关与零宽匹配实测 2026-11-07 空一个框就 0 张卡:分数通分页的静默失败、跳号的「分数N」与 990 行不约分 2026-11-07 删右侧给空串、截右侧还整行:text-line-ops 的码元口径与越界不对称实测 2026-11-07