23

私钥丢失也能找回?五分钟了解V神的秘密多重签名恢复方案

 4 years ago
source link: https://news.huoxing24.com/20200120143350473942.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

写在前面:丢失钱包密码或私钥是加密货币用户经常会遇到的问题,那能否有方法可在最小化信任的同时,恢复丢失的密钥呢?这正是以太坊联合创始人vitalik等人正在探索的一个方向,而他们已编写了一个新的EIP(以太坊改进提案),并将其命名为秘密多重签名恢复(Secret Multisig Recovery)方案。

昨日,知名黄金爱好者兼加密货币怀疑者Peter Schiff 在Twitter上声称自己的钱包丢失了密码,因此无法访问自己的比特币。

Schiff接着补充说:

“所以现在我的比特币在本质上毫无价值,它也没有市场价值。我知道拥有比特币是个坏主意,但我从来没有意识到它是如此糟糕!”

iu26v2i.jpg!web

Schiff在推特上公布自己的损失后,加密货币社区很快展开了讨论,例如Morgan Creek Digital 联合创始人兼合伙人Anthony Pompliano就提问他是否自己忘记了密码,而Schiff对此的回答却是:“是我的钱包忘记了密码。”

看不下去的Pompliano只好耐心解释道:

“软件只是执行人类发出的命令,它不能‘忘记’任何事情,给我发邮件吧,我会尽力帮你找回丢失的比特币。”

不过根据Schiff的回答,他的比特币基本已无望找回了,他提到说:

“是Eric Voorhees(注:ShapeShift首席执行官)帮我准备的钱包,即便是他也觉得我无能为力。如果你有任何想法,欢迎尝试。”

看到这里,读者可能觉得这是一个非常悲伤的故事,一位加密货币怀疑者好不容易尝试了比特币,结果却因为自己忘记了密码而丢失了它们。而倘若他在多处备份好私钥,那么即使他忘记了钱包密码,也可以通过私钥访问自己的钱包。

当然,也有人会认为这是一个深刻的教训,它提醒我们要开发相关的技术,为类似的人群提供安全保障。

比如以太坊联合创始人vitalik就评论称:

JjUJjer.jpg!web

“对于人们用‘加密货币就是加密货币,你的工作就是要非常小心地在三个地方写下备份种子’来回答这个问题,我感到失望。我们可以,也应该创造更好的钱包技术,使得安全变得更容易实现。

例如,这里有一个社交恢复提案: https://t.co/tuSbHhXKgd?amp=1

那V神所说的社交恢复提案具体是指什么呢?

下面我们就来简单了解一下吧。

EIP 2429:秘密多重签名恢复

作者:Ricardo Guilherme Schmidt([email protected])、Miguel Mota(@Miguel Mota)、Vitalik Buterin(@vbuterin)、naxe(@ngmachado)

状态:草案

类别:ERC

创建日期:2019-12-07

要求:EIP (137, 191, 831, 1271, 1344, 2470)

摘要

一般来说,加密货币的一个糟糕体验是私钥丢失或暴露,这可能导致不可逆转的情况。

社交恢复被视为账户合约去中心化恢复的一种选择,然而社交恢复的使用,带来了人的因素,而人的因素通常是安全系统脆弱性的主要原因。

社交恢复的主要风险是:

  1. 合谋:如果一些用户知道他们是某个恢复的一部分,他们可能会对恢复攻击的执行感兴趣;
  2. 目标攻击:外部代理可能了解恢复的所有者,并瞄准执行恢复攻击所需最薄弱的点;
  3. 一般暴露:攻击者如果设法感染大型用户基础环境依赖项,并获得对多个身份的访问权限,也可能通过恢复对未受影响的用户产生副作用;
  4. 模拟攻击:针对性攻击可以了解用户的情况,并将该用户模拟到其社交对等方以执行恢复攻击。这变得更加令人关注,因为AI研究能够“深度伪造”其他人的声音和面部动作。

尽管还没有完美的解决方案来解决所有这些问题,但我们的目标是实现“信任最小化”控制者合约,并为用户可能使用的不同钱包启用互操作性。

据悉,该标准提出了一种定义存储在Melkle树中的地址列表方法,这些地址连同它们的权重和用户的个人秘密,将组成一个秘密集,而该秘密集可以在不直接危及用户的情况下公开,因为它仍然需要对地址列表中的总阈值进行人工验证。

该秘密集可以保存,例如存储在web2云存储当中,而不会严重影响安全性,这对于一些不信任自己,但也不希望信任某些特定实体的用户而言是非常有用的。

