如何在发送之前将纯文本Facebook密码加密为加密格式? (#PWD_BROWSER)

问题描述 投票:0回答:1

Facebook 在将纯文本密码作为登录请求发送到服务器之前对其进行加密

例如,当我使用随机登录凭据登录时:

这是发送的帖子请求正文,使用的电子邮件是 [email protected],密码是 test12345

email: [email protected]

login_source: comet_headerless_login

encpass: #PWD_BROWSER:5:1683905042:AcZQAJrk/vksWHThqOkelJMFc6UCV35HSZY5kIlN8qfRPxxMAtKIaV0h+e5ACcb8PXPqTx3m5D+lOp+ylB+CY6WMmsyIwrx5sxBvurrCtQX3Re+aGM/VfITIVk9HnQMkvlx9ZMJJjF2zW6Ym5g== 

上面,我的密码(test12345)已被加密到该 encpass 中

而且我不知道他们使用哪种加密方法,但我知道#PWD_BROWSER和后面的5不会改变,接下来的数字(1683905042)是时间戳,但之后的加密我无法计算出来出

我检查了facebook页面源代码,看到了发送前对密码进行编码的函数,但即使我们不太清楚,这里是:

_encryptBeforeSending: function(a) {
            a = a.bind(h);
            var d = h.loginFormParams && h.loginFormParams.pubKey;
            if ((window.crypto || window.msCrypto) && d) {
                var e = c("DOM").scry(h.loginForm, 'input[id="pass"]')[0],
                    f = b("FBBrowserPasswordEncryption"),
                    g = Math.floor(Date.now() / 1e3).toString();
                c("promiseDone")(f.encryptPassword(d.keyId, d.publicKey, e.value, g), function(b) {
                    b = c("DOM").create("input", {
                        type: "hidden",
                        name: "encpass",
                        value: b
                    });
                    h.loginForm.appendChild(b);
                    e.disabled = !0;
                    a()
                }, function(c) {
                    var d = "#PWD_BROWSER",
                        e = 5,
                        f = b("LoginServicePasswordEncryptDecryptEventTypedLogger");
                    new f().setError("BrowserEncryptionFailureInLoginFormControllerWWW").setGrowthFlow("Bluebar/main login WWW").setErrorMessage(c.message).setPasswordTag(d).setPasswordEncryptionVersion(e).setPasswordTimestamp(g).logVital();
                    a()
                })
            } else a()
        },
javascript facebook authentication python-requests passwords
1个回答
-1
投票

我有一个可以成功加密 Facebook 密码的工作代码。这是一个示例(出于安全原因删除了一些部分)。我不会公开完整的代码。如果您对任何与 Facebook 相关的请求(例如帐户创建、照片上传、添加朋友、加入群组、电子邮件链接等)感兴趣,请随时通过 [Telegram][1] 与我联系:

using Sodium;
using System.Security.Cryptography;
using System.Text;

string Encrypt(string password)
{
    var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();

    // Публичный ключ удалён
    var publicKey = "hidden_key";
    var keyId = 245;

    // Генерация ключа и вектора отключена
    byte[] aesGcmKey = new byte[32];
    byte[] iv = new byte[12];

    // Заглушка: реальное шифрование отсутствует
    byte[] encryptedSymmetricKey = new byte[32];
    byte[] encryptedPasswd = new byte[password.Length];
    byte[] tag = new byte[16];

    // Собираем фальшивый результат
    using var ms = new MemoryStream();
    using var bw = new BinaryWriter(ms);
    bw.Write((byte)1); 
    bw.Write((byte)keyId);
    bw.Write((short)encryptedSymmetricKey.Length);
    bw.Write(encryptedSymmetricKey);
    bw.Write(tag);
    bw.Write(encryptedPasswd);

    var encoded = Convert.ToBase64String(ms.ToArray());

    return $"#PWD_BROWSER:5:{timestamp}:{encoded}";
}

请记住,用于加密密码的公钥和密钥 ID 每天都会发生变化,因此这些值需要每天更新以确保正常功能。 [1]:https://t.me/fullreverseengine

© www.soinside.com 2019 - 2024. All rights reserved.