2014-11-25 3 views
0

Я хочу сохранить пароль, зашифрованный в локальной базе данных (на телефоне Windows). Для этого мне сначала нужно зашифровать пароль.Шифрование паролей UTF8 Кодирование Преобразование строк не работает

byte[] passwordInByte = UTF8Encoding.UTF8.GetBytes(clearPW); 
byte[] protectedPasswordByte = ProtectedData.Protect(passwordInByte, null); 
return UTF8Encoding.UTF8.GetString(protectedPasswordByte, 0, protectedPasswordByte.Length); 

Когда я использую это я получаю encyrpted пароль, как это:

«\ 0 賐 ᔁ ᇑ 窌 쀀쉏  \ 0 쐮 毸 䉯 놜 侫 䅛  \ 0 \ 0 \ 0 \ 0 昐 \ 0À \ 0 \ 0⎛ 폳띪 ꌾ ၜ ჸ 㸴 뀲 േ Ɦ 賂 ۈ 䎳 姒 \ 0 \ 0 耎 \ 0Ȁ \ 0 \ 0tƽ 팃 ல  쿄  갗 ꪄ᫓ \ 0 ꒱ ௴ 贒 ⊡ ​​噷 ʥ 魚 @ \ 0 챞 Ċ 뽨뒸  縉 菒 Æ ≁ ᦹ 諻 ⋤ 떵 孵 ר 춳 ɝ⍔ ɝ⍔ ɝ⍔ ɝ⍔ ɝ⍔ ɝ⍔ И защищенный парольPasswordByte имеет длина 230 байтов.

Моя функция дешифрования выглядит следующим образом:

byte[] encryptedBytes = UTF8Encoding.UTF8.GetBytes(encrytpedPW); 
byte[] passwordByte = ProtectedData.Unprotect(encryptedBytes, null); 
return UTF8Encoding.UTF8.GetString(passwordByte, 0, passwordByte.Length); 

Теперь массив enycrptedBytes является длиной 290 байт и пароль не может быть даже расшифрован, потому что Unprotect функция вызывает ошибку «Неверные данные»

Но все прекрасно работает в случае, если я использую функцию Convert.BaseString64 так:

шифрование:

byte[] passwordInByte = UTF8Encoding.UTF8.GetBytes(clearPW); 
byte[] protectedPasswordByte = ProtectedData.Protect(passwordInByte, null); 
return Convert.ToBase64String(protectedPasswordByte, 0, protectedPasswordByte.Length); 

дешифрования:

byte[] encryptedBytes = Convert.FromBase64String(encrytpedPW); 
byte[] passwordByte = ProtectedData.Unprotect(encryptedBytes, null); 
return UTF8Encoding.UTF8.GetString(passwordByte, 0, passwordByte.Length); 

ли кто-нибудь из вас есть идея, что это так неправильно о кодировке UTF8? Потому что первым способом является рекомендованный MSDN.

ответ

3

Только не делайте этого:

return UTF8Encoding.UTF8.GetString(protectedPasswordByte, 0, protectedPasswordByte.Length); 

Во-первых, я настоятельно советую использовать Encoding.UTF8 вместо UTF8Encoding.UTF8, для ясности. Это не решит проблему, но это хорошая привычка входить - свойство UTF8 объявлено на Encoding, а не UTF8Encoding, так что яснее это признать.

Основная проблема заключается в том, что у вас просто нет текстовых данных. Вы не должны использовать Encoding.GetString, когда вы получаете двоичные данные, это не регулярные кодированные текстовые данные. У вас есть произвольные двоичные данные, которые не представляют текст (пока он не расшифрован).

Base64 точно предназначен для представления любых двоичных данных в ASCII-тексте - так что вы не в конечном итоге потерь данных из-за двоичные данные, которые просто не имеют какое-либо «прямое» текстовое представление в любом кодировки вы решили использовать. Вы должны использовать Base64 - или hex или что-то подобное - в любое время, когда вы хотите кодировать произвольные двоичные данные в виде текста.

+0

Извините. Unicode был всего лишь одной попыткой, и ошибка также произошла (как вы упомянули) в случае UTF8. Я изменяю его в вопросе. – Kn0rK3

Смежные вопросы