php - 在 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
,但产生方式不同。
任何帮助表示赞赏。
解决方案
$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;
}
推荐阅读
- javascript - 使用字符串引用导入的模块
- reactjs - DatePicker 在初始状态下显示 fromat/custom 消息
- authentication - 尝试使用 UiPath Orchestrator 的智能卡远程启动机器人时出错
- create-react-app - 是否可以在不弹出的情况下将 devextreme 与 create-react-app 一起使用?
- selenium - 在我的移动应用程序的 appium 中找不到任何元素
- scala - 如何在 Akka 中限制发送给 IO(Tcp) 角色的消息
- angular - Angular Cli:带有水平分隔线的图表
- python - Pandas - 查找行的空列并在一列中更新
- excel - 根据先前列中的下拉列表使列成为强制性列
- python - Py4JJavaError 运行 Pyspark 程序