关于 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”,我认为他是示例作者。不幸的是,我无法改变这一点。