主页 > 多语言仿imtoken钱包系统 > 第 4 章:如何存储和使用比特币(一)

第 4 章:如何存储和使用比特币(一)

多语言仿imtoken钱包系统 2023-01-30 08:03:21

4.1 本地简单存储

让我们从存储比特币的最简单方法开始,即将它们保存在本地设备上。简而言之,要花费比特币,你需要知道一些公开信息和一些秘密信息。公共信息是区块链上发生的事情——硬币的身份、价值等。秘密信息是比特币所有者的密钥,大概是你的。您不必太担心如何存储公共信息,因为您可以在需要时随时拥有它。但是秘密签名密钥是您跟踪的最佳选择。因此,在实践中,存储你的比特币就是存储和管理密钥。

在确定如何存储和管理密钥时,需要牢记三个目标。第一个是可用性:当你想实际花费你的硬币时可用。第二个是安全性:确保没有人可以花费你的硬币。如果有人有权使用你的硬币,他们可以将你的硬币发送给自己,然后就不会再有硬币了。第三个目标是方便,即密钥管理应该相对容易做到。您可以想象,同时实现这三个目标可能是一项挑战。

管理密钥的最简单方法是将它们存储在您自己的本地设备上的文件中:您的计算机、手机或您携带、拥有或控制的其他类型的小工具。它非常方便:有一个智能手机应用程序只需按几个按钮即可花费硬币,而且很难被击败。但这不利于可用性和安全性——如果您丢失了设备,如果它崩溃并且您必须去擦除光盘,或者您的文件被损坏,您的密钥将会丢失,您的硬币也会丢失。同样为了安全:如果有人偷了或破坏了你的设备,或者它感染了恶意软件,他们可以复制你的密钥,然后他们可以将所有的硬币发送给自己。

换句话说,将私钥本地存储在设备上,尤其是移动设备上,就像在钱包或腰包里装钱一样。有一些零用钱是有用的,但你不想随身携带你的毕生积蓄,因为你可能会丢失它,或者有人可能会偷走它。然后你通常做的是在你的钱包里储存一些信息/一点钱,然后把大部分放在其他地方。

钱包。如果您将比特币存储在本地,您通常会使用钱包软件,该软件可以跟踪您的所有硬币,管理您的密钥的所有详细信息,并通过良好的用户界面使事情变得简单。如果您想将 4.$25 的比特币发送到您当地的咖啡店,钱包软件为您提供了一些简单的方法。钱包软件特别有用,因为您通常想使用一大堆不同的地址,不同的密钥。您可能还记得,创建一个新的公钥/私钥对很容易,您可以利用它来提高您的匿名性或隐私性。钱包软件为您提供了一个简单的界面,告诉您钱包里有多少钱。当你想使用比特币时,它会处理使用哪个密钥以及如何生成新地址等细节。

编码键:base 58 和二维码(二维码)。要花费或接受比特币,您还需要一种与另一方交换地址的方法——您想要发送比特币的地址。地址码可以通过两种主要方式从收件人传输到消费者:作为文本字符串或作为 QR 码。

要将地址编码为文本字符串,我们转换该密钥的位并将其从二进制转换为基数 58。然后我们使用一组 58 个字符将每个数字编码为一个字符;这称为 base58 表示法。为什么是58?因为这是一个数字,我们包含大写字母、小写字母以及数字作为字符,但忽略可能令人困惑或看起来像另一个字符的数字。例如,大写的“O”和零都被去掉了,因为它们看起来太相似了。如有必要,这允许我们现在讨论的诸如 QR 码之类的方法避免通信地址的手动方法。通过电话读取编码地址,或从打印机读取并输入密码。理想情况下,我们现在讨论的二维码等方法可以避免手动获取通信地址的方法。

比特币:1fBXS5gNQioswg5xyx6XAEGrzNuALftEu(二维码自动识别)

图 4.1:代表实际比特币地址的二维码

如何买比特币和狗狗币_比特币买了放在哪里_比特币放在平台安全吗

