【译】Ethereum Wallet in a Trusted Execution Environment / Secure Enclave

介绍

在过去的几周里, Weeve团队已经从社区中获得了很多关于我们如何将以太坊钱包应用到我们的 weeveOS中的兴趣 。 weeveOS是一个开源操作系统,针对IoT-to-Ethereum进行了优化(在未来的版本中,我们将增加对其他区块链技术的支持)应用程序利用最先进的安全机制来保护以太网钱包免受网络攻击( GitHub )。 通过WeeveOS,该项目旨在为区块链实施安全可靠的物联网神谕。

您可能会问自己,为什么有必要在可信执行环境(TEE)中使用钱包解决方案,有时也称为可信安全区? 钱包基本上是用于管理数字货币的软件应用程序。 由于软件永远是网络攻击者的“简单”目标,而且这个钱包将包含您的私钥,因此我们需要确保此软件在最安全的环境中。 通过TEE方法,我们能够以高度安全和可信的方式保护钱包软件,而无需额外的硬件。 或者,换句话说,现在汽车,充电站,集装箱或冰箱都可以拥有自己的物联网钱包,并自主参与金融活动,如购买食品,能源或出售运输空间,而不存在钱包成为网络盗窃的风险。

在本文中,我概述了我们如何将以太坊钱包作为受信任的应用程序实现,或者更简单地将其作为C中的钱包实现。在详细介绍之前,我将简要介绍可信执行环境的新概念,描述以太坊虚拟机( EVM)并详细说明了如何在可信执行环境(TEE)中生成事务。

可信执行环境

TEE提供了一个执行空间,可以提供比商品操作系统更高的安全性。 令人惊讶的安全功能包括:(1)隔离执行,(2)安全存储,例如加密密钥材料,以及(3)设备配置的远程证明,仅举几例。 我们的weeveOS实现了ARM的TEE版本。 将CPU的权限分离为安全和非安全的世界以及两个世界中的不同中断为我们提供了大量工具来大大提高安全性。 Trustzone可以看作是ARM的安全扩展,就像SGX是Intel的安全扩展。 这两种硬件扩展都利用(几乎)相同的操作系统安全加固功能,因此仅在目标领域有所不同:英特尔面向PC和服务器领域,而ARM则主导嵌入式/物联网设备领域。 这两种技术都有共同的程序隔离。 英特尔称主体为Trusted Enclave,ARM将其称为可信执行环境。

在下文中我们坚持使用ARM术语。 Trustzone将计算环境(例如,内存区域,CPU权限)划分为两个隔离的隔离区,称为安全和非安全世界:

非安全 世界是CPU的“正常”环境,没有更高的权限可用。 仅分配必要的权限和中断以确保不可能未经授权访问安全世界。

Secure World是ARM TrustZone架构的主要特性。 它包含安全操作系统,安全监视器,加密接口,安全存储和可信应用程序。

该图显示了weeveOS的非安全和安全的世界。 我们的GitHub中提供了该实现。

独自一人,Trustzone硬件不足以掌握可信执行环境的所有优点。 除硬件外,还需要一个支持TEE的操作系统,以激活全部安全潜力。 这就是Weeve团队开发weeveOS的原因。 实际上,TEE包括(至少)两个操作系统。 第一个实现正常世界,第二个实现安全世界。 我们的方法是选择精益安全的世界操作系统和丰富的普通世界操作系统。 该论点如下,通过降低安全OS的复杂性,发现漏洞的可能性比具有全面内核和中间层的OS的情况要短。 如图所示,三个TEE模块增强了商品操作系统的系统架构,有助于在安全世界中执行称为可信应用程序的程序:

  1. TEE客户端:客户端为本机应用程序提供一些接口,以便与安全操作系统中的可信应用程序进行交互。
  2. TEE驱动程序:驱动程序为特权普通操作系统提供了利用Trustzone硬件安全技术的能力。
  3. TEE Monitor A(安全)监视器确保只允许有效且格式正确的值作为安全世界的输入,同时作为两个世界中可能发生的一切的监督者。 来往安全世界的所有通信都通过监视器。 整个weeveOS机器是实现商品物联网操作系统通常无法提供的安全功能所必需的。

另一个值得一提的重点是,以太坊基于虚拟机而不是数据库,例如比特币网络就是这种情况。 由于这个事实,以太坊智能合约允许执行命令,而不仅仅是交易(作为一种特殊情况)。 钱包是与EVM交互的客户端软件。

通过TEE以太坊钱包,我们可以创建EVM可以解析和执行的事务。 更准确一点,TEE以太坊钱包向EVM发送命令(通过我们的网关,与EVM连接)。 为了不破坏任何命令,必须对命令进行格式化。 我们在实施过程中必须解决的微妙障碍是应对安全世界提供的相当有限的编程机会。 原因是安全监视器根据定义允许与安全世界的有限交互。

