以太坊的几种签名类型的区别和使用场景
以太坊目前主要有3种签名类型,分别是:eth_sign, personal_sign, eth_signTypedData
eth_sign
这个是所有链上交易的签名方式,他的实现逻辑是把一个交易信息 rlp 编码后,然后再进行一次keccak256哈希,最后对这个哈希进行签名。
这个签名类型有个特点,签名的内容是哈希,无法确定内容,有一种攻击方法就是让用户使用这个方法签名内容,达到攻击的效果。由于这个安全问题,小狐狸 metamask 默认禁用了这个方法,需要开启才可以,而且会有很明确的安全风险提醒。
在打开eth_sign后(方法我这里不就说,避免大家开启),我们提交一个签名测试看看效果
这个签名我想大家都看不出来是什么内容吧,攻击场景就是利用的这个。
personal_sign
因为第一种签名的不安全,就诞生了eip-191,实现了第二种签名personal_sign。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就不能用,解决重放攻击。
这里可以清晰的看清楚授权数量这些,使用门槛很低。
看了签名的科普,就知道那些签名不安全,那些相对安全了,在日常使用避免不安全的签名,以免被攻击。当然签名信息看懂了,也不能保证绝对安全,因为背后的代码逻辑是否正确,已经网站是否被攻击钓鱼等,可能今天是安全了,明天就会变化,实际使用中,一定要确认自己交互的合约地址内容。
code is law