网络安全把关不求人! MetaMask钱包签名前要留神!
MetaMask 是一个非常出名且最多人使用的 EVM (以太坊虚拟机器) 加密数字钱包,相信任何熟悉加密数字领域的人或多或少都有使用过 MetaMask 钱包。 然而,随着越来越多人进入加密数字领域,因此而衍生的数字骗案亦逐渐增多,而因为不熟悉区块链的运作模式,而导致的数字资产被盗的个案,则更是层出不穷。
曾经有朋友就发生过这样的情况,自己明明没有做任何交易,但发现自己钱包内的数字资产被无故转移,他确定助记词并没有洩露给他人,但自己曾多次使用该钱包登入不同网站,参与不同的 dApp 互动等,因此,非常有可能问题就出在签名上。
这次我们就以 MetaMask 为例,来说说关于区块链的三个签名问题。
所谓签名,实际上就是一个身份认证的过程。就如同你去银行提款,银行除了接收你的操作指示以外,还必不可少要进行身份认证,确保你是真正的账户拥有者。银行的身份认证可以是用密码,签名,印章等方式进行。
区块链签名
区块链上的交易亦是如此, 当你进行一个交易时,除了要指示区块链「要做什麽」,还需要进行身份认证,确保你是真正的账户拥有者,才可进行相应操作。 这个身份认证,就是我们所说的「签名」。
签名的具体做法,是使用你保存在区块链钱包(如 MetaMask)中的私钥(Private Key)透过加密演算法,对你发出的指示做数字签署,而这个签署,是可以透过与你的地址公钥(Public Key)比对从而认证确实是你发出的相应指示,而完成认证过程。另外,「签名」这个动作,可以是不需要上链的。在没有网路的情况下亦可进行。
因此,只要拥有一个有效的交易签名,配合对应的交易指令(例如转账),即可正常完成一次交易。
说到这裡,相信聪明的读者都能够看出其中的玄机,在整个过程中交易签名是重中之重。换句话说,骗徒可以伪造一个交易,骗取你的交易签名,然后骗徒便可以凭藉这个签名,执行该伪造交易,从而导致你在莫名其妙的情况下,损失资产。而交易签名洩露,也就是许多数字资产被盗的元凶之一。
Personal Sign - 常见Web3 登入的签署
Personal Sign 可以用于签署一段 UTF-8 编码的文字,使用这种方法,MetaMask会清楚显示被签名的内容 ,这种方式常见于网站登入。
上面我们说到的 OpenSea 登入, 就是使用了 Personal Sign 这个方式。
Eth_Sign - 用户需要提高警觉的签署
ethsign 是 MetaMask 很早期提供的签名方法,这个方法需要传入一个 32 byte 的杂凑数 (Hash) 以供签名,而杂凑数可以是由任何内容得到,因此,仅凭这个无意义的杂凑数,签名者完全不会知道自己正在签署什么内容,这个内容可能是一个交易,一个授权,也可能是网站登入请求,又或者其它任何内容,因此有非常大的风险,现在 MetaMask 已经开始对这类的签名请求弹出红色警告,以警示用家,避免堕入骗局。
噹噹,敲敲钟。 ethsign 是一个非常危险的签名方式,这也是许多骗案所使用的签名方法。 上面我们说到的 OpenSea 登入, 就是使用了 Personal Sign 这个方式。
eth-sign EIP712 Sign - 一种更高级、更安全的交易签名方法
EIP712 Sign是一种更安全的签名标准,这个标准规定了签名数据的结构,也加入了对数据的作用域限制,如 domain,验证合约地址等。
ERC712 签名经常会被用在执行 metatransaction 等合约执行中,例如 OpenSea NFT 上架,降低价格等过程都会出现 EIP712 签名请求。
这个标准的好处是,签名者可以清楚看到自己在签署的内容,很大程度上降低被钓鱼的风险。 但是,这并不等于这种签名是绝对安全的,签名时,一定要看清楚究竟在签署什么内容。
personal-sign 签名示例
Frank 为三种签名都做了一个示例,有兴趣的读者可以去签名示例看看原始码,亲自尝试一下。
https://codesandbox.io/s/xpmnzc?file=/src/App.js
结语
综上所述,绝对不可以认为签名不上链,没有风险。相反,区块链的签名其实可以认为是无所不能,特别是使用 ethsign 的方式弹出的签名,无论是开发团队还是个人都要加倍小心。
https://www.ud.hk/sc/thoughtleader/article/blockchain-security-metamask-wallet-3-signature-mechanisms?continueFlag=529289e313e26f755adab658f2a28254
Frank Shi
UD区块链技术主管
.拥有深入层面区块链技术知识
.致力研究及参与区块链项目开发及Web3 应用未来发展