# 编程浅谈

By [牛咩王](https://paragraph.com/@roamdog-2) · 2022-05-08

---

信息指纹
----

在现实世界里，有没有两个长得一模一样的人？双胞胎可能是最相似的，但仍然有一些人体特征的区别。譬如说话的声调，虹膜，指纹，牙齿等。我们利用这类特征进行身份识别，例如，将指纹识别应用于解锁手机，可以保证机主个人的信息安全。

在计算机里的各种信息：文字，图片，音频，视频等等，也和人一样有着独特的”指纹“信息。使用一种名为SHA256的摘要算法，可以计算出信息的指纹数据。例如，本文的标题”`编程浅谈`“，通过SHA256摘要算法计算出来的指纹信息就是这样一串字符：

`ab6346b233ae2088b781d5e29171ba9a30811e87f22c9a380013401de86e26c3`

![猫咪](https://storage.googleapis.com/papyrus_images/3b4e14ba31ab6957dcd7b6ae0149e55ed1c79afa6d01aa9365fe824d062c952a.webp)

猫咪

这张可爱猫咪图片的指纹信息是：

`3b4e14ba31ab6957dcd7b6ae0149e55ed1c79afa6d01aa9365fe824d062c952a`

通过验证上述指纹，能确保我们接收到的信息一致，未经篡改。你可以保存图片，在支持SHA256生成文件指纹的网站，上传图片进行验证。

[https://oktools.net/file-hash](https://oktools.net/file-hash)

![计算得出猫咪的指纹信息](https://storage.googleapis.com/papyrus_images/09871f60d4c9519d71ff2a7de58b1d8a3772c89c721b72d3ffcc3a8598b15704.png)

计算得出猫咪的指纹信息

信息指纹应用广泛，譬如我们注册登录某个网站，网站记录的就是密码的指纹信息。当用户登录时，网站会验证密码指纹与记录的指纹是否一致，网站不需要知道用户的密码，也能达到验证身份的目地。这样可降低信息泄露风险，保证信息安全。

**数字证书**
--------

为了保障信息传输的安全性，信息接收方和发送方会对传输的内容进行加密、解密处理。发送方要按照接收方的要求，使用接收方提供的公钥对内容加密。当收到符合加密条件的数据，接收方才认可数据有效。可见整个传输过程中，公钥非常重要。而公钥就是数字证书。在我们使用的操作系统或浏览器中，已经预置了相当数量的数字证书，无法被篡改。

![操作系统的数字证书列表](https://storage.googleapis.com/papyrus_images/4a79a1b7f0729680859c084dae6ed7bddd1787adb281f6412aa5341a35fff357.png)

操作系统的数字证书列表

数字签名
----

和数字证书的原理类似，数字签名同样使用一对密钥作用于需要签名的信息。拿现实生活中通知函的**大红印章**举例：无论以何种渠道收到信息，都可以通过印章（签名）判断信息真伪。在现实生活中伪造签名只需要制作一个一模一样的印章，或直接修改通知函图片，伪造成本很低。要获取准确信息，要从可靠的信源渠道，如官网官微、官方公众号。

1985年，Koblitz和Miller发明了基于椭圆曲线数学的非对称加密算法，它通过**一对密钥**对内容进行签名和验证签名，它同时兼顾了安全和易用性。用于签名的密钥（私钥）仅在签名者手里，用于验证签名的密钥（公钥）则公开。签名后的文件可经由任意渠道分发，任何人可通过公钥来验证文件签名者是否一致，保证数据安全，也提高信息传播效率。

![著名btc矿场 蚁池的公钥信息](https://storage.googleapis.com/papyrus_images/c4f8d3c997e722eb91bb7acf234b05474d961cdc582b629485ca2a71e93af67f.png)

著名btc矿场 蚁池的公钥信息

**布隆过滤器**
---------

能够快速判断某条信息是否存在于已有的信息样本中的一种编程方法。通过本文第一节讲”信息指纹“，提到”`编程浅谈`“这句话的指纹是这样：

`ab6346b233ae2088b781d5e29171ba9a30811e87f22c9a380013401de86e26c3`

它其实是一个十六进制的数字，转换为二进制是：

`1010101101100011010001101011001000110011101011100010000010001000101101111000000111010101111000101001000101110001101110101001101000110000100000010001111010000111111100100010110010011010001110000000000000010011010000000001110111101000011011100010011011000011`

进制转换工具：

[https://tool.lu/hexconvert/](https://tool.lu/hexconvert/)

数字长度是256位，算法的名称“SHA256”——数字部分代表算法可容纳的指纹数量范围在256位二进制数以内。二进制只有“0”和“1”两个数字组成，如果把每一位数字用小方块表示，数字“0”是空白块，数字“1”是黑色块，从左到右从上到下的顺序排列可以用下图表示：

![表示二进制数的黑白格子](https://storage.googleapis.com/papyrus_images/dfd904b794029d97370fc130025a372c6577a4d3912ae0208786d6ffbe1b78c0.png)

表示二进制数的黑白格子

运用布隆过滤器构建信息样本，仿佛将每条数据的黑白格子在同一坐标不断重叠，样本越多，黑色方块也越多。判断某条信息是否存在于样本中，可以用表示它的黑白格子与堆叠后的样本黑白格子对比，如果黑色部分完全重叠，说明它极有可能已在样本中，如果不能重叠，则肯定不在样本中。

布隆过滤器不需要存储原始信息，新增样本信息和判断过程非常快。缺点是有一定几率误判，也无法从样本中删除记录。它常应用在一些有容错空间的功能中，如反垃圾邮件（偶尔有正常邮件被误判，就是布隆过滤器的锅），为读者推荐未看过的文章。

### 参考资料：

1.  （Java教程 - 廖雪峰的官方网站）
    
    [https://www.liaoxuefeng.com/wiki/1252599548343744](https://www.liaoxuefeng.com/wiki/1252599548343744)
    
2.  区块链技术指南
    
    [https://yeasy.gitbook.io/blockchain\_guide/05\_crypto](https://yeasy.gitbook.io/blockchain_guide/05_crypto)

---

*Originally published on [牛咩王](https://paragraph.com/@roamdog-2/FRXVvADi2Ur1GyikQCPH)*