用户秘密永远不会在链中显示,显示的只是一个nonce哈希,每次恢复时它都会增加。恢复设置获取此哈希秘密nonce的哈希值的哈希值(hash of a hash),这种双哈希方法被用于数学证明请求恢复的人知道该秘密,而不会泄露它。

根据提案,用户可通过提供秘密(user_secret_data)以及加权地址列表(address_list)来配置恢复。

user_secret_data可以是用户可猜测的半私有信息。而user_secret_type是可选的随机大整数,并将其与address_list一起导出为private_hash 。

地址列表的总权重必须大于阈值,而阈值是一个常数:THRESHOLD = 100 * 10^18。

而标准定义了生成可预测用户秘密的几种方法。

Ur6Jf2b.jpg!web

当生物识别(biometrics,例如指纹、面部和瞳孔)技术可用时,应该使用它们,这是最简单的方法。

f2IBZrb.jpg!web

而当没有生物识别技术时,一组通常只有用户知道的诸多问题的标准表单,可被用于生成用户的秘密数据。所有可选的默认字段有:Full Name(全名)、Birth Date(生日)、Mother Name(母亲名字)、Mother Birthdate(母亲生日)、Nationality(国籍)、First Love's Name(初恋者姓名)、First Pet's Name(第一只宠物名)、Childhood Nickname(童年昵称)。

beAJFrq.jpg!web

而密码派生方法,则类似于详细表单方法,但它只要求用户输入一些内容:Full Name(全名)和Password(密码)。

地址列表

用户将定义监护人账户列表,该列表通过用户的联系人列表进行填充。导入选项和输入一个地址应该是很方便的,如图所示:

YNJVb2n.jpg!web

选择好监护人后,系统将提示用户定义每个监护人的权重:

aaQB7zY.jpg!web

这些地址存储在一个标准的merkle树当中,但是每个子叶必须与hash_to_peer进行哈希运算。

merkle_root被哈希为一个标准merkle树,它由keccak256(bytes32(hash_to_peer), uint256(weight), boolean(is_ens), bytes32(ethereum_address))格式的address_list 子叶组成。

方案支持了ENS域名,当监护人拥有一个ENS域名时,应该使用ENS域名。根据EIP-137,如果使用了ENS域名,则is_ens必须为“true”。

列表中的地址可以是账户合约,如果是账户合约,则可以直接调用审批功能,也可以提供EIP-1271签名。而如果是外部拥有帐户,则应用ecrecover逻辑,但它们也可以直接调用approve函数。

weight设置此地址值相对于THRESHOLD常量的批准程度。

eY3aAnJ.jpg!web

用户秘密数据哈希

bUrmMza.jpg!web

  1. 对于多个用户而言,recovery_contract可能是相同的,这是用户正在使用的共享秘密多重签名合约地址;
  2. user_secret_data是用户数据的纯格式字节数据,它从不暴露,也不会被保存。当private_hash是未知时,应向用户进行请求;
  3. private_hash是keccak256(user_secret_data),它从不暴露,可以用秘密集导出。这可以在所有恢复中重复使用;
  4. merkle_root是通过对普通merkle树进行哈希运算得到的,它在执行时会被揭露;
  5. weight_multipler定义要达到THRESHOLD需要乘以多少个单独权重;
  6. hash_to_execute是keccak256(private_hash, address(recovery_contract), recovery_contract.nonce(user_address)),它仅在执行时公开,每次恢复都是唯一的,也被称为“显示哈希”。Nonce和恢复合约地址被用于允许重用private_hash;
  7. hash_to_peer是keccak256(hash_to_execute),它在恢复授权请求时会公开,其被用于通过揭露public_hash种子来证明用户知道hash_to_execute和merkle_root,这也被称为“部分泄漏哈希”;
  8. public_hash是keccak256(hash_to_peer,merkle_root,weight_multiplier),它自配置后就是公开的,只能使用一次,这也用于防止执行的重放。执行成功后,必须使用setup(bytes32,uint256)进行重配置;

恢复秘密集URL

Eb2uquZ.jpg!web

恢复所需的所有信息都将存储在url类型标准中:

recovery = erc831_part account_contract [ "@" chain_id ] "/" recovery_contract "/" private_hash | secret_type "/" address_list / weight_multipler [ "?" parameters ] [ "#" notes ]
erc831_part = "ethereum:recovery-"
account_contract = ADDRESS
chain_id = 1*DIGIT
recovery_contract = ADDRESS
private_hash = "0x" 64*HEXDIG
secret_type = UINT
address_list = ethereum_address *( ";" ethereum_address )
weight_multipler = UINT
ethereum_address = ADDRESS / ENS_NAME "*" weight
weight = UINT
ADDRESS = "0x" 40*HEXDIG
parameters = parameter *( "&" parameter )
parameter = key "=" value
key = STRING
value = STRING
notes = STRING
  1. account_contract是指要进行恢复的账户合约,可以使用任何账户合约,因为恢复合约可以执行到任何接口或地址(如常规多重签名);
  2. chain_id为所有地址定义了以太坊链,如果不存在,则预设为1(主网);
  3. recovery_contract 执行恢复合约的逻辑,必须支持此文档中指定的ABI;
  4. secret_type选择生成user_secret_data时使用的标准,在未给定private_hash时是必需的;
  5. private_hash是user_secret_data的哈希,如果不存在,恢复将要求使用secret_type所选的标准来获取user_secret_data;
  6. weight_multipler 是每个weight将乘以的值,以达到THRESHOLD常数;
  7. address_list是具有个人权重的地址列表,最好是另一个帐户合约,表明它们可用于恢复请求,但任何地址都可以帮助恢复。可以使用ENS域名,并在恢复过程中进行解析。总权重应高于THRESHOLD常数;
  8. weight默认为Math.ceil(THRESHOLD / address_list.length),由用户设置自定义;
  9. parameters可能需要特定的secret_type;
  10. 如果需要的话,notes可用于密码提示;

恢复程序

当需要恢复时,用户需要将其Recovery Secret Set URL(恢复密钥集URL)加载到支持此标准的电子钱包中。根据配置的不同,当private_hash(私有哈希)不可用时,必须从对用户构成挑战的user_secret_data处生成。

加载有效的密钥集时,它将提示哪些用户请求帮助。一些钱包或许能自动发送请求,而另一些钱包则允许用户共享这个Help Recover Request URL(帮助恢复请求URL)。

该EIP鼓励尽可能使用预签名的消息EIP-191,这一点很重要,因为gas成本是一个常见的障碍。如果监护人选择的地址是帐户合约,则必须是EIP-1271才能使用预签名信息。建议的正常顺序如下:

YBNb6z2.jpg!web

在特殊情况下,如果账户合约无法签署信息,或者用户的钱包无法按照这个EIP上指定的格式签署信息,则也可以通过使用msg.sender的方法执行常规操作。

在这种情况下,监护人将不得不支付一小部分gas费用。

A7FFja2.jpg!web

理论基础

user_secret_data从不公开,在用keccak256算法进行哈希运算一次后,它就成为从不公开的private_hash。理论上,应该使用生物特征技术,因为用户不太可能丢失他们的生物特征。而生物特征通常是不安全的,因为它们并不是真正的秘密,任何高分辨率相机实际上都可以读取大多数生物特征,而且这些信息通常也为政府所知。

当生物特征不可用时,用户数据表单仍然提供相当好的安全性,因为合约中存储的哈希是离源数据非常远的加盐(salted )哈希,即使只有名字被用作user_secret_data,也是很难发现的。这些数据越不可预测,就越能抵御目标攻击,而目标攻击仍需要发现用户列表并接收足够的授权。

在成功执行之后,需要重新配置以实现安全性保障。在经历一次恢复后,恢复合约必须禁用自身,并等待新的配置。

可能存在的攻击

需要注意的是,支持此EIP的钱包,应考虑用户可能被请求帮助恢复其他账户,而请求可能来自任何知道secret_set的人,包括合法拥有者或以某种方式获取secret_set的攻击者。

因此:

  1. 钱包必须询问用户请求的合法性,询问请求是否是通过个人验证后进行的;
  2. 用户必须知道,他们对自己的链上操作负有责任(在某些国家是道德的、合法的),并且必须验证恢复请求的合法性;
  3. 视频通话可能是通过AI伪造的,但攻击者需要图像和语音样本,例如互联网上的公共演讲内容;
  4. 为名人进行恢复的用户,永远不要信任视频通话,应该去尝试直接联系周围的人,以检查请求的合法性;

简评:这种方案正是针对Peter Schiff这样容易忘记钱包密码或私钥的群体而设计的,但其也存在着安全隐患,而它对加密货币的社会可扩展性而言是非常重要的,因为多数人在最初接触加密货币时会和Peter Schiff类似。本文省略了很多技术细节内容,有兴趣的读者可以看原提案内容: https://gitlab.com/status-im/docs/EIPs/blob/secret-multisig-recovery/EIPS/eip-2429.md


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK