WP Adminify 年来最糟糕的支持之夜是从白屏开始的,我们'd 在晚上 11 点左右将 3.1。2 版本推送到更新服务器,到凌晨 2:40 我有 14 张票说了同样的话:安装了更新,站点死了,我回滚了,重新测试了我机器上的 zip - 完美工作了 同一个版本 同一个文件。据说。
我花了令人尴尬的长时间才做了一件显而易见的事情:两个文件都哈希。 SHA-256 的zip在我的笔记本电脑和坐在更新服务器上的zip的sha-256不't匹配。甚至没有关闭-完全不同的摘要。上传在传输中期的某个地方被截断,服务器高兴地服务一个破损的存档,php在里面不完整的文件上窒息。一个校验和比较会在单个用户更新之前抓住它。在那天晚上之后,每个wp管理员版本都将其sha-256打印在部署日志中,并且上传脚本拒绝发布,除非远程哈希匹配本地。自那以后零损坏的版本。
That's什么是哈希,最实用:数据的指纹。在文件或字符串中输入,拿回一个短的固定长度摘要。如果即使一个字节发生变化 - 一个翻转位,一个截断的下载,一个偷偷编辑 - 摘要完全改变。我现在每周多次在线访问哈希生成器:验证下载,调试webhook签名,比较跨环境的配置文件,理智 - 检查两个"相同"文件实际上是。
这就是为什么我内置了一个 Toolz.dev。我想要一个哈希工具,它可以计算浏览器中的所有内容,并排显示 MD5、SHA-1、SHA-256 和 SHA-512,并且从不将输入的字节上传到任何地方。本指南涵盖了如何使用它,什么's 实际上发生在引擎盖下,以及我很早就自己犯的一个哈希错误 - 并且今天我仍然在代码库中看到。
TL;博士: 使用 Toolz.dev 哈希生成器 web加密api从文本或文件中立即完全在浏览器中计算md5,sha-1,sha-256和sha-512摘要。对于任何重要的事情,默认sha-256;仅将md5和sha-1视为遗留校验和。并且永远 - 从来 - 将这些中的任何一个用于密码。that's bcrypt或Argon2领土。
主要特点
同时使用多种算法
MD5, SHA-1, SHA-256, SHA-512同时计算, 这听起来像是一个小方便直到你're调试别人's系统而你不'不知道他们使用了哪种算法I've实时输给了这个-一个支付网关's docs说"SHA哈希"没有附加数字, 我坐在那里生成摘要在终端一次一个算法直到一个匹配。一次所有四个摘要在屏幕上, 你只是眼球哪个排队与价值你're试图匹配。它也使差异发自内心:你可以看到32个字符的MD5旁边的128个字符SHA-512,并立即了解什么"消化大小"意味着在实践中。
文本和文件散列
Type 或粘贴字符串,或掉入文件 - 工具同时处理。文本哈希涵盖了日常情况:API 签名调试、缓存密钥、快速比较。文件哈希是真正验证工作发生的地方。根据已发布的校验和检查下载的安装程序,确认一个插件 zip 在您的更新服务器之旅中幸存下来,验证机器之间完整复制的数据库转储。该文件永远不会在任何地方上传; it's 由浏览器在本地读取并哈希到位。I've 哈希数百兆字节 SQL 转储。It's 比您更快'd 预期,因为繁重的工作发生在本机浏览器代码中,而不是 JavaScript 循环中。
通过 Web 加密程序进行即时客户端计算
SHA家族摘要是用浏览器's内置的Web加密API计算的- crypto.subtle.digest--它运行本地, 优化的加密代码随您的浏览器出货。没有服务器往返, 没有队列, 没有旋转器。您得到的结果速度与您的机器读取输入的速度一样快。这很重要有两个原因。首先, 速度:哈希发生在毫秒, 即使对于大的输入。其次, 信任:因为计算是本地, 无论您're在线在咖啡店或哈希一个敏感的配置在锁定网络上, 工具的工作相同。页面加载一次;之后, 网络无关。
大写和小写输出
Trivilial feature, 拯救真正的头痛 六角形消化物在意义上是不区分大小写的- 2CF24DBA 並 2cf24dba encode相同的字节- 但字符串比较don't know that。Plotyous systems存储或发布摘要大写(一些Windows工具,某些供应商校验和页面),而大多数Unix工具会发出小写。如果你'重新粘贴摘要到比较脚本或一个配置文件中,该脚本会进行精确的字符串匹配,那么case突然很重要。toggle意味着你复制你需要的格式,而不是通过case转换器运行输出,或者,更糟糕的是,"fixing"它通过手和胖指字符。
比较和验证模式
Hashing只是工作的一半 - 通常你're检查摘要与预期值。将已发布的校验和粘贴在计算的旁边,工具会立即告诉你它们是否匹配,无需在64个十六进制字符处眯眼。我以前通过目视比较前几个和后几个字符来验证校验和。那's正是你如何错过中间的不匹配。人眼在比较长随机字符串时很糟糕;那's是平等检查的工作。验证模式还规范化情况,并在比较之前修剪空白,这会杀死最常见的误报:来自草率复制粘贴的杂散尾随空间。
100% 私密 - 没有什么可以离开您的浏览器
toolz。dev的所有内容上,这是我拒绝妥协的功能。你的输入 - 文本或文件 - 在本地散列,从不传输。那里's没有服务器端处理,没有日志记录,没有"我们匿名化你的数据"细则打印,因为那里's没有数据可以记录。这对于散列来说比人们意识到的更重要:开发人员散列的东西通常正是他们应该的东西't粘贴到一个随机的网站 - API秘密,同时调试HMAC签名,许可证密钥,随客户电子邮件转储。使用客户端工具,风险蒸发。打开浏览器's网络选项卡,同时散列,如果你想要证明。我写了更多关于为什么这个架构在我的 数据隐私和在线工具 帖。
如何使用哈希生成器
1步:打开工具并选择您的输入
前往 哈希发生器。you'll看到一个输入区域,它接受输入/粘贴的文本或文件,对于文本,只需开始输入-哈希随你而发生,对于文件,拖动一个到丢弃区域或使用文件选择器,没有任何上传;文件由浏览器在本地读取。那里's没有超出您的机器的大小上限's内存舒适。
第 2 步:阅读摘要
所有算法一次性计算:MD5、SHA-1、SHA-256、SHA-512。每个摘要都出现在自己的标记行中,以十六进制形式。注意长度 - MD5 为 32 个字符,SHA-1 为 40 个字符,SHA-256 为 64 个字符,SHA-512 为 128。如果您'重新匹配已知的校验和,而您'不确定哪种算法产生了它,在比较单个字符之前,通常会先告诉您长度。
第 3 步:如果需要,切换情况
You're与使用大写十六进制匹配的系统,翻转大小写切换,摘要字节无论哪种方式都是相同的- 这纯粹是关于字符串格式化。用复制按钮复制摘要,而不是手工选择;一个128个字符的SHA-512摘要非常容易部分选择,截断的摘要将默默地失败你与它进行的每一次比较。
第 4 步:针对预期的哈希进行验证
Got a published checksum from a vendor's download page or a colleague's deploy dog?paste到比较字段中,工具根据你计算出的摘要检查它,给你一个明确的匹配或不匹配,匹配意味着数据字节对字节与产生原始哈希相同,不匹配意味着改变了一些东西- 损坏的传输,错误的文件版本或篡改。Don't合理化一个不匹配。重新下载并再次检查。
MD5 vs SHA-256:什么'实际上发生在胡德之下
密码哈希函数获取任意长度的输入并产生称为摘要的固定长度输出。四个属性使其有用。It's 确定性- 相同的输入总是产生相同的摘要。它表现出 雪崩效应- 更改一位输入,大约一半输出位翻转。它's 单向-那里's从消化回输入没有可行的路径。还有它's 抗碰撞- 找到产生相同摘要的两个不同输入在计算上应该是不可行的。
雪崩效应值得用真实的价值来看待。的MD5 hello 於 5d41402abc4b2a76b9719d911017c592.把一个字母大写- Hello- 你明白了 8b1a9953c4611296a827abf8c47804d7。没有一个角色发生转变;完全无关的摘要。与SHA-256的故事相同: hello 哈希到 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824、而 Hello 出一个基本上与它没有任何共享的摘要。that's重点。一份摘要告诉你 是否 数据改变了,从来没有 多少。
现在,算法。 MD5 1992年在RFC 1321中定义,并产生128位摘要。它's快速,它's无处不在 - 而且它's加密破碎。自2004年以来,实际的碰撞攻击就已经存在;研究人员可以在商品硬件上使用相同的MD5摘要制造两种不同的输入。这会杀死它的任何对抗:签名,证书,攻击者可能替换内容的完整性检查。它仍然可以用于非对抗性校验和 - 检测文件传输中的意外损坏,重复自己的数据 - 因为随机损坏不't可以选择其字节。 沙-1 (160位)持续时间更长,但SHAttered攻击在2017年展示了一次实际碰撞,并配有两个不同的PDF共享一个SHA-1摘要,Git出于历史原因仍然在内部使用SHA-1,但没有新的系统应该。
的 SHA-2 家族- SHA-256和SHA-512其中 - 在FIPS 180-4中指定,并且保持不间断,SHA-256给你一个256位的摘要,是几乎所有东西的理智默认值,SHA-512提供了一个更大的摘要,并且经常 更快 64位CPU上,因为它以64位字体工作。
人们不断模糊的三个区别。 散列 是单向的- 没有钥匙,没有回头路。 加密 是双向的 - 任何拥有密钥的人都可以解密。 编码base64一样,是零向保护- it's只是任何人都可以反转的表示变化,不需要密钥如果你'曾经见过Base64被当作"加密,"我的 Base64 转换器 将愉快地展示为什么这's是一个问题,而我的 Base64 编码指南 深入涵盖了区别。
当你需要证明一条消息来自持有共享秘密的人时 - 网络挂钩签名,API请求签名 - 简单的哈希是't 足够了,因为任何人都可以哈希。那个's HMAC、RFC 2104 中定义:一个键控结构,包裹哈希函数,因此只有键控器才能生成有效的摘要 HMAC-SHA256 是大多数 webhook 签名方案背后的主力你'll ever debug。
还有一个大的: 从不使用快速哈希的哈希密码。 Fast是这里的敌人- 一个数据库泄露的攻击者可以在GPU上测试每秒数十亿个MD5或SHA-256猜测,密码需要刻意慢,盐算法:bcrypt或Argon2。Laravel's Hash::make() 正是出于这个原因,默认使用 bcrypt,而 WordPress 在现代化之前花了数年时间在 phpass 便携式哈希方案上 - 不完美,但本能(放慢速度,盐)是对的。我以艰难的方式学到了这一点:我的一个早期自由项目,在 WP 管理之前几年,将密码存储为原始密码 md5($password)、经典新秀招式,没人被攻破,我还是畏缩不前。
Here's 工具z。dev工具在引擎盖下做什么,以及你'd自己写什么:
const data = new TextEncoder().encode('hello');
const buf = await crypto.subtle.digest('SHA-256', data);
const hex = [...new Uint8Array(buf)]
.map(b => b.toString(16).padStart(2, '0'))
.join('');
// "2cf24dba5fb0a30e26e83b2ac5b9e29e..."
或者在 PHP 中,一行: hash('sha256', 'hello').相同的输入,相同的摘要,任何语言,任何机器。那个决定论是整个基础。
常见用例
验证文件下载和发布文物
Intro 中烧毁我的用例 供应商在下载旁边发布校验和的原因是:传输损坏,镜像过时,偶尔有人恶意交换文件 下载文件,用 the hash 哈希发生器、与已发布的值进行比较匹配:该文件与发布者散列的内容字节相同不匹配:停止并重新下载对于我自己的版本,自凌晨 2:40 事件以来的规则是机械的 - 部署脚本在本地计算 SHA-256、上传、获取远程文件's 哈希值,并拒绝翻转"当前版本"指针,除非它们're 相等。它's 可能是八行 bash。此后它捕获了两次截断的上传,这两次都是票洪水。在我整个管道中最便宜的保险。
缓存破坏和 ETag
Browsers 积极缓存,而 "请硬刷新 " 不是部署策略,稳健的修复是内容散列的文件名:散列文件's 内容,并在名称中嵌入一块摘要,所以 app.css 变成 app.2cf24dba.css。内容更改,哈希更改,文件名更改,缓存未命中,用户获取新文件。内容相同,文件名相同,缓存命中。Laravel Mix 和 Vite 自动执行此操作;在 WP Adminify 中,我做了自制版本,对资产内容进行哈希构建 ver 查询字符串 WordPress 附加到已排队的脚本 - 在过多 " 之后,设置面板看起来损坏了 " 真正陈旧的 CSS 门票。相同的原理为 ETag 提供支持:服务器哈希响应,浏览器将哈希发送回,匹配意味着一个微小的 304 而不是完整的有效负载。
重复内容
想知道两个文件是否相同而不逐字节比较它们 - 或者当它们生活在不同的机器上时?Hash 两者。等摘要意味着等内容(使用 SHA-256,碰撞赔率非常小,它们'不值得一想)。这可以美妙地扩展:哈希一千上传,对摘要进行排序,并立即重复集群。I've 用它来推断一个已经积累了多年的 WordPress 媒体库 logo.png、 logo-1.png、和 logo-final-2.png-散列揭示了哪些实际上是相同的图像,具有不同的名称。它's还备份工具如何决定跳过什么以及对象存储如何检测"上传"是他们已经持有的内容。
Git 样式内容寻址
Git does't按名称存储文件- 它按哈希存储。每个blob、树和提交都由其内容的摘要(历史上为SHA-1,正在进行SHA-256转换)来寻址。that's为什么提交ID看起来像哈希:他们 都是 hashes,并且它们涵盖了快照,父母,作者,时间戳在历史的任何地方改变任何东西,下游的每个hash变化,这就是为什么大声地篡改git历史,而不是悄悄地理解这一点改变了我如何调试git问题当两台机器对提交意见不一致时,比较hashes会立即告诉你,你're看着同一个对象或发散的历史内容寻址是那些听起来很学术的想法之一,直到它保存你的回购。
比较配置而不暴露秘密
上演作品,制作不't,你怀疑 .env files different - 但你不't want production secrets pasted into a Slack thread or a screen share。Hash 每个文件在自己的机器上, 比较摘要, 不同的哈希确认文件不同, 而不透露单个值。你可以更精细:哈希单个行或特定键来精确定位 哪 entry diverges。I've解决了不同意见,主机支持这样 - "你的配置副本不't匹配我的,这里's我的SHA-256,检查你的"结束辩论在一个消息摘要证明差异或相同而秘密恰好留在他们所属的地方。
网络挂钩签名调试
Stripe, GitHub, Paddle - 他们都在webhook有效负载上签名,通常使用HMAC-SHA256,因此您可以验证请求实际上来自他们。并且当您的验证失败时,调试很痛苦,因为失败是沉默的:签名只是don't匹配,中间件说不。十分之九的罪魁祸首是有效负载- 您的框架重新序列化了JSON,更改了空格或密钥顺序,因此您're散列了与签名不同的字节。散列了 原始 request body 在你管道中的各个点向你准确地展示了字节突变的位置,如果你的路由处理程序和验证功能之间的摘要发生变化,你've 找到了层 that's 触摸身体,而你're 在那个街区,我的 jwt解码器 对于检查签名代币的相邻工作很方便。
MD5 vs SHA-1 vs SHA-256 vs SHA-512:您应该使用哪种?
| 算法 | 消化尺寸 | 相对速度 | 安全状态 | 适当的用途 |
|---|---|---|---|---|
| MD5 | 128位(32个十六进制字符) | 最快 | 自 2004 年以来发生的实际碰撞 | 非对抗校验和、旧系统兼容性、缓存密钥 |
| 沙-1 | 160位(40个十六进制字符) | 快 | 破碎 - 颤抖碰撞,2017 年 | 旧版 Git 内部,与旧系统互操作;没有什么新东西 |
| SHA-256 | 256 位(64 个十六进制字符) | 快 | 安全 | 默认完整性检查、签名、内容寻址、HMAC |
| SHA-512 | 512 位(128 个十六进制字符) | 快(通常在64位CPU上更快) | 安全 | SHA-256一样;当你想要额外的余量或64位吞吐量时 |
我的立场,以及 I'会直言不讳: SHA-256的默认值,并停止思考它。 It's安全,普遍支持,速度足够快,你永远不会注意到成本,而且它's你的工具已经说过的话- TLS证书,Docker图像摘要,包锁文件,webhook签名。选择算法所花费的精神能量几乎总是在其他地方花得更好。
值得保留的细微差别:MD5 是't 放射性,它's 范围。检测自己文件上的意外损坏?fine。anything人类对手可以受益于伪造碰撞?绝对不是。sha-1坐在同一个桶中,借口更少- 唯一好的理由触摸它的是兼容你不具备的系统't控制。SHA-512是一个很好的选择,偶尔在现代64位硬件上更快,但128个字符的摘要在日志和URL中笨拙,SHA-256的安全裕度已经超出了任何现实的攻击范围。并且这四种 - 重复,没有 - 属于密码字段附近的任何地方。
常见问题
MD5还安全吗?
为安全,没有。自2004年以来,实际的碰撞攻击就已经存在,这意味着攻击者可以制作两个不同的文件,具有相同的MD5摘要,永远不要将其用于签名,证书,密码存储或任何诚信检查,其中篡改是一个问题。对于非对抗性工作来说,它仍然是可以接受的 - 检测意外损坏,重复自己的文件,生成缓存密钥 - 没有人试图愚弄您。如果有疑问,请使用SHA-256;它不会花费您任何费用。
您可以反转哈希值以获取原始数据吗?
No。Hash函数是单向设计-摘要包含的信息远少于大多数输入,因此反转在数学上一般来说是不可能的攻击者实际上做的是猜测:哈希数十亿候选输入和比较摘要,使用彩虹表或GPU暴力,这对于像快速算法哈希密码这样的短的,常见的输入效果非常好,这正是密码需要缓慢的,咸味哈希而不是普通的MD5或SHA-256的原因。
哈希和加密有什么区别?
Encryption是双向的:数据是用密钥加扰的,任何持有正确密钥的人都可以解密回原来的哈希是单向的:你可以从数据中计算摘要,但你无法从摘要中恢复数据-没有密钥,没有解密,当你需要数据返回时使用加密,当你只需要验证或比较时使用哈希。Base64,对于记录,既不是-它是编码的,任何人都可以反向。
我应该使用哪个哈希值来处理密码?
MD5、SHA-1、SHA-256、SHA-512这些工具都不是快,快对密码是致命的- GPU可以针对泄露的数据库测试每秒数十亿的猜测,使用故意慢的、加盐的算法:bcrypt或Argon2。Laravel's哈希::make()默认使用bcrypt,大多数现代框架都提供了等效的,如果你正在编写原始哈希调用密码存储,请停止并触及你的框架's密码哈希API代替。
在线工具中散列敏感数据安全吗?
仅当该工具是真正的客户端。toolz。dev Hash Generator 使用 Web Crypto API 计算浏览器中的每个摘要 - 您的输入永远不会传输、记录或存储在任何服务器上。您可以通过在散列时查看网络选项卡来自行确认。使用服务器端工具,您会信任未知操作员,无论您粘贴什么,这都是 API 秘密、密钥或客户数据的不良交易。当有疑问时,请在粘贴之前进行检查。
为什么要"你好"和"你好"产生完全不同的哈希值?
即雪崩效应,而且是刻意的,一个好的哈希函数在即使一个输入位发生变化时,也会翻转大约一半的输出位,因此相似的输入会产生截然不同的摘要。一个字母的大写会改变单个字节,但摘要变得无法识别。这是一个特征:这意味着摘要不会揭示两个输入的相似程度,并且当您比较哈希值时,它会使任何更改(无论多么微小)都无法错过。
SHA-256和SHA-512有什么区别?
FIPS 180-4中指定的SHA-2家族,两者都被认为是安全的。SHA-256使用32位操作生成256位摘要;SHA-512使用64位操作生成512位摘要,这通常使它在现代64位处理器上更快。在实践中,SHA-256是生态系统默认值,其摘要长度只有一半,这使得日志和URL可以管理。选择SHA-512以获得额外的安全裕度或64位吞吐量;否则SHA-256就足够了。
我什么时候需要 HMAC 而不是普通的哈希值?
HMAC,只要你需要证明谁产生了哈希,而不仅仅是哈希。一个简单的摘要可以被任何人计算,所以它验证完整性,但不是起源。HMAC,定义在RFC 2104,混合一个秘密密钥到哈希过程 - 只有持有密钥的各方可以产生或验证有效的签名。这是来自Stripe,GitHub和类似服务的webhook签名背后的机制,几乎总是作为HMAC-SHA256通过原始请求体。
船上有指纹,不是信仰
Hashing是罕见的工具's既有深层计算机科学,又有死一般的日常实践。你不't需要了解MerkleftDamgardrd构造才能从中受益-你需要习惯。Hash你的发布神器。验证你的下载。比较摘要而不是眼球文件。这些习惯中的每一个都是三十秒的工作,并且每个都在某个时刻,为我节省了一个晚上,否则我会在支持队列中道歉。
的 Toolz.dev 哈希生成器 旨在使这种习惯无摩擦:同时使用四种算法、文本和文件、验证模式,所有这些算法都是在浏览器中计算的,没有任何上传。如果您'重新研究邻近的概念, Base64 转换器 涵盖编码(以及为什么它是't安全性), 密码生成器 处理您永远不应该与 SHA-256 散列的秘密 jwt解码器 完善了故事中签名标记的一面。
为了更大的图景,我的 编码工具指南 浏览开发人员工具箱的其余部分,以及 在线工具中的数据隐私 解为什么客户端处理是山丘 I've选择死在哈希第一,部署第二,你凌晨2点40分的自己会感谢你的。



