首页 > 解决方案 > 在 php 中获得与 Rfc2898DeriveBytes 在 c# 中给出的相同响应

问题描述

这是我的 C# 代码,但我想在 PHP 中使用相同的加密字符串。你能以任何方式帮助我吗?

var token ="MqsXexqpYRUNAHR_lHkPRic1g1BYhH6bFNVPagEkuaL8Mf80l_tOirhThQYIbfWYErgu4bDwl-7brVhXTWnJNQ2";
var id = "bob@company.com";
var ssokey = "7MpszrQpO95p7H";
string idAndKey = id + ssokey;


var salt = HttpServerUtility.UrlTokenDecode(token);


var pbkdf2 = new Rfc2898DeriveBytes(idAndKey, salt) {IterationCount = 1000};
var key = HttpServerUtility.UrlTokenEncode(pbkdf2.GetBytes(24));
//key = aE1k9-djZ66WbUATqdHbWyJzskMI5ABS0;

我的 PHP 代码是:

function base64url_encode($data) {
 return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function base64url_decode($data) {
  return base64_decode(str_pad(strtr($data, '-_', '+/'),strlen($data) % 4, '=', STR_PAD_RIGHT));
}
$token = "MqsXexqpYRUNAHR_lHkPRic1g1BYhH6bFNVPagEkuaL8Mf80l_tOirhThQYIbfWYErgu4bDwl-7brVhXTWnJNQ2";
$id = "bob@company.com";
$ssokey = "7MpszrQpO95p7H";

$idAndKey = $id.$ssokey;
$salt = base64_decode(base64url_decode($token));

$pbkdf2 = openssl_pbkdf2($idAndKey,$salt,20,1000);
$key = base64url_encode(base64_encode($pbkdf2));

//should produce key = aE1k9-djZ66WbUATqdHbWyJzskMI5ABS0
echo "key = ".$key; exit;

它应该给予aE1k9-djZ66WbUATqdHbWyJzskMI5ABS0,但产生方式不同。

任何帮助表示赞赏。

标签: php.net

解决方案


$idandKey = "bob@company.com" . "7MpszrQpO95p7H";
$salt = convertFromUrlTokenFormat("MqsXexqpYRUNAHR_lHkPRic1g1BYhH6bFNVPagEkuaL8Mf80l_tOirhThQYIbfWYErgu4bDwl-7brVhXTWnJNQ2");
$hash = hash_pbkdf2("sha1", $idandKey, base64_decode($salt), 1000, 24, true);
$key = convertToUrlTokenFormat(base64_encode($hash));
// key = “aE1k9-djZ66WbUATqdHbWyJzskMI5ABS0”;


function convertToUrlTokenFormat($val){
   $padding = substr_count($val, '=');
   $val = str_replace('=', '', $val);
   $val .= $padding;
   $val = str_replace('+', '-', str_replace('/', '_', $val));

   return $val;
}


function convertFromUrlTokenFormat($val){
   $val = str_replace('-', '+', str_replace('_', '/', $val));
   $lastCharacter = substr($val, -1);
   $val = substr($val, 0, -1);
   switch($lastCharacter){
     case 1:
        $val = $val . "=";
      break;
     case 2:
        $val = $val . "==";
      break;
 }

   return $val;
}

推荐阅读