一場關於 .net core 和 .net framework 編碼的案情分析

案情背景

  目前公司作新項目,基本全部新項目都是用.net core來作,舊項目一半仍是基於 .net framework下面,一半已經遷移到了core平臺。在作新項目的時候,有個功能須要對接到舊項目那邊的接口,功能也不復雜,就是對接接口的參數須要經過簽名,而後進行MD5加密傳輸過去,舊項目那邊也有相同的簽名和加密方式,用來檢驗參數的正確性,聽起來其實就是一種很簡單傳統的簽名驗證方式,卻由於 「.net core 和 .net framework 下面編碼不一樣」 致使走了不少彎路
在傳參過程當中,一直收到舊項目接口返回的「簽名錯誤」的提示,剛開始覺得是二者對應的簽名方法不一致,但通過同事確認,簽名方法是直接複製過來的,絕對沒錯(雖然我仍是不信ㄟ( ▔, ▔ )ㄏ),爲了證實他的結論是錯的,我毅然在 .net framework下面建了個項目,而後一樣的代碼copy過去,當我run起來後,內心原本想能夠美滋滋的過去扇他一嘴巴子。結果簽名經過了,接口調用成功,這讓我非常惆悵啊.........linux

肇事方法

  回頭整理下,整個過程當中,排除了業務方法後,最終最只有這個MD5加密的方法程序員

     /// <summary>
     /// MD5加密
     /// </summary>
     /// <param name="password"></param>
     /// <returns></returns>
     public static string MD5Encrypt(string context)
     {
         var bytes = Encoding.Default.GetBytes(context);
         var md5Str = MD5.Create().ComputeHash(bytes);
         return BitConverter.ToString(md5Str).Replace("-", "");
     }

而後我把這個方法單獨拿出來在兩個平臺上測試,發現結果確實不同,內心莫名有種興奮感,接下來定位到 Encoding.Default.GetBytes 這個方法,因而再測試了一次docker

這是.net core下面的結果ide

這是.net framework下面的結果測試

尋找真相

  發現到這裏,個人第一反應實際上是這樣的編碼

  接下來,百度和stackoverflow查一下,找不到答案,問了幾個羣,也沒人遇到過。而後拿出了殺手鐗,我親愛的谷歌,可能提問方式不對,愣是找不到答案。最後,沒辦法了,是時候發揮一個程序員的精神了,咱本身看下源碼吧,方正.net都是開源的。加密

第一步,看下.net core下面 Encoding.Default 這個對象的源碼

  能夠看到,.net core下面 Encoding.Default 默認就是獲取了UTF8Encoding這個編碼的spa

第二步,看下.net core下面 .net framework這個對象的源碼

  能夠看到,.net framework 是也有UTF8Encoding這個編碼的,可是確是須要當  代碼頁標識符 爲65001的時候纔會命中(65001具體表示什麼,等下再說到),這樣看,難道是他們兩個默認的 代碼頁標識符 不同,瞬間感受離真相愈來愈近了.net

第三步,看下他們的默認CodePage

.net framework 3d

.net core

soga~~~果真不同,因而查了下96365001對應的編碼類型

  這下就清晰了,雖然一樣都是用 Encoding.Default 的方法,可是因爲.net framework 下面默認的是963(GB2312)的,.net core 下面是65001(UTF-8)的,因此纔會致使至關的方法,跑出了不一樣的結果。

解決問題  

  知道緣由了就好辦了,因爲舊系統的接口以前也會其餘系統在對接,因此舊系統那邊的簽名是改不了的,只能改新的這邊,因而只要在.net core 把 Encoding.Default 改做 Encoding.GetEncoding(「GB2312」),統一編碼就能夠了,而後興高采烈的run起來,結果竟然報錯了,又一次被尷尬到,原來是.NET Core默認不支持GB2312了,因此須要在Starup.cs的Configure方法中加入Encoding.RegisterProvider(CodePagesEncodingProvider.Instance),就這樣妥妥的跑穩了。

 

  

 

  好了,感受是否是有點標題黨,哈哈,其實就是想和你們分享下,也但願你們在.net core 上面遇到的問題也能分享下,可能只是個細節的問題,一樣能幫助別人少才坑。

  而後順便跟還在用.net framework的朋友說下,能夠 穩穩地轉.net core 了,我已經兩年沒寫過文章了,這兩年來一直在學,在用.net core ,在生產環境中已經穩穩的跑過.net core了,並且是在docker裏面,並且是在k8s裏面(固然linux和window上的就更不用說了)

相關文章
相關標籤/搜索