# 以太坊的几种签名类型的区别和使用场景

By [chenjia404](https://paragraph.com/@chenjia404) · 2023-07-06

---

以太坊目前主要有3种签名类型，分别是:eth\_sign, personal\_sign, eth\_signTypedData

**eth\_sign**

这个是所有链上交易的签名方式，他的实现逻辑是把一个交易信息 rlp 编码后，然后再进行一次keccak256哈希，最后对这个哈希进行签名。

这个签名类型有个特点，签名的内容是哈希，无法确定内容，有一种攻击方法就是让用户使用这个方法签名内容，达到攻击的效果。由于这个安全问题，小狐狸 metamask 默认禁用了这个方法，需要开启才可以，而且会有很明确的安全风险提醒。

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

在打开eth\_sign后(方法我这里不就说，避免大家开启)，我们提交一个签名测试看看效果

![eth_sign](https://storage.googleapis.com/papyrus_images/7faf14c66c3f62b25032db313901cfdbdbbfec59ce7b39c81e48bf2096fec9df.png)

eth\_sign

这个签名我想大家都看不出来是什么内容吧，攻击场景就是利用的这个。

**personal\_sign**

因为第一种签名的不安全，就诞生了eip-191，实现了第二种签名personal\_sign。personal\_sign很多时候使用的场景是身份确认，例如我持有这个钱包，我拿什么给别人证明我持有，签名第一种方法也是的，但是第二种就可以直接签名一段文本，签名的时候明确的知道签名的内容是什么。

![personal_sign](https://storage.googleapis.com/papyrus_images/743aadbabd4e1656356acdc00bb9c977ab3c77d3489901d0dfbcfd9d1dd0992e.png)

personal\_sign

这里就能很安全的看得出来签名内容，做一些消息验证场景就很实用，尤其是很多钱包登录场景。另外就是这里的签名格式是："\\x19Ethereum Signed Message:\\n32" + message，前面加了一些字符串，保证personal\_sign的签名绝对不和 eth\_sign 冲突。

**eth\_signTypedData**

有了第二种签名后，社区又有新的脑洞，personal\_sign签名文本，文本不好解析，没有办法做一些类似授权、转账这种签名，签名可不可以支持更多功能，于是eip-712出现了。

eip-712的签名，实际上是一个格式化的数据，这种签名的消息格式为： "\\x19\\x01" + domainSeparator + structHash

domainSeprator可以指定链、合约地址、协议版本等参数，这样我在eth链签名的数据，在bsc就不能用，解决重放攻击。

![eip-712](https://storage.googleapis.com/papyrus_images/7e168864da73421654aab40c4b15164d3000930b966016c914cfe8f379420cbf.png)

eip-712

这里可以清晰的看清楚授权数量这些，使用门槛很低。

看了签名的科普，就知道那些签名不安全，那些相对安全了，在日常使用避免不安全的签名，以免被攻击。当然签名信息看懂了，也不能保证绝对安全，因为背后的代码逻辑是否正确，已经网站是否被攻击钓鱼等，可能今天是安全了，明天就会变化，实际使用中，一定要确认自己交互的合约地址内容。

code is law

---

*Originally published on [chenjia404](https://paragraph.com/@chenjia404/jQmI62agatPYqJBkl4ox)*
