美文网首页合约安全
合约安全:替换tx.origin,使用ECDSA签名确定调用源的

合约安全:替换tx.origin,使用ECDSA签名确定调用源的

作者: 梁帆 | 来源:发表于2023-03-21 18:12 被阅读0次

在智能合约中,确保调用源的身份验证是很重要的,因为它可以帮助防止一些恶意操作,比如合约中的重要逻辑被未经授权的用户调用。我们知道tx.origin是一个不安全的做法,容易遭受到“中间人攻击”。但有时候,msg.sender的作用又相当局限,那么除了tx.origin,有没有其他的办法可以比较方便地追溯到调用源的身份呢?

其实可以使用ECDSA签名。调用者可以使用其私钥对交易进行签名,合约可以验证签名以确定调用者的身份。这种方法需要调用者拥有相应的私钥,因此可能不适用于所有情况。

好的,下面是一个简单的Solidity代码示例,使用ECDSA签名来验证调用者身份:

pragma solidity ^0.8.0;

contract SignatureVerification {
    function verify(bytes32 message, bytes memory signature) public view returns (bool) {
        address signer = recoverSigner(message, signature);
        return signer == msg.sender;
    }
    
    function recoverSigner(bytes32 message, bytes memory signature) public pure returns (address) {
        require(signature.length == 65, "Invalid signature length");

        bytes32 r;
        bytes32 s;
        uint8 v;

        assembly {
            r := mload(add(signature, 32))
            s := mload(add(signature, 64))
            v := and(mload(add(signature, 65)), 255)
        }

        if (v < 27) {
            v += 27;
        }

        require(v == 27 || v == 28, "Invalid signature v value");

        return ecrecover(message, v, r, s);
    }
}

在这个示例中,verify函数接受一个消息message和一个签名signature作为参数,然后使用recoverSigner函数从签名中恢复出签名者的地址,并将其与当前调用者的地址进行比较。如果两个地址匹配,verify函数将返回true,否则返回false。

可以通过在 Remix IDE 上部署和测试这个示例合约来进一步了解和测试它。在测试时,需要先对消息进行签名,然后将消息和签名作为参数传递给verify函数,如果返回值为true,则表示调用者的身份验证成功。

相关文章

  • 比特币架构简述之签名

    来源bitcoin wiki比特币使用椭圆曲线 数字签名算法(ECDSA)来签署交易。对于ECDSA,使用http...

  • golang中crypto/ecdsa包

    ECDSA和DSA一样也是用于数字签名,同样在go使用上也很类似,RSA、DSA和ECDSA三者的签名的区别,可以...

  • RSA与ECC的选择

    数字签名技术已经广泛使用于网络安全协议或分布式系统中,目前比较流行的数字签名算法有RSA和ECDSA。很多同学在产...

  • NEO多方签名合约源代码分析

    要建立一个多方签名合约,首先需要再gui中填入最小签名数量和公钥列表。点击确定后调用代码如下: 这里首先会获取签名...

  • Solidity中的常用变量

    tx.origin 和 msg.sender tx.origin遍历整个调用栈,返回最初的调用者地址msg.sen...

  • 一个数字引发的探索——ECDSA解析

    FISCO BCOS交易签名算法基于ECDSA原理进行设计,ECDSA也是比特币和以太坊采用的交易签名算法。本文介...

  • 区块链签名

    ecdsa签名 Schnorr签名Schnorr与聚合签名.jpg 群签名环签名(没有管理员的群签名)盲签名

  • 密码学系列 - 签名

    签名是用于消息的认证,保证该条消息不被伪造。本文主要讨论RSA签名、DSA、ECDSA 和 Schnorr 签名...

  • 合约安全:tx.origin的被钓鱼风险

    Solidity 中有一个全局变量,tx.origin,它遍历整个调用栈并返回最初发送调用(或交易)的帐户的地址。...

  • ECDSA短信签名

    短信所发送的字节有限,一般为140字节左右,若对短信进行签名,会导致短信利用率降低,故短信签名的过程中,签名的长度...

网友评论

    本文标题:合约安全:替换tx.origin,使用ECDSA签名确定调用源的

    本文链接:https://www.haomeiwen.com/subject/hqimrdtx.html