2012-02-03 75 views
4

這裏是我的方法:產生爲什麼RNGCryptoServiceProvider值始終以等號結束?

public static string GenerateRandomString(int bytes) 
{ 
    var rng = new RNGCryptoServiceProvider(); 
    var randomBytes = new byte[bytes]; 
    rng.GetBytes(randomBytes); 
    return Convert.ToBase64String(randomBytes); 
} 

每個值:

即:

Qcr6OgNxkGzVebNl00Dtk7yCaz64owUx7pKEhl1Ogn4= 
IGFLQB0OrReDB3P6nuZgqZIkTwTtch9Fk3Rx/DL4CgI= 
UAJwLwIPYEJ9SzMAK/EMiUJ/DHhmfy6UVMM5MU6Dcpg= 

始終以 「=」 結束 - 這是爲什麼?

我發送這個密碼重置電子郵件的隨機字符串,並與微軟Outlook有問題不在鏈接的結尾=。有沒有人知道一個解決方法,而不是簡單地切斷字符串的最後一個字符?

+2

記住 - RNGCryptoServiceProvider沒有返回字符串;它是一系列字節 - '='是base 64編碼的一個方面;運行它通過維基百科http://en.wikipedia.org/wiki/Base64 – 2012-02-03 16:49:56

回答

10

它與返回的字節數有關。該=用作base64的填充。

EDIT

使用你的算法我生成1個20字節之間使用字符串,打印每行1個結果。正如你所看到的,一些字符串以相同的符號結尾,而另一些則不是。

Ng== 
HAo= 
g+h1 
pdR+cQ== 
z5bFWwc= 
BilTQWCU 
kXo96Jilxw== 
7jc16UHgbGc= 
DnLzoSDUNVfQ 
6MwGWLD3ZcbfZA== 
hADhg4HFdMVi1n0= 
cWm2HEKs48VaoYgl 
TrwxX20FmEs7o8u2ag== 
WLORuUzewYDB18XFAcc= 
tSnvFVVm/NZ2tkXJnB6V 
McUWf0mAmM5/0Upu+eYd+w== 
Eln3QPMr2VjXt4e3GsZuOXo= 
DBYLTG3fDbMC5I1bnYmG/NxH 
KgGhxdZjmjUypsqnbQUMCJzVrQ== 
yI+3sFdzBX4Xfb2u6xuzQdS9II0= 

編輯#2

我意識到,我解釋了爲什麼會出現=,但從來沒有提出另一種方式來生成您的網址參數。其中一種方法是將字節數組轉換爲友好的網址格式的System.Web.HttpServerUtility.UrlTokenEncode()方法。要將字符串轉換回字節數組,請使用System.Web.HttpServerUtility.UrlTokenDecode()方法。

+0

有趣的是,我只是用我自己的代碼做了同樣的事情。在想我可能應該提到我傳遞給該方法的內容。我以前通過_32_。通過_33_擺脫等號。根據@Andras Zoltan提供的維基百科鏈接,這對我來說很有意義。謝謝! – SlimCharles 2012-02-03 17:18:36

相關問題