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

sergionscarvalho@gmail.com




Enviar um comentário