用于编码比特币地址的第二种方法是二维码,一种简单的二维条码。二维码的好处是你可以用智能手机扫描它,钱包软件可以自动将条码转换成一系列代表对应比特币地址的数字。这在商店中很有用,例如:结账系统可能会显示一个二维码,您可以通过用手机扫描二维码并将硬币发送到该地址来支付。它也可以用于电话到电话的传输。

虚荣地址。一些个人或企业喜欢有一个以一些有意义的文本开头的地址。例如,赌博网站 Satoshi Bones 的用户向位置 2-6 中包含字符串“bones”的地址汇款,例如 1bonesEeTcABPjLzAb1VkFgySY6Zqu3sX(所有常规地址都以字符 1 开头,表示向 pubkey-hash 付款)。

我们说地址是哈希函数的输出,产生随机数据,那么字符串“bones”是怎么进来的呢?如果中本聪的骨头简单地构成了这些地址,缺乏反向哈希函数的能力,他们将不知道相应的私钥,因此实际上不会控制这些地址。相反,他们会反复生成私钥,直到他们幸运地找到与此模式哈希的密钥。这样的地址被称为虚地址,并且有生成它们的工具。

侧边栏:加快虚荣地址的生成。在比特币中,如果我们称私钥 x,则公钥是 g 的 x 次幂。取幂表示椭圆曲线组中的所谓标量乘法。地址是公钥的哈希值。我们不会在这里详细介绍,但求幂是地址生成的缓慢步骤。

生成虚地址的简单方法是选择一个伪随机数 x,计算,如果地址不起作用则重复。一个快速的方法是在第一个 x 失败时尝试 x+1,并保持递增而不是每次都选择一个新的 x。这是因为=x,我们已经计算了g,所以我们只需要对每个地址进行乘法运算,而不是求幂,这样会快很多。事实上,它将虚荣地址的生成加密了两个数量级以上。

这需要多少工作?由于每个字符有 58 种可能性比特币买了放在哪里,如果要找到以某个 k 字符串开头的地址,则需要平均生成 58k 个地址,直到幸运为止。所以找到一个以“bone”开头的地址需要生成超过 6 亿个地址!如今,这可以在普通笔记本电脑上完成。但每增加一个角色,就会变得越来越难。找到一个 15 个字符的前缀将需要不可行的计算量,并且(没有找到底层哈希函数中的断点)是不可能的。

4.2冷热库

正如我们刚刚看到的,将比特币存储在你的计算机上就像在你的钱包或腰包里装钱一样。这称为“热存储”。这很方便,但也有一些风险。另一方面,“冷库”处于离线状态。它被锁在某个地方。它没有连接到互联网,它是一个文件。所以它保证了安全,更安全,当然也不是那么方便。这类似于您随身携带一些零钱,但将您的毕生积蓄放在更安全的地方。

要拥有独立的冷热存储,您显然需要为每个密钥提供单独的密钥 - 否则,如果热存储受到损害,冷存储中的硬币将很容易受到攻击。您需要在冷热端之间来回移动硬币,因此每一方都需要知道对方的地址或公钥。

冷存储不在线,因此热存储和冷存储将无法通过任何网络相互连接。但好消息是冷库不必在线收币——因为热库知道冷库地址,所以可以随时向冷库发送币。在任何时候,如果你的热钱包里的钱变大了,你可以通过连接网络将其中的一部分转移到冷库,而不会危及你的冷库。下次冷存储连接时,它将能够从区块链接收有关这些转移的信息,然后冷存储将能够用这些硬币做它需要的事情。

但是管理冷库地址有一点问题。一方面,如前所述,出于隐私和其他原因,我们希望能够使用不同的密钥在单独的地址上接收每个硬币。因此,每当我们将硬币从热端转移到冷端时,我们都希望使用新的冷地址。但是既然冷端不在线,那我们一定有办法找出热端的这些地址。

比特币放在平台安全吗_如何买比特币和狗狗币_比特币买了放在哪里

生硬的解决办法是,一次生成一堆地址给冷端,发给热端一个一个使用。缺点是我们必须定期重新连接冷端才能传输更多地址。

分层钱包。更有效的解决方案是使用分层钱包。它允许冷方使用实质上无限数量的热方可以了解的地址,但仅限于双方之间短暂的一次性通信。但这需要一点密码技巧。

过去,当我们在第 1 章讨论密钥代码和数字签名时,我们研究了一个名为 generateKeys 的函数,它生成一个公钥(作为地址)和一个秘密密钥。在分层钱包中,密钥代码的工作方式不同。我们不是生成单个地址,而是生成所谓的地址生成信息,而不是生成私钥,而是生成所谓的私钥生成信息。给定地址生成信息,我们可以生成地址序列:我们应用地址生成函数,将输入地址生成信息和任何整数 i 作为输入来生成序列中的第 i 个地址。同样,我们可以使用 private 密钥生成信息生成一系列私钥。

加密的神奇之处在于,对于每个 i比特币买了放在哪里,第 i 个地址总和“匹配”第 i 个密钥——也就是说,第 i 个密钥由这里的比特币控制并可供消费另一个重要的加密属性是安全性:地址生成信息不会泄露任何关于私钥的信息。第 i 个地址就好像这对是用老式的方式生成的。所以就好像我们有一个常规密钥对数组。

这里另一个重要的加密属性是安全性:地址生成信息不会泄露任何关于私钥的信息。这意味着将地址生成信息发送给任何人都是安全的,因此任何人都可以启用第 i 个密钥的生成。

现在,并非所有现有的数字签名方案都可以修改以支持分层密钥生成。有些可以,有些不能,但好消息是,通过使用比特币,支持生成分层密钥的 ECDSA 数字签名允许这个技巧。即冷端生成任意数量的密钥,热端生成对应的地址。

图4.2:分层钱包模式

冷端创建并保存私钥生成信息和地址生成信息。它将后者移动到一次性命中。每当它想向冷方发送硬币时,热方又会生成一个新地址。当冷端重新连接时,它会依次生成地址并检查区块链以传输到这些地址,直到它到达一个没有收到任何硬币的地址。如果一些硬币要被送回热方或以其他方式使用,也可以依次生成私钥。

这是它的工作原理。回想一下,ECDSA 私钥通常是一个随机数 x,对应的公钥是 。对于分层密钥生成,我们需要另外两个随机值 k 和 y

如何买比特币和狗狗币_比特币放在平台安全吗_比特币买了放在哪里

这拥有了我们想要的所有属性:每一方都可以生成自己的密钥序列,并且匹配到对应的密钥,因为(因为私钥x对应的公钥是)它还有一个我们没有讲的属性:当你发布公钥时,这些密钥将无法相互链接,也就是说,无法推断它们来自同一个钱包。冷端生成大量地址的稻草人解决方案确实有这个属性,但是考虑到密钥实际上并不是独立生成的,我们必须牢记这一点。这个属性对于隐私和匿名很重要,这将是第 6 章的主题。

这里我们有两个安全级别,热端位于较低级别。如果热端被破坏,我们刚刚讨论的无连接属性将会丢失,但私钥(和比特币)仍然是安全的。一般来说,这个方案支持任意多个安全级别——因此是“分层的”——尽管我们还没有看到细节。例如,当公司内有多个授权级别时,这很有用。

现在让我们讨论冷信息的不同方式——是否可以存储一个或多个密钥或密钥生成信息。第一种方法是将其放入某种设备中,然后放入保险箱中。它可以是笔记本电脑、手机或平板电脑,或拇指驱动器。保持设备关闭并锁定很重要,这样如果有人试图窃取它,他们将不得不闯入。

脑钱包。我们可以使用的另一种方法是所谓的大脑钱包。这是一种仅使用秘密密码来控制对比特币的访问的方法。这避免了对硬盘驱动器、纸张或任何其他长期存储机制的需求。此属性在您的人身安全性较差的情况下尤其有用,例如在您出国旅行时。

大脑钱包背后的关键是有一个可预测的算法,可以将密码变成公钥和私钥。例如,您可以使用合适的散列函数对密码进行散列以导出私钥,并且给定私钥,可以以标准方式导出公钥。此外,结合我们之前看到的分层钱包技术,我们可以从密码生成完整的地址和私钥序列,从而实现完整的钱包。

但是,如果攻击者能够猜出密码,他也可以获得大脑钱包中的所有私钥。与计算机安全一样,我们必须假设对手知道您用于生成密钥的过程,并且只有您的密码才能提供安全性。因此,攻击者可以尝试各种密码并使用它们来生成地址;如果他在任何这些地址的区块链上发现任何未使用的交易,他可以立即将其转移给自己。对手可能永远不知道(或关心)这些硬币属于谁,并且攻击不需要闯入任何机器。猜测大脑钱包密码不是特定于用户的,也不会留下任何痕迹。

侧边栏:生成令人难忘的密码短语。提供大约 80 位熵的密码短语生成器是从 10,000 个最常见的英语单词(大约 80))中选择 6 个单词的随机序列。许多人发现这些比随机字符串更容易记住。这就是生成一对密码。

此外,攻击者可以使用 Brain Wallet 下载未兑换硬币的地址列表,而不是猜测您的电子邮件密码(可以由电子邮件服务器限定),尝试尽可能多的潜在密码,因为他们有计算能力查看 。请注意,攻击者不需要知道哪些地址对应于大脑钱包。这称为离线猜测或密码破解。以这种方式想出易于记忆且不易猜到的密码短语更具挑战性。生成密码短语的一种安全方法是使用一个自动化过程,该过程会选择一个随机的 80 位数字并将该数字转换为密码短语,这样不同的数字就会产生不同的密码。

在实践中,使用故意缓慢的函数从密码短语中导出私钥也是明智的,以确保攻击者花费尽可能长的时间尝试所有可能性。这称为临界拉伸。为了创建一个故意缓慢的密码推导函数,我们可以采用像 SHA-256 这样的快速加密哈希函数并计算其子迭代,从而增加攻击者的工作量。当然,如果我们让它太慢,它就会开始让用户感到烦恼,因为他们的设备必须在他们想从他们的大脑钱包中取出硬币时重新计算函数。

如果无法访问大脑钱包密码 - 据说已被遗忘、未写下且无法猜测 - 那么硬币将永远丢失。

纸钱包。第三种选择是所谓的纸钱包。我们可以在纸上打印关键材料,并将该纸放在安全或可靠的位置。显然,这种方法的安全性与我们使用的纸张的物理安全性一样好或坏。典型的纸质钱包以两种方式对公钥和私钥进行编码:二维条码和 base 58 表示法。就像大脑的钱包一样,存储少量关键材料就足以重新创建一个钱包。

比特币买了放在哪里_如何买比特币和狗狗币_比特币放在平台安全吗

图 4.3:一个比特币纸质钱包,其公钥编码为二维条码和基数 58 标记。请注意,私钥位于防篡改封条后面。

防篡改装置。我们可以存储离线信息的第四种方法是将其放入某种防篡改设备中。要么我们将密钥放入设备,要么设备生成密钥;无论哪种方式,该设备都被设计成不能导出或泄露密钥。当我们按下按钮或给它某种密码时,设备会这样做,而不是用密码表示符号语句。一个优点是,如果设备丢失或被盗,我们将知道密码被盗的唯一方法是设备被盗。这与将密钥存储在笔记本电脑上不同。

一般来说,人们可能会结合使用这四种方法来保护他们的密钥。对于热存储,尤其是存储大量比特币,人们愿意努力想出新的安全方案来保护它们,我们将在下一节讨论一些更高级的方案。

4.3 拆分和共享密钥

到目前为止,我们已经研究了存储和管理控制比特币密钥的不同方法,但我们始终将密钥保存在一个地方——无论是锁在保险箱中、软件中还是纸上。这使我们失去一分。如果单个存储空间出现问题,那么我们就有麻烦了。我们可以创建和存储关键材料的备份,但这会降低密钥丢失或损坏(可用性)的风险,从而增加盗用风险(安全性)。这种权衡似乎是基本的。我们能否获取一段数据并以提高可用性和安全性的方式存储它?值得注意的是,答案是肯定的,这是使用称为秘密共享的加密的另一个技巧。

