date
Oct 11, 2024
icon
password
Pin
Pin
Hide-in-Web
Hide-in-Web
网址
type
Page
slug
public-key-hash
tags
知识点
category
bottom
bottom
Hide-in-Config
Hide-in-Config
comment
Show
status
Published
summary
1. 收款:使用公钥哈希(地址)
当有人想向你发送比特币时,你提供的是你的比特币地址,而这个地址实际上是你的公钥哈希。具体来说,收款时的过程如下:
- 生成密钥对:首先,用户生成一对密钥——私钥和公钥。
私钥:用于签名交易。
公钥:用于从私钥推导出的数据。
- 生成比特币地址:比特币地址是公钥的哈希值。具体步骤:
- 对公钥执行SHA-256 哈希运算。
- 再对结果进行一次 RIPEMD-160 哈希运算,生成 160 位的哈希值,这就是公钥哈希。
- 该公钥哈希进一步加上前缀(如比特币主网的
00
),并附加校验码,最终形成了用户的比特币地址。
所以,在收款时,你只需要向对方提供这个地址,即公钥的哈希值。这个地址代表你可以接收比特币,但不会透露出你的公钥。
2. 取款:使用公钥及签名
当你想要花费收到的比特币时,需要证明你确实拥有与公钥哈希匹配的公钥及私钥。这个过程涉及到两个关键的操作:提供公钥和签名。
- 提供公钥:为了花费某笔比特币,你必须在交易中提供与之前公钥哈希对应的公钥。这样网络上的节点可以通过验证该公钥的哈希值是否匹配当初收款时的公钥哈希,从而确认你确实是该比特币的拥有者。
- 交易签名:你还需要使用你的私钥对交易进行签名。签名的目的是证明你对这笔比特币有控制权,而不需要公开你的私钥。签名是基于私钥和交易数据的加密操作,网络中的其他节点会使用你的公钥来验证签名是否有效。
3. 验证过程
当你发起一笔交易时,网络中的节点会验证以下内容:
- 你提供的公钥的哈希是否与收款时使用的公钥哈希一致。
- 你提供的签名是否可以通过该公钥成功验证。
如果这两者都通过验证,那么交易就会被认为是有效的,比特币就可以被成功取出或转账。
4. 既然公钥在交易时会暴露,为什么不一开始就使用公钥本身收款,而要使用公钥哈希呢?
主要有以下几个原因:
- 减少攻击面
比特币系统使用双重哈希(SHA-256 和 RIPEMD-160)来保护公钥,主要目的是降低公钥被攻击的可能性。具体的攻击风险包括以下几点:
- 抗量子计算攻击:虽然现在的经典计算机无法轻易破解椭圆曲线签名算法(如比特币使用的 ECDSA),但未来的量子计算机有可能会威胁到这种加密算法。如果攻击者能通过量子计算直接从公钥推导出私钥,那么直接使用公钥就会让比特币的安全性受到威胁。
- 哈希算法更安全:公钥哈希(特别是使用了双重哈希)比直接暴露公钥本身更安全,尤其是针对未来未知的攻击手段。哈希函数是单向的,即便是先进的攻击手段,也很难从公钥哈希逆推出公钥或私钥。
- 推迟公钥的暴露时机
比特币设计中,先使用公钥哈希,确保公钥只在取款(或付款)时暴露,而不是在收款时。这就意味着,在你收到比特币后,只要你不花费这些比特币,你的公钥永远不会暴露。
这样做可以延迟攻击机会,公钥的暴露时间推迟到你取款时,而不是在收款时公开。这样即使有人对你的公钥感兴趣,攻击的时间窗口也被大大缩短。你只有在取款时暴露公钥,这减少了公钥被攻击的机会。
- 地址更短,更适合作为标识
比特币的地址长度比公钥短得多,因为地址是经过两层哈希后生成的,长度为 160 位(20 字节),再经过 Base58 编码之后,比直接使用公钥更加简洁。有利于在网络上传播的时候减小网络的带宽,加快传输速度,同时也方便用户记忆。
从安全性的角度上来说,比特币的公私钥地址在使用过一次后最好就不要再使用了,每次取钱的时候一次性把里面的钱全部取走,然后更换公私钥地址,再进行交易。