現象
在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")指定編碼後,兩種環境下測試結果一致,問題解決。