2012-09-29 56 views
1

不幸的是,我有一些代碼,這是否:System.Text.Encoding.Default和密碼加密

  byte[] plainText = System.Text.Encoding.ASCII.GetBytes(ClearText); 
      var btcipherText = enc.Encrypt(plainText, btkey); 
      System.Text.Encoding en = System.Text.Encoding.Default; 
      return en.GetString(btcipherText); 

然後保存到數據庫用戶的密碼。

在單聲道,在Ubuntu 12.04上,System.Text.Encoding.Default是System.Text.Encoding.UTF8,而在Windows 7上,它似乎是System.Text.SBCSCodePageEncoding

的密碼加密/解密代碼不應該被使用System.Text.Encoding.Default,但這是繼承代碼。看着System.Text.Encoding,並廣泛地搜索了我的問題,我無法確定如何使用標準編碼解碼此字符串,並且在這種情況下,在缺少原始編碼的Mono/Linux堆棧上。

我也奇怪未能找到System.Text.SBCSCodePageEncoding

當我嘗試解密存儲這個編碼字符串,我得到了一貫的「壞數據」太多的信息和「無效塊大小」加密例外。

的任何信息或建議讚賞。

+1

的問題是,現在有使用SBCSCodePageEncoding編碼數據,而當我對其進行解碼,我也沒有明顯的選擇。 – dwerner

+0

現有數據作爲字符串存儲在數據庫中,因此編碼是我的問題。 – dwerner

+0

也許我只是不太清楚,因爲我需要了解我的情況。我仍然讚賞這一努力。然後使用默認編碼(上面的返回值)將加密後創建的byte []編碼爲字符串,並將其存儲在varchar字段中。所以當它被讀取時,它具有該編碼。當它被解碼回一個字節[]時,它使用編碼來做到這一點。是的,我現在可以正確地存儲字符串,比如說使用你的方法或者UTF8Encoding,但是現有的生產數據已經被該頁面代碼廢話編碼了。 – dwerner

回答

1

建立在對方的回答,因爲你知道這限制了集編碼被用來字節[]轉換爲字符串,建立一個實用程序(或將其打造成爲應用程序,以便密碼升級,因爲它們使用),將密碼讀取並解碼回有效字節[],然後將字節[]作爲Base64存儲在數據庫中。

我看到你也考慮哈希密碼,在這種情況下,以及幾乎任何其他情況下,如果你處理的字節[],其實並不代表文本,你需要存儲/顯示爲字符,然後base64總是一個不錯的選擇。

如果您決定哈希密碼確保您使用HMAC風格散列系統,而不僅僅是一個簡單的密碼+鹽,甚至更好搶.NET中bcrypt執行。

http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

0

在這種情況下,我會做一個應用程序,將解密所有密碼形式的數據庫,它們與UTF8編碼加密和更新數據庫。然後將原始代碼更改爲UTF8。

+0

將隨機數據編碼爲UTF-8可能會失敗。 –

+0

是的,不幸的是,它確實失敗。 – dwerner