为什么以太坊钱包很重要

但是,当有足够的免费替代解决方案时,为什么需要一个以太坊钱包,尤其是可靠应用中的钱包呢? 答案非常简单,所有这些解决方案首先不是用C语言构建的,其次不是在TEE中构建的。 对古典硬件钱包的巨大优势是不需要额外的硬件,因为TEE的范例我们能够保持硬件钱包的优势。 因此,可以容易地实现加密算法的改变或其他钱包(例如,多钱包)的改编。 另一个优点是,如果您想使用钱包,则无需额外的人工干预。 这尤其具有吸引力,因为物联网设备是现在可以在没有用户干预的情况下自主参与公平交换数字资产的机器。

创建以太坊地址

我们的钱包需要的第一件事是以太坊地址和我们的公钥和私钥对。 该密钥对使用基于椭圆曲线密码(ECC)的数字签名算法(DSA)计算,该算法使用SECP256K1曲线进行参数化。 由于钱包是在受信任的应用程序中构建的,因此我们可以毫不犹豫地将密钥对保存在安全的存储中。 公钥现在用于生成我们的以太坊地址。

以太网地址基本上是来自散列公钥的最后20个字节。 因此,我们使用公钥并使用SHA3-256(Keccak)哈希算法对其进行哈希处理。 输出将是32字节长。然后只需删除前12个字节以获取我们的以太坊地址。

例如(输出以十六进制表示形式打印):

hash(public_key)= 45c1442cbfeebe459c91636455c2d462b27e49df96ae923a131bdf81548e3b2e

比我们的以太坊地址将是:

55c2d462b27e49df96ae923a131bdf81548e3b2e

干得好,凭借我们的密钥对和以太坊地址,我们创建了我们的安全钱包。 下一步是生成交易。 这里有令人兴奋的东西......

创建交易

RLP编码

通过使用MQTTS与我们的客户和我们的网关进行通信,我们可以将所需的交易参数(如汽油价格,天然气限制等)直接推送到我们可信赖的应用程序中。 这将确保没有正常的世界应用程序可以操纵这些参数。

为了将事务参数推送到所需的客户端, 网关将所有协商的参数设置为JSON-String并通过MQTTS将其推回。 该客户端上的受信任应用程序将解析JSON-String并生成具有所有必需值的结构。 我们将使用这些值来创建我们的交易。 基本上我们从结构中获取每个参数,并使用递归长度前缀(RLP)编码对所有值进行编码,以便以太坊网络可以处理我们的事务。

RLP编码定义如下:

  • 如果一个字节值的值在0x01和0x7f之间,我们只需将此值作为rlp编码。 0x00值为0x80。 [检查0 == 0x80]
  • 对于长度为2-55字节的字节,编码由长度前缀加上字符串本身组成。 长度前缀是字符串的长度加上值(偏移量)0x80。

例如,字符串“hello world”的长度为11(或十六进制0x0b),因此RLP的第一个字节为0x80 + 0x0b = 0x8b。 与字符串连接将给我们:

“hello world”= 0x8b,0x68,0x65,0x6c,0x6c,0x6f,0x20,0x77,0x6f,0x72,0x6c,0x64
  • 如果字符串长度超过55个字节,则编码定义字节值0xb7加上字符串长度加上字符串长度的字节长度。 之后,在末尾添加实际的字符串长度和字符串本身。

Imagen一个1024“s”的字符串:

“sss ...”= 0xb9,0x04,0x00,0x73,0x73,0x73

所以0x73s定义了字符串本身。 0x04,0x00定义字符串的长度(1024 = 0x0400)。 最后,第一部分0xb7加上第二部分的长度(0xb9 = 0xb7 + 0x02)。

  • 如果我们编码孔有效负载并且有效负载是一个列表,我们确定该列表的总长度并检查它是否在0到55字节之间。 编码由列表的长度+ 0xc0加上RLP编码的有效载荷组成
  • 最后一条规则,如果我们有一个有效载荷列表且长度超过55个字节,则RLP编码由0xf7加上有效载荷长度的字节长度,后跟RLP编码的有效载荷。

显然我们创建了一些辅助函数,它接受RLP编码步骤。

v,r,s值

v值确定我们想要发布我们的事务的链,并且是十进制数的十六进制表示(即如果我们想要处理链id“4”,我们的v值在第一步中是0x04)。

r和s值稍后将签名拆分为每个32字节。 但是,对于第一步,我们必须将其保持为0(如上所述,RLP编码将在我们的事务中将其更改为0x80)。