想法是这样的:我们想把我们的密钥分成 N 个部分。我们想要这样做,如果我们得到任何 K 个这些片段,那么我们将能够重建原始秘密,但如果我们得到少于 K 个片段,那么我们将无法了解有关原始秘密的任何信息。

鉴于这种严格的要求,简单地将秘密“切割”成碎片是行不通的,因为即使是单个碎片也提供了一些关于秘密的信息。我们需要更聪明的东西。而且,由于我们没有破解秘密,我们将单个组件称为“共享”而不是切片。

假设我们有 N=2 和 K=2。这意味着我们根据秘密生成 2 个共享,我们需要重建这个秘密。我们称我们的秘密 S,它只是一个大(128 位)数字。我们可以生成一个 128 位随机数 R,使得两者共享 R 和 S⊕R。(⊕ 代表按位异或)。本质上,我们一次性“加密” S,并将密钥 (R) 和密文 (S⊕R) 存储在不同的位置。密钥和密文本身都不能告诉我们任何有关秘密的信息。但是鉴于这两个共享,我们只是将它们结合起来重建秘密。

只要 n 和 k 相同,这个技巧就可以工作——我们只需要为第一批 N-1 份生成 N-1 个不同的随机数,最终共享将由所有其他 n-1 份共享秘密 XOR . 但是如果 N 大于 K,那么这将不再有效,我们需要一些代数。

比特币放在平台安全吗_比特币买了放在哪里_如何买比特币和狗狗币

图 4.4:2-out-of-N 秘密共享的几何图示

S 代表秘密,编码为(大)整数。绿线有一个随机选择的斜率。橙色点(特别是它们的 Y 坐标 S+R、S+2R、...)对应于份额。任何两个橙色点都足以重建红色点,因此是秘密。所有算术都是以大素数为模完成的。

看一下图 4.4。我们在这里所做的是首先在 Y 轴上生成点 (0, S),然后在该点绘制一条具有随机斜率的线。接下来,我们在这条线上生成一堆点,数量不限。原来这是S的秘密共享,N是我们生成的点数,K=2。

为什么它会这样工作?首先,如果你有两个生成点,你可以画一条穿过它们的线,看看它在哪里与 Y 轴相交。那会给你 S。另一方面,如果你只给出一个点,它不会告诉你 S,因为线的斜率是随机的。穿过您的点的每条线都有同样的可能性,它们都将在不同的点与 Y 轴相交。

还有一个更微妙的地方:为了让数学计算出来,我们必须用一个大素数 P 来做所有的算术运算。它不需要保密或任何东西,只要非常大。秘密 S 必须介于 0 和 P-1 之间,包括 0 和 P-1。所以当我们说我们在线上生成点时,我们的意思是我们生成一个随机值 R,也在 0 和 P-1 之间,我们生成的点是

x = 1, y = (S + R) mod P

x = 2, y = (S + 2R) mod P

x = 3, y = (S + 3R) mod P

还有很多。秘密对应于x = 0, y = (S + 0 * R) mod P,即x = 0, y = S。

我们看到的是一种使用 K=2 和任何 N 值的秘密共享方式。这已经很不错了 - 如果 N=4,您可以将您的密钥分成 4 组并将它们放在 4 个不同的设备上,这样如果有人偷了这些设备中的任何一个,它们也不会知道有关您的密钥的任何信息。另一方面,即使这两个设备在火灾中被毁,您也可以使用其他两个设备来重建密钥。因此,作为一个承诺,我们增加了可用性和安全性。

但我们可以做得更好:只要 K 不超过 N,我们可以与任何 N 和 K 共享秘密。要了解它是如何构建的,让我们回到图表。我们使用线而不是其他形状的原因是,在代数上,线是 1 的多项式。这意味着要重建一条线,我们需要两个点,不少于两个。如果我们想要 K = 3,我们将使用抛物线,它是二次多项式或二阶多项式。构建二次函数需要三个点。我们可以使用下表来看看发生了什么。