【问题标题】:What is the PHP equivalent of this JS encrypter code?这个 JS 加密器代码的 PHP 等价物是什么?
【发布时间】:2015-12-26 03:31:31
【问题描述】:

我正在尝试使用 cURL 登录 Steam(不是通过 API,因为它非常有限),但是我在加密密码时遇到了困难。

基本上登录的过程是将用户名发布到https://store.steampowered.com/login/getrsakey

响应如下所示:

{"success":true,"publickey_mod":"D1CBFEDCE654EB68423E9ED9446622DE7F69A0E02523FD04B0650D79074C802A72ACC5D4BEB0AB709886B5A8B7A2813AF1B4C4A03F5C4439221F189B7039DFBEA2558F59B5B00CC53F4578668EF66C2457A90C7A54C518831CC45EA1AC84269C47E1B93A4AAF263429D789DB17FF149DFDEE7270386EDD5BC53B84A78F9AEAA67B8F137EDEC36ED81ED52EB1DD33EEC4EC01675DC044ED974E95A5054E1A33F163411E2F54063534EAE7B12D4607959AB77F36FCFAA299E81E05FABE911A019A13399413593F47A30821DC63A8B11CF40392139E1FE9DE94BD2344586424ABA4A8F1499F1DBC6F8DD2C8DF12A554F891C5D038388017E45A725A54ED1E43211B","publickey_exp":"010001","timestamp":"104490300000","token_gid":"3b54a605fa590d2"}

然后使用此响应,javascript 代码加密密码。

我尝试使用 openssl 和 phpseclib,但没有成功。 Openssl 不接受我的密钥,使用 phpseclib 我不确定是什么问题。

但是我设法找到了处理这个过程的 JS 代码:

var pubKey = RSA.getPublicKey( results.publickey_mod, results.publickey_exp );
var username = this.m_strUsernameCanonical;
var password = form.elements['password'].value;
password = password.replace( /[^\x00-\x7F]/g, '' ); // remove non-standard-ASCII characters
var encryptedPassword = RSA.encrypt( password, pubKey );

完整代码:https://steamstore-a.akamaihd.net/public/shared/javascript/login.js

所以我的最后一个问题是:我怎样才能以最简单的方式在 PHP 中做到这一点?

【问题讨论】:

  • 1.您需要查看here 中的getPublicKeyencrypt,2. 这可能违反TOS,3. 我希望您只是为自己做这件事,因为如果您的服务器正在登录很多人,它看起来就像一个让他们的帐户被暂停并禁止您的服务器 IP 的好方法
  • 我想编写一个基本的蒸汽交易机器人,而不是窃取帐户或类似的东西。由于 SteamGuard(电子邮件/电话身份验证),我什至无法做到这一点。
  • "我怎样才能在 PHP 中以最简单的方式做到这一点?" --- 当然,最简单的方法是雇人。这样你就不需要浪费时间去研究/学习任何东西,我相信这很简单。
  • 可能重复:stackoverflow.com/q/34399817/569976。也就是说,我确实相信这是更好的帖子(即使它被否决了更多)。在上一篇文章中,快速阅读会得出结论,OP(你?)正在尝试在他们的网站上的 JS 中实现 RSA 加密,而这篇文章很明显你没有。
  • Stack Overflow 社区有时让我吃惊。上面的那个人问了一个编程问题并提供了代码,他被彻底贬低了。然而,三分之二的题外话 OpenSSL 问题甚至无法获得 2 或 3 个接近投票(即使它们污染了标签,也几乎从未被否决)。

标签: javascript php openssl steam phpseclib


【解决方案1】:

使用phpseclib v1.0,

<?php
include('Crypt/RSA.php');

$username = 'user';
$password = 'pass';

$ch = curl_init();

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

curl_setopt($ch, CURLOPT_URL, 'https://store.steampowered.com/login/getrsakey/');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
    'donotcache' => time(),
    'username' => $username
));

$result = json_decode(curl_exec($ch));

$rsa = new Crypt_RSA();
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$rsa->loadKey(array(
    'n' => new Math_BigInteger($result->publickey_mod, 16),
    'e' => new Math_BigInteger($result->publickey_exp, 16)
));

$password = base64_encode($rsa->encrypt($password));

curl_setopt($ch, CURLOPT_URL, 'https://store.steampowered.com/login/dologin/');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
    'donotcache' => time(),
    'password' => $password,
    'username' => $username,
    'twofactorcode' => '',
    'emailauth' => '',
    'loginfriendlyname' => '',
    'captchagid' => -1,
    'captcha_text' => '',
    'emailsteamid' => '',
    'rsatimestamp' => $result->timestamp,
    'remember_login' => false
));

$result = json_decode(curl_exec($ch));
var_dump($result);

【讨论】:

  • @user3210615 - 如果你真的很感激 neubert 的帮助,那么你应该投票赞成他的回答。这就是 Stack Overflow 的工作方式(但正如您从反对票中看到的那样,它远非理想)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
相关资源
最近更新 更多