上礼拜有人对接支付回调,对方要求用 RSA 验签,他本地没装环境,想找个在线工具先算一组测试数据看看对不对,问我哪个靠谱。临时验证能用,但有个前提得先说清楚。

在线 RSA 工具的用法都差不多,先生成或者粘贴一对公私钥,把明文丢进框里,选 PKCS1 还是 OAEP 填充,点加密就出密文,填上私钥点解密拿回原文。看着很方便,坑也全在这儿。

密钥粘贴到别人网站的那一刻就泄了

RSA 的整套安全都压在私钥上,私钥一旦离开你的机器,就等于把保险箱钥匙拍照发给了陌生人。真只是验证算法对不对,用工具自带生成的那种测试密钥就行,别拿生产环境的私钥去试。要验证自己的密钥,本地装个命令行的 openssl 或者用代码跑,一样快。

填充方式和密钥格式对不上就报错

最常见的报错是解密失败或者填充错误,八成是填充模式不匹配。签名用 PKCS1 v1.5,新一点的要求 OAEP,两边得说好用同一套。密钥格式也有讲究,PKCS8 带一段头尾标记,PKCS1 没有,粘错格式工具直接提示解析不了,拿文本编辑器看一眼头一行就知道了。

还有个高频坑是明文长度超限。RSA 一把密钥能加密的明文长度是有上限的,1024 位密钥大致也就一百来字节,超了就报错。要加密长内容,正确做法是拿 RSA 加密一个对称密钥,再用对称密钥加密正文,这叫混合加密,工具里的长文本模式多半就是这么处理的。

  • 只是学算法:在线工具随便用,跑通流程即可
  • 验证自己密钥:本地 openssl 或写个脚本,别上传私钥
  • 对接生产接口:全程在代码里做,公共网站一律不用

本地验证也不难,装好命令行工具,一行生成密钥对,一行加密,一行解密,把业务方的公钥和自己的私钥分别代进去跑两遍,加解都通再上线。要是解密出来是乱码,先看一眼编码,把中文转成通用编码再送进去,八成就出在这步。再顺手把公钥指纹记下来,上线前跟对方核对一遍,比事后排错省事多了。

一句话:在线工具就当草稿纸,跑通概念可以,涉及真实密钥和真实数据的,一律挪回本地。