[Solidity][区块链安全入门]Solidity语言关于密码学知识的运用以及存在漏洞
密码学
区块链通过密码学算法想要实现的性质有:机密性 完整性 身份认证和不可否认性
对称密钥算法:通过安全的方式或者信道去共享加密密钥 但是没有解决不可否认性,意味着所有拥有密钥的人都能加密 每当有成员离开时,密钥需要进行更新
常见的对称密码算法:
公钥密码算法&非对称密钥算法
每个用户都有公私钥对
常见算法
散列函数
根据消息内容得出唯一的 有固定长度输出值的函数 如SHA-1 SHA-2 MD5 等,通常又称杂凑算法
可以用于数字签名和文件校验等,只能单向运算
数字签名的两个明显作用:向接收方保证信息来自声明的发送者 且过程中不可否认;向接收方保证传输过程中不会被改变
同态加密:在不透露出元数据的情况下,对同态加密的数据处理后再将输出进行解密,与元数据按照同一方法进行运算的结果是一样的
代数同态:既是加法又是乘法同态 算术同态:同时满足加减乘除四种同态
同态加密是一种公钥加密算法 能够让密文拥有计算功能 无需解密就能直接对密文进行处理,使用同态加密可以让智能合约能够处理密文,但无法获得真实数据,极大提高隐私安全性
零知识证明:
证明这可以在不向验证者提供更多有用信息的情况下,使验证者相信某个论断是正确的。如用户注册密码的保存 向实习公司提供未挂科证明却并未看到成绩 用公私钥验证身份等
在区块链的世界中,用地址来表示交易双方,这样达到了匿名的作用。然而,链上的信息虽然是匿名的,但是通过链上信息绑定的链下信息,像很多交易所都绑定了链上地址与链下的银行账户、支付宝,这样可以很方便的追溯真实世界的交易双方,使得匿名性荡然无存。
那么,有没有一种方法,能够在隐藏发送方、接受方以及交易金额等其他细节的情况下,保证交易有效呢?
答案就是:零知识证明
通过利用零知识证明机制,可以将交易双方的地址、交易细节隐藏起来。
目前ZCASH(大零币)使用零知识机制来证明交易有效,在ZCASH中,摒弃了之前的UTXO方式,而是使用了一种基于UTXO,被称为NOTE(支票)的新方式代替。NOTE代表了当前账户对资产的支配权,与UTXO不同,账户余额的存储方式不再是“未消费的交易输出”,而是“未被作废的支票(NOTE)”;一个NOTE是由所有者公钥PK、所拥有金额V、和唯一区分支票的序列号r组成,表示为NOTE=(PK, v, r)。
ZCash交易分为两类:透明地址交易和隐藏地址交易。透明地址交易的输入、输出直接是可见的NOTE信息;
隐藏地址交易,输入和/或输出的地址和金额是隐藏的。
在ZCASH的隐藏地址交易中,交易的输入输出不再是明文的NOTE,而是NOTE的签发和废弃通知。如下图:
左侧代表的是“签发的新的NOTE”,右侧代表的是“作废的NOTE”。每次进行转账,就会把转账方的NOTE放到作废列表里,代表此NOTE已经作废,同时为收款方创建一张等额的NOTE。这样就实现了“资产的转移”,并且由于都是记录的NOTE的哈希值,因此并不知道被废弃的和新签发的NOTE的内容,这样就做到了隐藏交易双方及交易细节。
环签名技术(把身份藏进人群里 从而保护签名者) 典型的应用案例 :门罗币
环签名中签名者利用自己的私钥和集合中其他成员的公钥就能独立签名,集合中的其他成员可能不知道自己被包含在内
隐私威胁和保护:
用户身份隐私主要是指交易双方的地址信息:
通常用的方法是混币机制,即将多笔交易混合在一起,切断交易方和接收方的联系。提高加密货币的隐私性和匿名性。
混币过程的执行可以由可信第三方或者某种协议去执行 混币机制也可分为基于中心化节点的混币机制和去中心化的混币机制
网络隐私
分为节点隐私(服务器地理位置,节点物理信息,系统版本,节点IP等)和通信隐私(数据流量,节点间数据明文和密文)
对公有链来说 攻击者可以通过监听,扫描技术对整个网络进行探测攻击
应用隐私:
分为服务器隐私和客户端隐私
主要内容:支付流敏感信息 浏览器cookie,密钥存放位置,
威胁一般不是来自区块链技术本身,而是用户和服务商
服务商暴露隐私的源头主要来自操作不当或者服务漏洞。如服务商授予用户的权限不匹配,服务商公开信息中存在敏感信息,插件中存在漏洞