哈希游戏- 哈希游戏平台- 哈希游戏官方网站
哈希值被用于计算的许多领域。例如,比特币区块链使用 SHA256 哈希值作为区块标识符。挖比特币就是生成一个低于指定阈值的 SHA256 哈希值,也就是至少有 N 个前导零的哈希值。(N 的值可以上升或下降,这取决于特定时间的挖矿生产力)。作为一个兴趣点,如今的矿机是为并行生成 SHA256 哈希值而设计的硬件集群。在 2018 年的一个高峰期,全球的比特币矿工每秒产生约 7500 万个太哈希值(terahash) —— 这真是一个不可思议的数字。
网络协议也使用哈希值(在这里通常叫做“校验和(checksum)”)来支持消息的完整性;也就是说,保证收到的消息与发送的消息是一样的。消息发送者计算消息的校验和,并将结果与消息一起发送。当消息到达时,接收方重新计算校验和。如果发送的校验和与重新计算的校验和不一致,那么消息在传输过程中可能出现了一些问题,或者发送的校验和出现了问题,或者两者都出现了问题。在这种情况下,应该重新发送消息和它的校验和,或者至少应该触发一个错误情况。(如 UDP 这样的低级网络协议不会理会校验和。)
哈希值还出现在安全的各个领域。例如,基于哈希值的消息认证码(hash-based message authentication code)()使用一个哈希值和一个秘密的加密密钥(cryptographic key)来认证通过网络发送的消息。HMAC 码轻量级且易于在程序中使用,在 Web 服务中很受欢迎。一个 X509 数字证书包括一个称为指纹(fingerprint)的哈希值,它可以方便证书验证。一个存放于内存中的可信存储(truststore)可以实现为一个以这种指纹为键的查找表 —— 作为一个支持恒定查找时间的哈希映射(hash map)。来自传入的证书的指纹可以与可信存储中的密钥进行比较,以确定是否匹配。
例如,回忆一下 SHA256 哈希函数。对于一个任意长度为 N 0 的输入位串,这个函数会生成一个 256 位的固定长度的哈希值;因此,这个哈希值甚至不会反映出输入位串的长度 N,更不用说字符串中每个位的值了。顺便说一下,SHA256 不容易受到(length extension attack)。唯一有效的逆向工程方法是通过蛮力搜索将计算出的 SHA256 哈希值逆向返回到输入位串,这意味着需要尝试所有可能的输入位串,直到找到与目标哈希值匹配的位串。这样的搜索在 SHA256 这样一个完善的加密哈希函数上是不可行的。
现在,最后一个回顾的知识点是有序(in order)。加密哈希值是统计学上的唯一,而不是无条件的唯一,这意味着两个不同的输入位串产生相同的哈希值是不太可能的,但也不是不可能的 —— 这称之为碰撞(collision)。提供了一个很好的反直觉的碰撞例子。对各种哈希算法的抗碰撞性(collision resistance)有着广泛的研究。例如,MD5(128 位哈希值)在大约 221 次哈希之后,抗碰撞能力就会崩溃。对于 SHA1(160 位哈希值),大约在 261 次哈希后开始崩溃。
顾名思义,数字签字(digital signature)可以附在文件或其他一些电子工件(artifact)(如程序)上,以证明其真实性。因此,这种签名类似于纸质文件上的手写签名。验证数字签名就是要确认两件事:第一,被担保的工件在签名被附上后没有改变,因为它部分是基于文件的加密学哈希值。第二,签名属于一个人(例如 Alice),只有她才能获得一对密钥中的私钥。顺便说一下,对代码(源码或编译后的代码)进行数字签名已经成为程序员的普遍做法。
在这个例子中,我们可以舍去-algorithm rsa标志,因为genpkey默认为 RSA 类型。文件的名称(privkey.pem)是任意的,但是隐私增强邮件(Privacy Enhanced Mail)(PEM)扩展名.pem是默认 PEM 格式的惯用扩展名。(如果需要的话,OpenSSL 有命令可以在各种格式之间进行转换。)如果需要更大的密钥大小(例如 4096),那么最后一个参数2048可以改成4096。这些大小总是二的幂。
现在值得关注的两个要素是 RSA 密钥对算法和 AES128 块密码,用于在握手成功的情况下对消息进行加密和解密。关于加密/解密,这个过程有两种流派:对称(symmetric)和非对称(asymmetric)。在对称流派中,加密和解密使用的是相同的密钥,这首先就引出了密钥分发问题(key distribution problem)。如何将密钥安全地分发给双方?在非对称流派中,一个密钥用于加密(在这种情况下,是 RSA 公钥),但另一个密钥用于解密(在这种情况下,是来自同一对密钥的 RSA 私钥)。
在这个过程结束时,client程序和 Google Web 服务器现在拥有相同的 PMS 位。每一方都使用这些位生成一个主密码(master secret),并立即生成一个称为会话密钥(session key)的对称加密/解密密钥。现在有两个不同但等价的会话密钥,连接的每一方都有一个。在client的例子中,会线 类的。一旦在client程序和 Google Web 服务器两边生成了会话密钥,每一边的会话密钥就会对双方的对话进行保密。如果任何一方(例如,client程序)或另一方(在这种情况下,Google Web 服务器)要求重新开始握手,握手协议(如 Diffie-Hellman)允许整个 PMS 过程重复进行。