现象
在Eclipse对某数据进行RSA私钥签名(带中文),在Eclipse中运行Tomcat部署的程序中经过RSA公钥对签名进行验证,验证成功;可是独立运行Tomcat再次测试时却验证失败。
分析
- 检查密钥对是否匹配,从动态读取改成硬编码,测试结果:仍然失败;
- 对签名后数据进行Base64的编码解码,URL编码解码,确保中间传输过程没问题,测试结果:仍然失败;
- 尝试调整加密源(纯英文,单个单词,缩小加密字符串长度),纯英文的正常,测试结果:部分红功;
- 对比签名数据,发现两种环境下签名数据都不一致,初步怀疑是source.getBytes()有问题,使用以下代码进行测试,在Eclipse里执行时,结果分别是7和12;而在独立命令行执行时结果分别是7和8
System.out.println("English".getBytes().length);
System.out.println("中文编码".getBytes().length);
解决
Java的getBytes()应该使用的是操做系统的编码,个人操做系统是简体中文的WIN7,中文的话按2个字节算;而Eclipse里执行时,未带任何环境变量,使用的倒是项目的编码UTF-8,中文按3个字节算,致使了最终差别。 经过getBytes("UTF-8")指定编码后,两种环境下测试结果一致,问题解决。