主页 > imtoken冷钱包官方版 > 谈区块链:比特币钱包的安全风险

谈区块链:比特币钱包的安全风险

imtoken冷钱包官方版 2023-05-03 06:12:56

目前人们热衷于炒作比特币,但很少关注比特币技术本身的安全问题。用户可能不知道他们目前使用的比特币钱包包含着巨大的危险比特币放在交易平台安全吗,所以作者决定写这篇文章作为警告,以免日后丢失更多的比特币。以下为文章全文:

我们知道比特币是基于 UTXO 的。假设你是 Alice,有一个比特币钱包,钱包里有一个比特币地址,地址里有一个 UTXO,UTXO 里有 10BTC 的余额。现在你想给 Bob 转账 10 个 BTC(不考虑手续费),那么生成的交易就很简单了(用你的 UTXO 作为输入,用 Bob 的地址作为输出)。

图片描述

现在情况有点复杂了,你只需要给 Bob 转 5 BTC,那么 Transaction 会复杂一点(1 BTC 输入还是指你的 UTXO,2 个输出,一个是 Bob 的地址5BTC,另一个是他自己的地址5BTC)。

那么问题来了。 5 BTC是使用原始地址还是新创建的地址转移给您?这是比特币的标准策略,称为:更改地址。现在让我们看看为什么比特币会有这样的政策?在没有变更地址政策之前,我们的转账方式是这样的:

图片描述

所有剩余的 BTC 都转回发送地址。因为比特币的区块链是公开查询的,这样你就可以轻松追踪A的支付行为和他的财富状况,完全没有任何隐私。所以比特币引入了变更地址政策(非强制),在新模式下是这样工作的:

图片描述

是每次转账的余额创建一个新地址。其实上图中的C是用户A的另一个地址。

在一个Transaction的输出中,输出是有序的(索引),总是把目标地址放在第一个(索引为0)会导致交易行为泄露。为了进一步增强隐私,会在此基础上增加shuffleOutputs(shuffle)的功能,这个功能会打乱Transaction中输出的顺序,随机排列,这样多次转账后,你将无法追踪A的交易行为。

这是一个完美的解决方案比特币放在交易平台安全吗,已被广泛使用。但是,它给钱包的安全带来了巨大的风险,这也是我们今天这篇文章的重点。

现在我们大多数人使用比特币钱包的标准步骤是(不要研究在线钱包和交易所,它们会有额外的安全问题):

下载比特币钱包(PC或手机)备份钱包(钱包中的钥匙)以各种方式转入和转出

我们认为这是安全的,因为我已经备份了钱包,即使电脑报废手机丢失,我仍然可以使用备份恢复。对,没错!但前提是你不转出!一旦你这样做了,你的钱包可能会为你生成一个新地址,而这个新地址可能不会包含你在备份中!

假设你的钱包里有 100BTC,你进行了多次转账操作,一共转账了 50BTC。突然有一天你的手机丢了(钱包在你的手机里),你赶紧买了一部新手机,装了一个新的钱包,拿出备份恢复,却发现钱包的余额已经变成了0。因为您没有剩余 50BTC 所在地址的备份,它是在转账过程中生成的。 !的新地址!

以下是作者通过手机钱包进行的转账。红框内的地址为新生成的地址,作者上次备份中没有。

我们这里说是可能的,因为现在不同的钱包采用不同的模式。目前的通用模式分为以下几种:

单地址钱包,这种类型是最原始的钱包,没有应用找零地址方案;

随机地址池钱包,这类钱包一开始会为你随机生成一个地址池,例如包含100个地址(有的可以通过-keypool参数设置池的大小)。在 100 次传输范围内 无需生成新地址。但是随着次数的增加,还是会出现同样的问题;

级别指定地址池钱包(HD钱包),通过密码生成主私钥,然后通过私钥生成多个子私钥;可定制,支持多种钱包模式;

如何解决?

如果你不关心隐私问题(因为大多数人不关心交易行为的泄露,因为地址本身是匿名的,他们更关心币的安全)并且可以使用单个-地址钱包。在线钱包也是如此。笔者将自己运营的比特币支付平台(bitbill.com)改回单地址模式(略扩展)。作者使用bitcoinj,对其核心代码做了如下修改:

log.info(“selection.gathered 长度:”+selection.gathered.size());

for(TransactionOutput 输出:selection.gathered){

//由 Tom @2017/2/9 添加,用于更改地址问题。

如果(req.changeAddress==null){

试试{

req.changeAddress=输出。 getAddressFromP2PKHScript(org.bitcoinj.params.MainNetParams.get());

}catch(Exception ex){}//如果不是 P2PKH

log.info(“Tom 对 > req.changeAddress:”+req.changeAddress 的修正;

}其他{

log.info(“req.changeAddress 不为空:”+req.changeAddress);

}

}

对于使用比特币钱包的用户,取决于钱包类型(尤其是非高清钱包,目前大部分都在使用非高清钱包)。通常需要更多备份。一定要记住,否则你不转账,转账后可能需要马上备份!

作者:谭国鹏bitbill.com创始人,现任**集团区块链研发负责人。

文章选自作者微信公众号“谈区块链”,作者已授权转载发布。