# 走进科学 | 2. 如何使用钱包进行安全签名

By [web3eye.eth](https://paragraph.com/@web3eye) · 2022-03-16

---

签名这个词语对我们来说并不陌生，在很多场景中都会使用到签名。比如：

1、登录某网站时，连接钱包之后会提示你进行签名。

2、discord 使用 collab.land 进行身份认证时，要求连接钱包并签名。

3、在 coinlist 登记优先队列时，也会用参与任务的钱包地址签名进行认证。

或许上面这些场景你都没遇到过，但其实只要你使用过 eth 进行转账，其实你也用到过签名，只不过签名的步骤包含在发起交易的过程中了。所以签名在加密世界里面无处不在，我们如果要使用代码去调用合约抢跑交易，自然也是少不了签名的，所以在本文中，我们将重点讨论下签名的原理和工具。

**什么是签名**

现实生活中我们都有过签名的经历，很多时候不仅要签名还要盖上指纹印，这里签名的作用就是通过字迹和指纹来证明这是经过你本人确权的，是有法律效应的。当然，我们这里要讨论的是数字签名，和现实中的签名类似，也是要证明你签署的信息或者交易确实是你本人发起的，它的主要作用就是保证了数据的有效性（验证是谁发的）和完整性（证明信息没有被篡改）。这一过程是如何做到的呢？

我们的钱包地址都会有一个私钥，私钥是唯一的并且非常重要，如果别人知道你的私钥他就可以盗走你的资金，拥有私钥的人就拥有整个钱包资产的所有权。这个私钥可以推导公钥，但由于公钥太长，为了简便实用，就出现了“地址”，地址是公钥推导出来的。这些推导过程是单向不可逆的，所以地址不能推出公钥，公钥也不能推出私钥。对比生活中的签名，你的字迹和指纹就代表了你的私钥，只有你可以解锁你的资产。而数字签名就是用你的私钥签署一段信息，而验证人可以通过公钥来验证签署信息的合法性。

**注意签名安全**

在新版的 metamask 中，会把签名的原始信息展示给用户，比如使用 collab.land 验证 discord 的身份时，点击签名按钮之后会出现签名确认的界面，如图所示：

![](https://storage.googleapis.com/papyrus_images/32a8833110da109eaf0d8ba6d90389e2a2ee54c8cc5865e126b04530f9adeb91.png)

除了特别注意签名的原始内容之外，还要注意签名界面上发起签名的网页地址是正确的网页地址。

对于一些比较复杂的交易，也要注意签名内容是否正确，比如在 opensea 升级之后，会重点显示签名的原始信息，需要核实签名的信息和当前设置的价格是否一致，以及合约地址等信息，当然重点也要关注发起签名的网页地址是否是官方地址。

![](https://storage.googleapis.com/papyrus_images/586b27f2d170b7f6e5b2ab3979146bb32ff5a6483ffaa3ddcc0b2b7cd45a16ee.png)

所以在签名的过程中，应该反复确认签名的网页发起地址和签名内容，而对于不能确认的网页地址或者域名，或者出现了自己不能确认的签名内容，千万不要确认签名。

**签名的工具**

在 coinlist 验证优先队列的时候，需要对一段特定的文字进行签名，并提交签名结果，遇到这样的场景，推荐使用 myetherwallet 进行签名和验签，具体使用方法如下：

1、访问 [https://www.myetherwallet.com/](https://www.myetherwallet.com/)，选择 “Access my wallet”

![](https://storage.googleapis.com/papyrus_images/bed7c5b5856cad2fa76099c86f7cbf3d66245e239fe58ac1df677aca14387d10.png)

2、选择 "Browser Extension", 选择该项使用浏览器钱包，选择小狐狸钱包

![](https://storage.googleapis.com/papyrus_images/cfcdcfefc642ede17f1f9341593f60bc0d0ba0cd4f5d46338ec19a2d315106af.png)

3、进入 dashboard 之后，找到左边菜单栏的 “Message” 菜单，这里提供了签名和验签的功能

![](https://storage.googleapis.com/papyrus_images/c334950840d2cc96476d3f34d4fa8c8325533e506236fc8fb0f60c242084cdee.png)

4、点击 “Sign message”，使用签名功能，输入一段文字信息，如 “I love Web3Eye” ，点击 “Sign” 按钮会调用小狐狸钱包，对签名的内容进行确认，然后点击 “签名按钮完成签名” 。

![](https://storage.googleapis.com/papyrus_images/37afd90d98a8448a27859b60b54e57551b8d8f4d43b8f137441d023d010991ae.png)

5、在跳转的页面中便可以看到签名的返回结果，“sig” 字段便是对原始信息 “I love Web3Eye” 签名之后的信息。

![](https://storage.googleapis.com/papyrus_images/fddc921ecd6ebf5428a2811d611aad507aa69171fa567bbf61b99cdf4c2d49d4.png)

6、复制签名信息，可到 “Verify Message” 中进行验签

![](https://storage.googleapis.com/papyrus_images/2b35a5efedb7182aeb7922f02565f0f906f1b3b3e4a514591a36c18d9bf86aa8.png)

除此之外，etherscan 也提供了签名和验签的功能，我们也可以把上面的签名结果拿去 etherscan 进行验证。

1、访问 [https://etherscan.io/verifiedSignatures](https://etherscan.io/verifiedSignatures)，选择 “Verify Signature” 按钮，依照上面的签名信息分别填入地址，签名原始信息和签名信息（ sig 字段中的信息，注意在 etherscan 中使用需要加上 0x 的前缀）

![](https://storage.googleapis.com/papyrus_images/47813a813e113b060af84750d5aca86c6873f2fb3eb8a305dce3116d4163b02e.png)

2、点击 “continue” 之后便可查看签名结果，注意这里默认选择不对外发布签名信息，这样你签名的信息只有你自己看到，如果选择下面的 “verify & publish ...” 便会将签名信息发布出去，别人也能访问到。

![](https://storage.googleapis.com/papyrus_images/f66b4637daa444a8933cf92f8900fc5f08968719246b7ec09994fc03da008216.png)

如果你替换签名的信息或者地址，便不能通过验证签名，即使只是改变原始消息的大小写也不能通过验证。

![](https://storage.googleapis.com/papyrus_images/d6d13f4679ba090cc091fa41eb1339da1a4ffe93f61dd02a2671c1f54625054f.png)

3、点击 “Sign Message” 按钮，可以连接钱包之后，输入原始信息进行签名，该过程和 myetherwallet 类似，大家可以体验一下，这里不再赘述。

至此，我们已对签名有初步的了解和认知，并能使用一些工具进行签名和验签，当然，这已经能帮助我们完成一些工作了，但如果要在抢跑过程中用代码实现签名交易，自动发送交易还需要有更深入的学习和了解，在后面的小节中我们再详细讲解。

**关于我们**

[Web3Eye](https://twitter.com/Web3EyeLabs) 是一个专注于技术研究和分享的 Web3 加密技术社区，团队拥有多年区块链研发经验和安全技术能力，以帮助更多人安全地进入 Web3 世界，欢迎关注我们的 [Twitter 帐号](https://twitter.com/Web3EyeLabs)，了解最新动态。

---

*Originally published on [web3eye.eth](https://paragraph.com/@web3eye/2)*
