2012-06-26 43 views
0

現在,我不知道這是否是我做錯了,或者說多數民衆贊成在DynamoDB發生..字符串最初字節數組有時髦值

基本上而言,我建立一個簡單的註冊/登錄系統,將用戶數據/密碼保存在使用RIPEMD160密碼哈希的DynamoDB實例中,並使用C#的RNGCryptoServiceProvider()進行鹽析。

註冊似乎工作得很好。問題出在登錄時,不管密碼是什麼,密碼都不匹配,而且我認爲它是因爲我在從DynamoDB中抽取hash/salt時遇到了一些時髦的字符。首先,哈希和salt都是長度爲20的字節數組,並在保存到數據庫之前轉換爲字符串。

這些例子複製/發電機Web界面

Example Hash: ">�Bb.ŧ�E���d��Ʀ" 
Example Salt: "`���!�!�Hb�m�}e�" 

當他們回來粘貼和我調試成拉回從發電機的數據功能,這兩個字符串有不同的字符(VS2010調試):

Returned Hash: "u001B>�Bb.ŧ�E��u0003�d�u001C�Ʀ" 
Returned Salt: "`���!u000B�!�Hb�u001Dmu0012�u0001}e�" 

似乎這些u001B,u000B,u001D,u0012,U0003,u001C和U0001是潛入返回的數據,我不能完全肯定怎麼回事?

回答

0

您不應該試圖首先以這種方式將不透明的二進制數據轉換爲字符串。他們不是文字所以不要這樣對待他們。你只是乞求以這種方式丟失信息。

在將數據放入數據庫之前,使用Convert.ToBase64String(data)而不是Encoding.GetString。當您再次拿出它時,請使用Convert.FromBase64String來檢索原始二進制數據。

另外,不要將數據存儲在文本字段開始 - 使用的是意味着存儲二進制數據的數據庫字段類型...

+2

關於最後一個音符,亞馬遜DynamoDB具有文本/號碼/只有這些屬性的集合。他沒有選擇。 –

+0

使用convert將原始數據轉換爲Base64字符串,然後將其作爲字符串存儲在一個發電機行中,然後使用convert將其轉換回來是一種很好的解決方法,因爲發電機不支持二進制數據類型。 – sungiant