项目上需要用到数字签名,原本是简单的服务器签名,客户端验签的流程。因为ios端没有找到比较好的验签库,故根据网传的步骤实现验签,但死活验签不成功,折腾了半天。
网上的验签流程:
数字签名的技术流程描述如下:
发送方使用摘要算法对原文HASH生成信息摘要;
发送方使用自己的私钥对信息摘要进行签名(加密);
发送方将原文本身和已签名的信息摘要一起发送出去;
接收方使用相同的摘要算法对接收的原文本身生成新的信息摘要;
接收方使用发送方的公钥对已签名的信息摘要进行验签(解密),获得信息发送者的信息摘要;
接收方比较这两个信息摘要是否相同,如果相同则确认信息发送者的身份和信息没有被修改过;否则,则表示被修改过。
流程没有问题,但是摘要算法是如何处理的并没有说清楚,我一直以为是简单的hash处理。但其实不是,这里其实用了两步,第一步利用摘要算法进行hash,第二步对hash添加对应算法的算法标识符,这样得到加密前的原文。举个RSA-SHA256
的栗子:123456
的SHA256的hash是8D969EEF6ECAD3C29A3A629280E686CF0C3F5D5A86AFF3CA12020C923ADC6C92
,但这个并不能直接用于rsa加密,需要加上SHA256的前缀3031300d060960864801650304020105000420
即3031300d0609608648016503040201050004208D969EEF6ECAD3C29A3A629280E686CF0C3F5D5A86AFF3CA12020C923ADC6C92
,这样才能加密后的签名才是正确的签名。
不同算法的前缀参考rfc3447