SO上已经有一些有用的问题:
然而,我仍然对我的特定情况感到困难。
我尝试了各种方法,但最终出现了错误"The IV parameter must be as long as the blocksize"
或文本与结果哈希不匹配。
我不理解加密的足够多以弄清楚我做错了什么。
这是php版本:
$pass = 'hello';
$salt = 'application-salt';
echo Encrypt('hello', 'application-salt');
function Encrypt($pass, $salt)
{
$derived = PBKDF1($pass, $salt, 100, 16);
$key = bin2hex(substr($derived, 0, 8));
$iv = bin2hex(substr($derived, 8, 8));
return mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $pass, MCRYPT_MODE_CBC, $iv);
}
function PBKDF1($pass, $salt, $count, $dklen)
{
$t = $pass.$salt;
$t = sha1($t, true);
for($i=2; $i <= $count; $i++)
{
$t = sha1($t, true);
}
$t = substr($t,0,$dklen-1);
return $t;
}
以下是 C# 版本:
Console.WriteLine(Encrypt("hello", "application-salt"));
// output: "Hk4he+qKGsO5BcL2HDtbkA=="
public static string Encrypt(string clearText, string Password)
{
byte[] clearData = System.Text.Encoding.Unicode.GetBytes(clearText);
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
MemoryStream ms = new MemoryStream();
Rijndael alg = Rijndael.Create();
alg.Key = pdb.GetBytes(32);
alg.IV = pdb.GetBytes(16);
CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(clearData, 0, clearData.Length);
cs.Close();
byte[] encryptedData = ms.ToArray();
return Convert.ToBase64String(encryptedData);
}
我希望能够在一个新的基于php的应用程序中验证用户登录,并与现有的C#应用程序通信到同一MySQL数据库。我打算加密密码并将结果哈希与存储在数据库中的哈希进行比较以进行身份验证。
非常感谢任何指导。
编辑:
我意识到在C#函数中,
PasswordDeriveBytes
被调用并传递了一个字节数组作为参数,而在PHP版本中我没有类似的东西。我发现这来自Codeproject示例,而ASCII中的字节数组拼写为“Ivan Medvedev”,我认为他是示例作者。不幸的是我不能改变这个。