Mais links

As imagens deste blog são alojadas por HostImage - Serviço gratuíto

Encriptar password com o Rijndael em .NET

Precisei de encriptar as password de uma aplicação ASP.NET que estou a desenvolver, inicialmente estava apenas a aplica hash com o SHA1, porque pensei que já não ia precisar de desencriptar, mas depois pediram-me que a funcionalidade de lembrar password enviasse por correio a mesma password e não uma nova, qu era o que estava a fazer.

Então apliquei o algoritom Rijndael em C++.net.

Método para encriptar:

// Encripta password recebida por parametro
String^ ExtranetClientes::Utilizadores::Config::EncriptarPassword(String^ pPassword)
{
// Recebe a password em texto por parametro
String^ plainText = pPassword;

// Utiliza a passPhrase e o saltValue para criar uma Chave
String^ passPhrase = "Passpr@se"; // qq String
String^ saltValue = "sa7tVgl6e"; // qq String

String^ hashAlgorithm = "SHA1"; // SHA1 ou MD5
int passwordIterations = 2; // qq numero, nao é preciso mais de 2
String^ initVector = "@1B2h5F6g7H8f2D2"; // tem que ter 16 bytes
int keySize = 256;

//Converte as String para array de Bytes
array<Byte>^ initVectorBytes = Encoding::ASCII->GetBytes(initVector);
array<Byte>^ saltValueBytes = Encoding::ASCII->GetBytes(saltValue);

// Converte a password descriptada em array de bytes
array<Byte>^ plainTextBytes = Encoding::UTF8->GetBytes(plainText);

// Cria uma password de onde a Key da incriptae7e3o deriva
// A password e9 gerada atrave9s da passPhrase da do saltValue
// Esta password e9 gerado com o hash que passamos (neste caso) SAH1
// com duas iterae7f5es para uma maior segurane7a, mais do que 2 e9 exagerado
PasswordDeriveBytes^ password = gcnew PasswordDeriveBytes(
passPhrase,
saltValueBytes,
hashAlgorithm,
passwordIterations);

// Usa a password gerada para criar uma Key de ecriptae7e3o
// com o tamanho especificado em Bytes
array<Byte>^ keyBytes = password->GetBytes(keySize / 8);

// Instancia um objecto Rijndael
RijndaelManaged^ symmetricKey = gcnew RijndaelManaged();

// Modo de encriptae7e3o em Cipher Block Chaining (CBC).
symmetricKey->Mode = CipherMode::CBC;

// Criar um ecriptador a partir da Key gerada anteriormente e do IV
// Initialization Vector
ICryptoTransform^ encryptor = symmetricKey->CreateEncryptor(
keyBytes,
initVectorBytes);

// Define o memory stream que vai guardar a informae7e3o encriptada.
MemoryStream^ memoryStream = gcnew MemoryStream();

// Define uma stream cryptographic (usar modo Write para encriptae7e3o).
CryptoStream^ cryptoStream = gcnew CryptoStream(memoryStream,
encryptor,
CryptoStreamMode::Write);
// Inicia a encriptae7e3o.
cryptoStream->Write(plainTextBytes, 0, plainTextBytes->Length);

// Finaliza a encriptae7e3o.
cryptoStream->FlushFinalBlock();

// Converta a informae7e3o encriptada de uma memory stram para um array de Bytes
array<Byte>^ cipherTextBytes = memoryStream->ToArray();

// Fecha os streams.
memoryStream->Close();
cryptoStream->Close();

// Converte a informae7e3o encriptada numa String 64
String^ cipherText = Convert::ToBase64String(cipherTextBytes);

// Retorn a informae7e3o encriptada.
return cipherText;
}
E aqui fica o método para desencriptar:
/ Desencripta password recebida por parametro
String^ ExtranetClientes::Utilizadores::Config::DesencriptarPassword(String^ pPasswordEncriptada)
{
//Password encriptada recebida por parametro
String^ cipherText = pPasswordEncriptada;

// Utiliza a passPhrase e o saltValue para criar uma Chave
String^ passPhrase = "Passpr@se"; // qq String
String^ saltValue = "sa7tVgl6e"; // qq String

String^ hashAlgorithm = "SHA1"; // SHA1 ou MD5
int passwordIterations = 2; // qq numero, nao e9 preciso mais de 2
String^ initVector = "@1B2h5F6g7H8f2D2"; // tem que ter 16 bytes
int keySize = 256;


//Converte as String para array de Bytes
array<Byte>^ initVectorBytes = Encoding::ASCII->GetBytes(initVector);
array<Byte>^ saltValueBytes = Encoding::ASCII->GetBytes(saltValue);

//Converte a password encriptada para array de bytes
array<Byte>^ cipherTextBytes = Convert::FromBase64String(cipherText);

// Cria uma password de onde a Key da incriptae7e3o deriva
// A password e9 gerada atrave9s da passPhrase da do saltValue
// Esta password e9 gerado com o hash que passamos (neste caso) SAH1
// com duas iterae7f5es para uma maior segurane7a, mais do que 2 e9 exagerado
PasswordDeriveBytes^ password = gcnew PasswordDeriveBytes(
passPhrase,
saltValueBytes,
hashAlgorithm,
passwordIterations);

// Usa a password gerada para criar uma Key de ecriptae7e3o
// com o tamanho especificado em Bytes
array<Byte>^ keyBytes = password->GetBytes(keySize / 8);

// Instancia um objecto Rijndael
RijndaelManaged^ symmetricKey = gcnew RijndaelManaged();

// Modo de encriptae7e3o em Cipher Block Chaining (CBC).
symmetricKey->Mode = CipherMode::CBC;

// Criar um desencriptador a partir da Key gerada anteriormente e do IV
// Initialization Vector
ICryptoTransform^ decryptor = symmetricKey->CreateDecryptor(
keyBytes,
initVectorBytes);

// Define o memory stream que vai guardar a informae7e3o encriptada.
MemoryStream^ memoryStream = gcnew MemoryStream(cipherTextBytes);

// Define uma stream cryptographic (usar modo Read para desencriptae7e3o).
CryptoStream^ cryptoStream = gcnew CryptoStream(memoryStream,
decryptor,
CryptoStreamMode::Read);

// Neste momento nao sabemos o tamanho da informae7e3o desencriptada
// pelo que criamos o buffer com o tamanho do texto encriptado, porque
// o tamanho do texto desencriptado nunca e9 maior do que o texto encriptado
array<Byte>^ plainTextBytes = gcnew array<Byte>(cipherTextBytes->Length);

// Inicia a desencriptae7e3o
int decryptedByteCount = cryptoStream->Read(plainTextBytes,
0,
plainTextBytes->Length);

// Fecha os streams.
memoryStream->Close();
cryptoStream->Close();

// Converte a informae7e3o desencriptada em String
String^ plainText = Encoding::UTF8->GetString(plainTextBytes,
0,
decryptedByteCount);

// Retorna a informae7e3o desencriptada.
return plainText;


Entra no Fórum PapaPosts

0 comentários