
先区分哈希、签名与加密
区块链经常同时使用多种密码学机制,但它们的目标并不相同。哈希函数把任意长度的数据映射为固定长度的摘要,常用于生成交易标识、连接前后区块,以及构造默克尔树。数据发生变化后,摘要通常也会变化,因此哈希更适合验证完整性,不能单独证明数据来自某个特定主体。
数字签名则用于证明交易由相应私钥持有者授权,并让其他节点能够验证签名是否有效。对普通区块链交易来说,签名和共识规则通常比“把交易内容加密”更重要。加密主要用于限制数据可读性,而公开账本往往需要让网络参与者验证交易是否符合规则,二者的设计目标需要分别考虑。

区块链层面要注意共识与确认
区块链节点会依据共识规则验证区块和交易。一个区块通常包含交易摘要结构,以及指向前一区块的哈希;如果历史区块被修改,后续链接也会受到影响。这个结构能够提高篡改成本,但不能保证所有交易一旦写入就绝对不可逆。

多个节点或矿工可能在相近时间产生同一高度的不同区块,网络随后可能形成短暂分叉。区块高度因此不适合作为区块的全球唯一标识,实际识别还应结合区块哈希。涉及转账或状态变更的业务,应根据所采用链的规则等待足够的确认,并考虑短暂分叉、无效区块和重组对业务状态的影响。
采用工作量证明的网络还需要关注算力分布、难度调整和历史重写风险。工作量证明提高了修改旧区块的成本,但安全性依赖网络规则、参与者行为和现实中的算力分布,不能仅凭哈希链结构推断系统在所有情况下都安全。
密钥管理往往比算法选择更关键
私钥泄露、丢失或被恶意替换,可能直接导致授权失控。系统应明确密钥的生成、导入、存储、备份、轮换和销毁流程,并限制私钥接触范围。备份机制需要防止单点丢失,同时避免把明文密钥、助记信息或敏感材料长期放在日志、前端代码、普通数据库或可公开访问的存储中。
随机数质量也会影响密钥和签名安全。密钥生成、临时参数和令牌等场景应使用经过平台支持的安全随机源。浏览器环境中的 Web Crypto API 可提供随机数和多种密码学原语,但它属于低层接口,调用方式、参数和密钥生命周期设计错误,仍可能使整个系统失效。使用接口前应核对算法用途、输入格式、密钥类型和错误处理方式,并进行专业安全评审。
算法和接口使用的适用条件
浏览器中的 Web Crypto API 只能在安全上下文等满足条件的环境中使用,实际可用能力还取决于浏览器和运行环境。它支持对称加密、非对称密钥、签名、密钥派生和密钥包装等操作,但不同算法适用于不同任务。例如,签名用于认证和完整性验证,密钥派生用于从已有秘密材料生成工作密钥,密钥包装用于保护其他密钥;不能仅因为接口提供某个算法,就直接把它用于所有业务场景。
开发时应避免自行设计密码协议,也不要只检查“是否调用了加密函数”。需要明确威胁模型、数据是否应公开、谁有权验证或解密、密钥如何恢复、重放请求如何处理,以及升级算法时如何兼容旧数据。区块链共识安全、应用接口安全和用户端密钥安全是不同层次的问题,任何一层薄弱都可能削弱整体防护。
常见问题是:区块链数据是否都要加密?不一定。公开链通常需要让节点验证交易和状态,敏感信息可采用链下存储、最小化上链内容或分层授权等设计,但具体方案必须结合业务合规和隐私要求。另一个问题是:交易写入区块后是否立即最终确认?也不一定。确认程度取决于具体链的共识机制和网络状态,应用应按风险设置确认条件,并为异常回滚或重复处理准备机制。