我在 C# 中有一个基本的加密功能,用于加密和存储游戏的保存文件,它使用用户的用户名和游戏网站的密码。最近我意识到,如果用户要更改他们的密码,这将导致他们的保存变得无法访问,因为它是用他们的旧密码加密的。所以,我正在尝试构建一个 PHP 函数,以便在他们更新密码时“重新转换”他们的保存。不幸的是,问题在于 C# 使用字节数组执行散列,而 PHP 使用字符串,我不知道如何协调两者。这是一般过程:
- 哈希用户名(到字节数组)
- 哈希密码(成字节数组)
- 连接用户名 + 密码哈希(成两倍长的字节数组)
- 哈希结果获取密钥(返回到 256 位长度)
- 使用密钥逐字节 xor 文件以获取加密文件
我不确定如何在 PHP 中实现这一点。我最初试图使用unpack('C*', hash("sha256", $thing_to_be_hashed, false))
,但这似乎没有产生正确的字节数组。然后我尝试了这个:
$new_key = hash("sha256", hash("sha256", $username, false) . hash("sha256", $newpass, false), false);
$old_key = hash("sha256", hash("sha256", $username, false) . hash("sha256", $oldpass, false), false);
$conversion_key = array();
for($i = 0; $i < strlen($new_key); ++$i) {
$conversion_key[] = $old_key[$i] ^ $new_key[$i];
// this part with the array is a bit wonky, I know, but it didn't seem like
// it would have worked anyway since I was xor'ing things like 'f' and '3'
// instead of bytes like '23' and '57'.
}
$file_contents = file_get_contents("savefile.sav");
for($i = 0; $i < strlen($file_contents); ++$i) {
$file_contents[$i] = $file_contents[$i] ^ $conversion_key[$i % count($conversion_key)]; // I read somewhere I can access $file_contents like this to get bytes
}
不幸的是,这两种方法在任何阶段都不起作用(以前的 unpack 方法即使在散列的第一阶段也没有产生正确的字节数组,我也不确定我是否在第二阶段正确地将它们放回字符串中)。将不胜感激我能得到的任何帮助。谢谢!
编辑:我unpack()
想到不会给我正确的字节数组,因为它实际上是在解码字符串;所以我想我的主要问题首先是“我如何将返回的十六进制转换hash()
为字节数组?” 其次“我将如何散列这些字节数组?” (推论“将字节数组转换回十六进制字符串并对它们进行散列就足够了吗?”)