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()
},
我有一个可以成功加密 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