必要的交易价值

此外,交易需要填写以下字段:

  • 天然气价格:天然气价格决定了创建者为兑换交易而想要支付多少钱。
  • 天然气限制:通过天然气限制,我们定义了我们希望在单笔交易中支付多少的上限。
  • 收件人:此字段包含收件人的以太坊地址。
  • Nonce:nonce是一个任意数字,只能使用一次,并向我们显示Wallet使用了多少交易。
  • 价值:在这里我们决定我们想要转移多少以太
  • 链ID:如前所述,此值位于v字段中并定义使用的链ID。
  • 数据[可选]:数据字段是事务中唯一的可选字段。 我们在这里定义一个交易ID来跟踪以太坊网络中的交易。

交易价值的顺序

接下来我们要创建我们的交易。 这可以通过使用我们的RLP编码对所有上述值进行编码并将所有内容连接在一起来完成。 这里以正确的顺序连接值非常重要。 以太坊无法解析具有不同订单的交易。

Nonce + gas_price + gas_limit + to + value + data + v + r + s => transaction

在将此连接字符串用作事务之前,我们需要对孔有效负载进行编码。 如RLP规则中所述,我们没有有效负载列表,只有一个字符串,因此该步骤的偏移量为0xc0。

所以从我们的价值观(以十六进制表示):

nonce =“00”
gas_price =“01”
gas_limit =“0186a0”
to =“f125691d24a6b5cdcb87a89cb825fdf4487c2a34”
value =“0401”
data =“fe3d61b7cd6eff03698c0303b056e0fe3116206e”
v =“04”我们使用链ID 4
r =“00”
s =“00”

我们得到一个编码交易:

0xf84a8001830186a094f125691d24a6b5cdcb87a89cb825fdf4487c2a34820401a866653364363162376364366566663033363938633033303362303536653066653331313632303665048080

现在我们已经完成了编码交易,我们已准备好对其进行签名。

签署交易

在我们将事务编码为所需格式后,我们可以开始签署此消息。

签名算法采用我们的编码事务并从中生成哈希(再次使用的哈希算法是SHA3-256 Keccak)。 此哈希和私钥将生成我们的签名。 签名本身由一对(r,s)组成,其中每个元素长度为32个字节。

再次编码

最后我们使用签名,将该对分成两个32字节的字符串并将它们移动到我们的结构中。 显然r被推到我们的r结构值,s被推到s。

v值将(如事务描述中所述)确定使用的链,并用于稍后从签名中恢复公钥。

恢复公钥

要从椭圆曲线数字签名算法(ECDSA)恢复公钥,我们必须知道

a)该算法使用什么曲线

b)使用了什么哈希函数

c)签署了什么消息

幸运的是,我们知道所有这些要求,但我们现在无法唯一恢复公钥。

如果我们尝试使用这些参数恢复它,我们将获得两个公钥; 一个在正y坐标上,一个在负面上。 要唯一地恢复公钥,我们还需要一个恢复ID,它将确定正确的公钥。 以太坊通过重新计算以下内容将此恢复ID保存在v字段中:

chain_id * 2 + 35 +(0或1)

0或1确定我们是否具有公钥y点的正位置或负位置。 要获得此值,我们只需读取公钥y点的最后一位,并确定其是0还是1。

因此,对于我们之前的示例事务,我们得到:

0xf88a8001830186a094f125691d24a6b5cdcb87a89cb825fdf4487c2a34820401a8666533643631623763643665666630333639386330333033623035366530666533313136323036652ba0d5c8eaca6a7bc128065bf7ed3fa053863cdff64b8910f1325099eb89328877fba073fc3184cf468d163296543433c31213ebcf83b3a076a8765461e81c79b1ebc7

使用重置的v,r,s值,我们像以前一样再次编码孔事务。 输出现在将填充到我们的正常世界应用程序中,并可用于推进以太坊链。

结论:以太坊链安全钱包的成功

由于我们在安全领域内创建这个受信任的应用程序的进步,我们现在能够安全地为以太坊链创建钱包和交易。 这使我们能够利用TEE(可信执行环境)的安全功能来对抗针对物联网设备的网络攻击。

如果你做到这一点,首先祝贺,其次,我们确信你要么有几个问题,要么想和我们聊聊。 请联系我们Gitter并在这里查看我们的Github或加入Telegram上的对话


我们注意到TEE以太坊钱包是weeveOS的一部分,这是一个开源项目。 我们征求反馈或任何形式的社区贡献来发展项目。

 

https://medium.com/weeves-world/ethereum-wallet-in-a-trusted-execution-environment-secure-enclave-b200b4df9f5f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值