Konwersja typów

0

Witam wszystkich forumowiczów :-)

Piszę prostą aplikację wyciągającą pewne dane z SQL.
Wszystko fajnie działa ale dane do połączenia z SQL zapisane są w pliku .ini
razem z hasłem, chciałbym to hasło zaszyfrować , do tego celu chce użyć DPAPI.
No i tutaj zaczynają się schody:

dane do pliku i z pliku pobieram w postaci string.
ProtectedData.* pracuje na byte[]

chciałbym zaszyfrowane dane zapisać w pliku ale nie w formie binarnej tylko w stringu odpowiadającym hexom czy np

653a7d2c114f66a134d2.....

jak mam to przerobić? :(

byte[] zaszyfrowane = ProtectedData.Protect(Encoding.Unicode.GetBytes(textBox2.Text), 
                                 klucz,DataProtectionScope.CurrentUser);

file.Write("SQL", "HASH", Encoding.ASCII.GetString(zaszyfrowane));
0

ehh... to udało mi się rozwiązać, ale mam inne pytanie.

Macie jakieś doświadczenia z DPAPI?
bo teraz wyskakuje mi Exception z komunikatem:

Nie można zaktualizować hasła. Podana wartość nowego hasła nie spełnia wymagań domeny dotyczących długości, złożoności lub historii hasła.

Nie wiem skąd on sobie stworzył jakieś aktualizacje hasła , może lepiej do zaszyfrowania tego hasła skorzystać z czegoś innego?

Pozdrawiam
-S-X-

0

Nie wiem jak odkodowywujesz, swoja droga powinno byc konsekwentnie zamiast Encoding.ASCII.GetString to Encoding.Unicode.GetString albo od razu userowi powiedziec ze nie ma ASCII. U mnie dziala, co prawda zauwazylem dziwna rzecz: tej przestrzeni nazw nie wykrywa MSVC 2005 nawet po dodaniu przestrzeni nazw (teoretycznie powinno od .NET 2.0) ale z lini komend z csc dziala ... (musze sprawdzic na innym sprzecie bo to mnie zdziwilo ...)

reasumujac, system mnie nie prosil o nic takiego przy wywolaniu Protect/Unprotect. Moze daj cos wiecej co generuje twoj blad (np zapakuj to w minimalna wersje konsolowa i jeden plik cs).

0

Już wiem w czym był problem, biblioteka do obsługi INI z której korzystam
ma ograniczony ciąg znaków jaki można zapisać/odczytać, dlatego Unprotect
trafiał nie cały ciąg i powodował taki błąd ;/

no trudno ... przechodze na rejestr windy :)

Pozdrawiam
-S-X-

0

a co do szyfrowania to ja sprobowalbym DES:

using System.IO;
using System.Security.Cryptography;

   public static string Crypt(string s_Data, string s_Password, bool b_Encrypt)
    {
        byte[] u8_Salt = new byte[] { 0x26, 0x19, 0x81, 0x4E, 0xA0, 0x6D, 0x95, 0x34, 0x26, 0x75, 0x64, 0x05, 0xF6 };
        PasswordDeriveBytes i_Pass = new PasswordDeriveBytes(s_Password, u8_Salt);
        Rijndael i_Alg = Rijndael.Create();
        i_Alg.Key = i_Pass.GetBytes(32);
        i_Alg.IV = i_Pass.GetBytes(16);
        ICryptoTransform i_Trans = (b_Encrypt) ? i_Alg.CreateEncryptor() : i_Alg.CreateDecryptor();
        MemoryStream i_Mem = new MemoryStream();
        CryptoStream i_Crypt = new CryptoStream(i_Mem, i_Trans, CryptoStreamMode.Write);
        byte[] u8_Data;
        if (b_Encrypt) u8_Data = Encoding.Unicode.GetBytes(s_Data);
        else u8_Data = Convert.FromBase64String(s_Data);
        try
        {
            i_Crypt.Write(u8_Data, 0, u8_Data.Length);
            i_Crypt.Close();
        }
        catch { return null; }
        if (b_Encrypt) return Convert.ToBase64String(i_Mem.ToArray());
        else return Encoding.Unicode.GetString(i_Mem.ToArray());
    }

Pozdrawiam
Mariusz

1 użytkowników online, w tym zalogowanych: 0, gości: 1