密钥所有权的托管或非托管性质并不像传统思维所认为的那样非黑即白。
原文标题:《Wallet Security: The ‘Non-Custodial’ Fallacy》
撰文:Nassim Eddequiouaq、Riyaz Faizullabhoy
编译:Kyle
「不是你的密钥,不是你的加密货币」,这句话在加密圈很流行,它传达了纯粹主义者的加密密钥管理哲学。在这种钱包安全模型中,只有个人(或通过「多重签名」的团体)可以直接和唯一地控制他们自己的私钥——因此,他们拥有其加密资产的真正所有权。坚持这种强硬方法的加密钱包被称为「非托管」钱包,这意味着没有外部力量可以访问获取这些密钥。
然而,情况并非如此简单。一些备受瞩目的「非托管」钱包黑客攻击事件——包括今年 8 月份入侵 8,000 多个账户的 Slope 钱包黑客攻击、2020 年损失价值超过 200 万美元的 IOTA 代币的 Trinity 钱包黑客攻击、导致攻击者在 2017 年窃取 150,000 ETH 的 Parity 钱包黑客攻击,以及发现各种硬件钱包漏洞和其他事件——破坏了托管钱包和非托管钱包之间的传统区别。在其中许多案例中,认为自己使用的是非托管钱包的受害者发现攻击者能够劫持他们的钥匙。这就有点矛盾了,不是吗?
事实上,这里面的故事比一句流行语所能捕捉到的要复杂得多。非托管钱包并没有真正让用户完全控制他们的密钥。这是因为这些钱包通常是由其他人的软件或硬件创建和操作的。用户不断地信任其他人、产品和计算机程序。他们接受使用区块链命令行界面、钱包软件和设备、中心化平台、智能合约代码、去中心化应用程序以及介于这些东西之间的所有各种钱包连接集成。每个接触点都会增加风险;所有这些互锁部分的总和打破了非托管钱包的幻想。
实际上,托管权是非二元的。 乍一看似乎是非托管的,实际上里面可能涉及许多托管要素,人们通常把这些要素的可靠性视为理所当然。 传统的二分法——托管与非托管——是错误的。
相反,最好更加细微地看待钱包。 关键问题是:我愿意接受多大的攻击面,以及我愿意承担多少责任来消除对第三方的信任? 一般来说,密钥管理——钱包安全的基础——可以分为三个区域,每个区域都有独特的曝光机会。 子类别如下:
- 密钥生成(创建加密密钥)
- 密钥存储(保护密钥)
- 密钥使用(使用钥匙)
本概述旨在帮助 Web3 用户更好地了解通过上述标准保护其资产所涉及的复杂性。此外,我们的目标是帮助工程师识别和支持钱包开发中的常见故障点。我们希望通过应用本指南——源自我们在 Docker、Anchorage、Facebook 和 a16z 加密领域构建加密和安全系统的多年综合经验——将帮助人们避免安全事故,无论他们是在与之交互、参与还是构建 Web3 技术的过程中。
下面,我们将介绍当今存在的加密钱包安全和托管平台的常见特征和缺陷。我们还涵盖了我们认为在未来几个月和几年内最需要关注和发展的领域,以提高用户 Web3 体验的安全性。
密钥生成:钱包安全性
任何关于钱包安全性的讨论都必须从密钥生成开始,即创建加密密钥的过程。无论钱包被认为是托管的还是非托管的,密钥生成步骤的安全属性对于此后的密钥安全至关重要。在密钥生成过程中,需要牢记三个首要问题:使用可靠的代码、正确实现代码以及安全地处理输出。
如果您不是加密专家,则可能很难验证本书是否完成了以下所有因素。检查您是否可以获得受信任的审计报告,一些钱包提供商会在其官方网站或 Github 存储库上发布该报告。此外,自己进行研究,以确定钱包背后是否有一家信誉良好的公司。如果背景信息稀少,重要的用户和开发人员活动可能是衡量该钱包声誉的下一个指标。
请遵循这些准则以减少您的风险敞口。如果钱包未通过以下检查,请逃离这个钱包。
使用不是自己推出密码的钱包
密码学家有一句话:「不要推出自己的加密。」这个要点类似于「不要重新发明轮子」的格言。车轮完好无损,任何从头开始重建车轮的尝试都可能导致产品质量更差。加密也是如此,这是一门很难完全正确的科学。组成钱包的代码应该以运行良好而闻名。选择写得不好的软件——或试图从头开发自己的替代软件——可能会导致诸如密钥泄露或向未经授权的各方泄露秘密信息等事故。这就是 Profanity 的虚荣地址工具中最近被利用的漏洞背后的原因。首先,应该清楚有问题的钱包使用了经过审核且信誉良好的密钥生成库和流程。
使用再三测量的钱包
即使代码使用有信誉的密码库,它仍然必须正确集成。经过审查的软件通常会默认设置正确的参数,但在执行过程中可能存在差距。例如,需要强大的熵源或数学随机性剂量来使要生成的密钥不可预测,因此更安全。对于某些密钥生成过程,例如对于许多多方计算 (MPC) 算法,其中必须生成和协调许多单独的密钥(或分片、密钥片段),钱包应该遵循算法指定的精确协议。该算法可能还需要多轮计算以及刷新密钥,钱包必须正确集成以维护资金的安全性。
使用可以保守秘密的钱包
密钥生成过程的最后阶段涉及软件的实际操作和输出。请注意密钥的生成位置和形式。
理想情况下,密钥应该在独立的硬件中生成,并且信息应该使用有信誉的算法加密。一个需要避免的例子是数据加密标准,或 DES,今天被认为是糟糕的。以明文形式留下的密钥——尤其是在内存中、磁盘上或位于被称为「交换」的这两个地方之间的中间区域——是一个主要的安全风险。一般来说,密钥材料不应离开生成它的硬件,也不应放到其他人可以访问的网络上。 (也就是说,除非密钥材料被加密,在这种情况下,加密密钥也必须得到保护。)
今年夏天被黑的钱包 Slope 的密钥在生成后以明文形式登录到外部服务器。这种安全漏洞可能会出现在代码的审计或开源实现中。对缺乏透明度的钱包——以封闭源代码为特色,没有对公众可用的第三方安全审计——应该发出危险信号。
密钥存储:钱包安全
生成密钥后,需要将它们存储在某个地方——不以明文形式,始终加密。但仅仅拥有存储密钥的设备并不一定等同于掌握密钥的所有权和控制权。必须考虑许多因素,例如设备的供应链安全性、设备的连接方式以及设备与哪些其他组件交互。此外,每种存储方法在安全性、可访问性、可维护性和可用性之间都有自己的权衡取舍。
下面,我们根据相关的感知风险水平对最常见的类别进行细分。
风险高:「热」钱包
这个概念实际上与温度没有太大关系。当谈到密钥存储选项时,如果钱包与互联网连接,它就会被认为是「热的」。另一方面,如果钱包处于离线状态且被隔离,则它被认为是「冷的」。在其他条件相同的情况下,冷钱包比热钱包更安全——但它们也更难访问和使用。连接到任何网络的钱包更容易受到黑客攻击,因为它让攻击者有更多机会发现和利用漏洞。
热钱包可以采取几种形式。
连接的软件:在线数据库、电话或网络服务器应用程序内存、浏览器扩展
这些是风险最大的选择。在这里,无论是否是托管的,钱包软件都可以直接访问密钥——同时连接到外部互联网。理想情况下,密钥应加密,用于加密的另一组密钥应存储在具有高度受限访问控制的专用密钥管理系统 (KMS) 中,例如操作系统密钥链或云密钥管理系统。
对于基于软件的热钱包,将密钥管理和授权与其他软件组件隔离开来是至关重要的。日志记录、错误管理和内存管理(尤其是基于堆(heap)的,其中密钥可能未正确「归零」或擦除)可能会出现问题,所有这些都可能错误地泄露密码、加密密钥、签名密钥或其他敏感信息加密材料。发生这种情况时,入侵者可以通过连接的应用程序或 Web 服务器、旁道攻击或内部威胁获得未经授权的访问。
无论服务如何标记自己,如果在线系统内存中的签名密钥随时未加密,则该模型应被视为热软件钱包。 (即使密钥后来被静态存储在安全飞地中。)
连接的硬件:专用设备、移动安全飞地、在线硬件安全模块 (HSM)
连接的硬件通常被认为比连接的软件风险小,但它仍然不如冷存储安全。在连接的硬件中,密钥仅在专用硬件设备中生成并存在。然后这些可以连接到内部或公共网络。此类设备通常承担与密钥管理相关的多项职责,包括密钥生成、签名和存储的安全性。
连接的硬件有多种。有一些硬件钱包,例如 Trezor 和 Ledger 设备,一些加密用户通常会使用它们。 (应该有更多的人使用这些设备,因为它们比单独使用连接的软件要安全得多。)还有硬件安全模块或 HSM,通常用于更传统的业务环境,例如处理敏感数据处理的业务环境,例如信用卡付款。
设备的安全性取决于生产和配置它们的供应链。在考虑连接的硬件时,问问自己:设备或固件在进入您的财产之前被篡改的可能性有多大?为了降低这种风险,最好直接从受信任的供应商处购买设备。让它们直接从源头发货。确保产品包装看起来没有受损——没有撕裂、撕裂、破损的密封等——这些破损可能表明在运输过程中被篡改。还建议在使用前验证固件版本和配置。执行此操作的步骤因硬件而异,但都应提供说明。
当然,硬件钱包以后总是有可能被未经授权的一方窃取或访问。鉴于这些威胁,确保硬件钱包也具有安全的访问控制层非常重要——确保它们不会盲目地签署任何和所有交易。控制可以包括密码要求、要求对交易的每一步明确许可的提示,以及描述交易实际执行情况的简明英文摘要。此外,大多数硬件钱包都支持私钥加密,也称为「密钥封装」。更好的是,安全钱包不允许以原始明文形式导出密钥,即使有人希望它们如此。
这是真正保护加密资产所需的安全级别。
风险低:「冷」钱包
热少,风险低。 在其他条件相同的情况下,冷钱包通常被认为比热钱包更安全,尽管这类钱包通常也不太可用。 冷钱包通常被称为「实体隔离」(airgapped)钱包,这意味着它们与任何内部或公共网络无关。
在这种情况下,孤独是一种美德。 实体隔离涉及实施严格的物理隔离和授权措施。 这些措施可以包括使用法拉第笼(屏蔽无线信号)、生物识别访问(如指纹或虹膜扫描仪)、运动传感器(在未经授权的情况下触发警报)和 SCIF,或敏感隔间信息设施(处理机密信息的特殊区域)。
让我们更详细地回顾一些冷钱包选项。
Airgrapped 软件:离线服务器应用程序
因为攻击者可以随时窃取或使机器上线,所以冷钱包应设计有安全系统,即使它们上线也能正常运行。应通过标准方法(例如 Shamir 的秘密共享或多方计算)将密钥拆分为密钥碎片 —— 要求重新连接碎片以使其可用。与连接的软件相比,强烈建议使用专用硬件(例如 HSM),因为它们通常提供更多控制。
Airgrapped 硬件:离线硬件钱包,离线硬件安全模块(HSM)
该解决方案被认为是最安全的。与前一类类似,人们应该假设硬件可以被盗并在线获取。出于这个原因,这些系统再次包含正确实施的访问控制层也很重要,如前所述。许多 HSM 供应商需要将一定数量的物理智能卡放在一起,然后才能解锁对密钥的访问。即使设备没有显示屏,它也应该为用户提供一些验证交易细节的方法。
因为冷钱包或 airgapped 钱包是最安全的类别,所以大玩家管理的大多数资金都是以这种方式存储的。主要零售服务,如 Coinbase、Gemini、Kraken 等,以及为机构用户提供的服务,如 Anchorage,都采用这种方式。这些玩家中的许多选择以备份和恢复的形式设置另一道防线,以防万一他们失去访问权限,或者机器被损坏、被盗或被破坏。
备份和恢复
签名密钥应始终在加密后备份。具有加密签名密钥和密钥包装密钥的冗余至关重要。备份签名密钥的方法不同,但应该始终首选硬件原生解决方案。
对于硬件钱包,备份通常涉及一个 12 字的明文种子短语,从中派生出私钥。这个种子短语应该以非数字方式存储(想想纸、金属)并以最安全的方式存储(家里的物理保险库、银行保险库内)。该短语可以分成地理分布的部分,以防止整个秘密被轻易泄露。 (人们有时通过引用虚构的魂器来解释这种方法,黑巫师在《哈利波特》中有效地使用这些魂器来「备份」他们的灵魂。)
许多 HSM 本身就可以处理与备份和恢复相关的一些挑战。标准的具有可以导出默认情况下使用访问控制加密的密钥的机制。如果满足访问控制,则可以将密钥导入其他 HSM。有用的是,还可以为 HSM 队列提供公共加密密钥,该密钥源自智能卡的法定人数。以这种方式将硬件与关键材料解耦有助于避免单点故障。
密钥用途:钱包安全
生成和存储密钥后,它们可用于创建授权交易的数字签名。 组合中的软件和硬件组件越多,风险就越大。 为降低风险,钱包应遵守以下授权和身份验证指南。
信任,但也要验证
钱包应该需要身份验证。 换句话说,他们应该验证用户是他们所说的人,并且只有授权方才能访问钱包的内容。 这里最常见的保护措施是 PIN 码或密码。 与往常一样,这些应该足够长和复杂——使用许多不同类型的字符——才能最大限度地发挥作用。 更高级的身份验证形式可以包括生物识别或基于公钥加密的批准,例如来自多个其他安全设备的加密签名。
不要自己制作密码库(再次强调!)
钱包应该使用完善的密码库。做一些研究以确保它们经过审计和安全,以避免密钥材料泄漏或私钥完全丢失。使问题复杂化的是,即使是受信任的库也可能具有不安全的接口,就像最近这些 Ed25519 库的情况一样。当心!
随机数重用
一个经过充分研究的密钥使用陷阱是某些加密签名参数的无意重用。一些签名方案可能需要一个 nonce 含义,「使用一次的数字」,一个仅意味着在系统中使用一次的任意数字。椭圆曲线数字签名算法 (ECDSA) 就是这样一种签名方案。如果使用 ECDSA 重用 nonce,则可能导致密钥泄露。其他各种算法不受影响,因此,像往常一样,确保使用完善的密码库。 (某些加密库通过散列交易数据来确保唯一的随机数,其中包括其他唯一数据,例如帐户随机数。)但这种攻击向量之前已经在 web3 之外的高调黑客攻击中被利用,例如 2010 年索尼 PlayStation 3 黑客攻击。
一个密钥只用于一个目的
另一个最佳实践是避免将密钥重复用于多个目的。 例如,应为加密和签名保留单独的密钥。 这遵循了在被攻破情况下的「最小特权」原则,这意味着对任何资产、信息或操作的访问应仅限于系统工作绝对需要它的各方或代码。 如果实施得当,「最小特权」原则可以极大地限制成功攻击的「爆炸半径」。不同的密钥将根据其用途对备份和访问管理有不同的要求。 在 web3 的背景下,最好的做法是在资产和钱包之间分离密钥和助记词,因此一个账户的泄露不会影响其他账户。
结论
密钥所有权的托管或非托管性质并不像传统思维所认为的那样非黑即白。密钥管理中涉及的许多活动部分使情况变得复杂——从密钥生成到存储再到使用。区块链涉及的每一个硬件或软件都会带来风险,即使是所谓的非托管钱包选项也会面临托管类型的风险。
对于未来,我们预计将进行更多的开发工作,以保护钱包免受攻击并减轻上述风险。改进领域包括:
- 跨移动和桌面操作系统共享安全开源密钥管理和事务签名库
- 共享的开源交易审批框架
- 具体来说,我们会特别兴奋地看到共享和开源的发展:
- 密钥生成库可在不同的存储后端(在磁盘上加密、安全硬件等)实现一流的安全性
- 用于移动和桌面操作系统的密钥管理和事务签名库
- 交易批准流程框架,实施强大的因子验证,例如生物识别、基于 PKI 的批准、授权恢复等。
上面的列表并不详尽,但它是一个很好的起点。这就是说,情况比「不是你的密钥,不是你的加密货币」的口号所暗示的要复杂得多。考虑到从生成和存储到使用的许多交互部分和阶段,密钥拥有权是一件棘手的事情。