String.getBytes()陷阱

現象

在Eclipse對某數據進行RSA私鑰簽名(帶中文),在Eclipse中運行Tomcat部署的程序中經過RSA公鑰對簽名進行驗證,驗證成功;可是獨立運行Tomcat再次測試時卻驗證失敗。

分析

  1. 檢查密鑰對是否匹配,從動態讀取改成硬編碼,測試結果:仍然失敗;
  2. 對簽名後數據進行Base64的編碼解碼,URL編碼解碼,確保中間傳輸過程沒問題,測試結果:仍然失敗;
  3. 嘗試調整加密源(純英文,單個單詞,縮小加密字符串長度),純英文的正常,測試結果:部分紅功;
  4. 對比簽名數據,發現兩種環境下簽名數據都不一致,初步懷疑是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")指定編碼後,兩種環境下測試結果一致,問題解決。
相關文章
相關標籤/搜索