Atualmente, estou desenvolvendo um novo sistema usando C# em minha organização que requer autenticação em um conjunto existente de credenciais de gestor. Essas credenciais de gestor são armazenadas em uma tábua de banco de dados com a senha já criptografada. Portanto para eu realizar essa autenticação eu precisaria criptografar a senha recebida ou descriptografar a senha do banco de dados usando a mesma criptografia.
O problema que estou enfrentando é que a criptografia usada anteriormente é a livraria de criptografia Codeigniter 3. Porquê é uma livraria e meu conhecimento de PHP não é dos melhores, estou tendo problemas para recriar essa criptografia/descriptografia em C#. Passei qualquer tempo tentando resolver esse problema antes de vir cá. No entanto, ao tentar descriptografar a senha, o programa aquém retorna “HMAC irrito”, o que significa que o HMAC Sua visita nos ajuda a continuar oferecendo o melhor para você! e o HMAC tirado da senha cifrada não correspondem. Ignorar essa verificação gera o erro “O preenchimento é irrito e não pode ser removido”.
Fiz algumas pesquisas sobre esses erros e há duas causas possíveis. Meu processo de descriptografia está incorrecto ou a chave de criptografia (masterKey) usada está errada. No momento, não consigo verificar a chave de criptografia em produção (atualmente usando a chave de criptografia do Sua visita nos ajuda a continuar oferecendo o melhor para você! UAT) devido a restrições, por isso estou me concentrando no meu código por enquanto.
Para reunir o que preciso de ajuda, preciso de ajuda para verificar se minha solução atual em C# pode descriptografar corretamente um texto criptografado usando a livraria de criptografia Codeigniter 3. Por obséquio, encontre meu código aquém.
Atualmente estou tentando descriptografar a senha do banco de dados, mas estou sincero para seguir a rota de criptografia de senha de ingressão, se isso for mais fácil.
Aquém está minha função de descriptografia:
public string Decrypt(string encryptedData)
{
string plainText;
// Decode the base64-encoded data
byte[] decodedData = Convert.FromBase64String(encryptedData);
// Extract HMAC and ciphertext
int hmacLength = 64; // Assuming SHA-512 HMAC
byte[] hmacBytes = new byte[hmacLength];
Array.Copy(decodedData, 0, hmacBytes, 0, hmacLength);
byte[] ciphertextBytes = new byte[decodedData.Length - hmacLength];
Array.Copy(decodedData, hmacLength, ciphertextBytes, 0, ciphertextBytes.Length);
byte[] hmacKey = HKDF(Encoding.UTF8.GetBytes(masterKey), "SHA512", null, 32, "authentication");
// Validate HMAC
using (var hmac = new HMACSHA512(Encoding.UTF8.GetBytes(masterKey)))
result
// Decrypt the ciphertext
byte[] keyBytes = HKDF(Encoding.UTF8.GetBytes(masterKey), "SHA512", null, 32, "encryption");
byte[] iv = new byte[16]; // Assuming a 16-byte IV
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = keyBytes;
aesAlg.IV = iv;
aesAlg.Mode = CipherMode.CBC;
aesAlg.Padding = PaddingMode.PKCS7;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msDecrypt = new MemoryStream(ciphertextBytes))
{
using Sua visita nos ajuda a continuar oferecendo o melhor para você! csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
result
}
}
return plainText;
}
Aquém está a função HKDF:
private static byte[] HKDF(byte[] key, string digestAlgorithm, byte[] salt, int length, string info)
{
using (var hmac = new HMACSHA512(key))
{
hmac.Key = key;
// Initial HMAC
byte[] prk = hmac.ComputeHash((salt ?? Array.Empty()).Concat(Encoding.UTF8.GetBytes(info ?? "")).ToArray());
byte[] outputKey = new byte[length];
int offset = 0;
int blockIndex = 1;
while (offset < length)
{
byte[] block = hmac.ComputeHash(prk.Concat(Encoding.UTF8.GetBytes(info + (char)blockIndex)).ToArray());
Array.Copy(block, 0, outputKey, offset, Math.Min(block.Length, length - offset));
offset += block.Length;
blockIndex++;
}
return outputKey;
}
}
Por último está a função AreEqualConstantTime:
private static bool AreEqualConstantTime(byte[] a, byte[] b)
{
int result = a.Length ^ b.Length;
for (int i = 0; i < a.Length && i < b.Length; i++)
= a[i] ^ b[i];
return result == 0;
}
Nascente código foi criado com base em referência on-line e observando o processo de criptografia/descriptografia do Codeigniter 3.
Tags:
Crédito: Natividade Original