在客户端页面里面, 提交之前使用电子钥匙的api直接调用电子钥匙里的私钥对数据进行加密和签名, 然后将加密数据和签名生成的摘要发送到服务端.
然后在服务端使用如下代码进行验证:
X509Certificate certificate = CertUtils.getCertificate(ServletActionContext.getRequest());
PublicKey pub = certificate.getPublicKey();
Signature rsa = Signature.getInstance("MD5withRSA");
rsa.initVerify(pub);
rsa.update(encryptMessage.getBytes());
boolean verifies = rsa.verify(signedMessage.getBytes());CertUtils是自己写的一个类, 功能是从request里获取证书. 客户端签名确实用的是MD5 RSA的算法. 但是验证的结果总是false. 请问下这样到底是哪个地方出错了``? 是不是因为加密用的私钥和服务端从request里取到的pubkey不是一对?

解决方案 »

  1.   

    是一对,估计是你验证方法错了吧以前搞过,现在忘了建议你买点PKI的书研究研究
      

  2.   

    要不这样吧,你把签名值、原文和公钥的 Base64 贴出来看看吧。
      

  3.   

    encryptMessage.getBytes()这种做法是很危险的!在 Windows 中默认采用 GB18030 编码进行解码,而在 Linux 的默认情况下是采用 UTF-8 进行解码。
      

  4.   

    >>>bao110908 用来加密和签名的方法因为是封装好的activex控件, 而且接受data的参数是string, 所以我也不知道他们是用哪种编码实现的。 可不可能就是两边使用的编码不同呢··今天本子没带回来没法实验· 我明天白天贴上来看看·谢了·