如何正确模拟此加密方法为encryptedPwd字段生成正确的值?

2024-10-03 09:20:47 发布

您现在位置:Python中文网/ 问答频道 /正文

背景

我需要每周通过python脚本从Amazon的卖家中心门户为我们的多个客户获取报告。我尽量避免使用webdriver,因为它们在不同的操作系统中具有不一致、容易出错的特性(根据经验)。因此,我认为尝试对sellercentral.amazon.com的登录过程进行反向工程将是一个有趣的小项目(最终可能是徒劳的)。这个过程并不困难,除了初始登录表单中的两个字段:passwordmetadata1。下面将详细讨论password字段。{}字段似乎采用了类似的技术,同时引入了每隔几秒钟更改一次的额外障碍。当我监视metadata1值时,它似乎是使用各种浏览器度量的大型json对象生成的。但是,每次只做一件事,所以我将在这篇文章中重点介绍密码加密,并在以后的文章中担心metadata1

切中要害

表单提交后,password字段中的值将使用本文进一步讨论的技术进行加密。然后,生成的加密值替换密码字段中的值,并重命名字段encryptedPwd

我的发现

到目前为止,我已经回顾了javascript文件并逐步完成了代码序列,并学到了以下内容:

  • 他们正在使用一个专有的SiegeCrypto.js脚本作为主要的加密库(这是亚马逊的安全入口和出口团队)SubtleCrypto作为生成encryptedPwd过程的一部分 -SiegeCrypto首先出现在AuthenticationPortalSigninNA.js中,声明了基本的初始加密定义:
SiegeCrypto.addProfile("AuthenticationPortalSigninNA", {
  "password": {dataType: "AuthPortalSigninPasswordNA", requiresTail: false},
});
...
SiegeCrypto.addDataType({
    "dataTypeId": "AuthPortalSigninPasswordNA",
    "jwkPublicKey": {"kty":"RSA","e":"AQAB","n":"gXXZV1VqZ6k_uQtyJNJy5q-qvKdqrXJNgKUO1aYc1UPBVqlhCP0GPxf-0GSo-LEtArgcbF8-j6_vSLSqztYxxF8og--rB8zAyZ8DXZaugX-UiJDQnoJL_HtXKuwIm9U7oEPoeD6H4ZDcfbsPj77xVn7UA2-a90N4aZqMC8EIfXIy1tqSbSPnxPOaiEmy8xGtG-L3RdCyc7TL0Swd_f0_DjRT6ip91IBlCmquoa-xJgZ9e44PVH4AwdyssiV4ZLEZ5yFcE0zcRb_62kx_TQptidbJ4nHocFVjmUW9YsrAWeKrBmOGZEjO4vbATYs1Yf4vgcH7Ix61EPR5sbDP4SlBWQ"},
    "providerId": "si:md5",
    "keyId": "56d14edce8e2cb6c6842c59ddaee426e"
});

通过代码,我能够找到算法的更多细节

*profile* (used by SiegeCrypto)
- password: {dataType: "AuthPortalSigninPasswordNA", requiresTail: false}
*publicKeyProvider* (added as a DataType to SiegeCrypto)
- keyId: 56d14edce8e2cb6c6842c59ddaee426e
- providerId: si:md5
*wrapKey*
- wrappingAlgorithm
  - name: RSA-OAEP
  - hash: SHA-256
  - modulusLength: 2048
  - publicExponent: [1, 0, 1]
*Additional Fields*
name: aes_128_gcm_iv12_tag16
encryption: AES-GCM
ivLength: 12
keyLength: 128
tagLength: 128

在随后的过程中,我能够找到以下内容,我假设这些参数是根据上面的加密规范处理的,但我不知道如何达到这一点

cipherMessage: Uint8Array(413) [1, 128, 0, 20, 124, 132, 165, 153, 149, 96, 94, 4, 210, ...]
messageHeader:
- algorithmId: 20
- contentType: 2
- encryptedDataKeys: [{"keyInfo": "56d14edce8e2cb6c6842c59ddaee426e"}]
- encryptionContext: {}
- frameLength: 12
- headerIvLength: 12
- messageId: Uint8Array(16) [124, 132, 165, 153, 149, 96, ...]
- type: 128
- version: 1

查看Amazon的AWS加密SDK(Python Repo),我发现以下三个部分似乎正是我所需要的。然而,我不确定从这里走到哪里

# algorithm, mode, data_key_length, iv_length, auth_length, auth_key_length=0
EncryptionSuite.AES_128_GCM_IV12_TAG16 = (algorithms.AES, modes.GCM, 16, 12, 16)

# algorithm_id,  encryption, message_format_version
AlgorithmSuite.AES_128_GCM_IV12_TAG16 = (0x0014, EncryptionSuite.AES_128_GCM_IV12_TAG16, 0x01)

# encryption_type, algorithm, padding_type, padding_algorithm, padding_mgf
WrappingAlgorithm.RSA_OAEP_SHA256_MGF1 = (EncryptionType.ASYMMETRIC, rsa, padding.OAEP, hashes.SHA256, padding.MGF1)

问题

有没有人能提供一个利用上述加密技术的简短python代码段以及一个解释,这样我就可以看到encryptedPwd字段值是如何生成的?这里有一个虚拟密码可以演示:bullazon123

上述伪密码的两个示例值为encryptedPwd(我在看到一致性的地方添加了空格):

AYAAF  P/a2u8yLSNjLWzPRIi0Bac  AAAABAAZzaTptZDUAIDU2ZDE0ZWRjZThlMmNiNmM2ODQyYzU5ZGRhZWU0MjZlAQ  Brthm+db6k/Oo832X/5U+JtXcBrVnCetjOnvcypG5ZZ6xZr0rXDDMctQevThwGjGYqOOQTy6tFALgMHnjWC2bcBBtyKMhUflpCjGTRodjE7btdqrgExEr07k1ErejaQ1vAW8hQSedfsQR3gyWxJcKKlQ91B4CYO5UMMJzevQyln0SASh5MLW6xOHMnjwdHI8aKFw2ErcvIFg5OpqCDSIyPjifvxkSTue7gJ3fB0ACda04EA5wxmkRteCF753kVGYNBD0h9eOHCPcCm/Y7bWoJAelvqu/U/LxAPkl216deDko4oxjVqLeRy/IExbx6cdEDT7zu0U7HROhvstu8TZE1f  AgAAAAAMAAAADAAAAAAAAAAAAAAAA  O0Gt/txLoiiXlGQcb5dyFn/////  AAAAAQAAAAAAAAAAAAAAAQAAAAv  LEJ4zlnbivrzliBrcFGIsPBU3srfmTu91dw4=
AYAAF  L1E3ydr57mIKpAQtOrAPsE  AAAABAAZzaTptZDUAIDU2ZDE0ZWRjZThlMmNiNmM2ODQyYzU5ZGRhZWU0MjZlAQ  AUJX+8tRKZESh1o09BLe6Qj13iuyP5Kb2IC/ipA1mRlWIQtIYApU8792+f5U2x8wv7rTVHcKM8wnFXP2I78PCbo4kXwV5Q6JE99bV4BP+5YnzB1YI6XUgrZ2ubm1wcSV3W1K3OhMogcXIbWjeEjKj2WmpVgSgCXKS6+Z6GxMnE+hArZlNIATYojL7IlLPR5kiGzN4pq86gLzGbfcG2at1MNQ5DdrJtktixLJPU1oFwCtT4AFfy6kiGfoepN+VE0AK0ysMyX3FY7QaI9qLtuA20zQX52NbLzG/qSENYohHzgvOOVzCIr4uwyJ3uXSA0kKXEJ4IbWmQ+k30cotoWRSJW  AgAAAAAMAAAADAAAAAAAAAAAAAAAA  NUNRLibdfG4P1ac0dL8Ka//////  AAAAAQAAAAAAAAAAAAAAAQAAAAv  4vyjW2MLIuuBm8D1c41v5ZwEQFk8k/p4GOss=

通过分析添加附加源代码

主要负责生成metadata1字段的javascript文件可以在here中找到。我已经解密了我看到的函数,它们是metadata1生成过程的一部分。它们从以下几行开始:

  • 1827(与encryptedPwd相关)将加密事件侦听器添加到表单提交操作中
  • 332调度加密步骤的核心生成函数
  • 789及;810创建用于生成
  • 1839计算校验和(用于metadata1过程)
  • 2540是返回metadata1值的位置(第332行)
  • 2672和2704是我注意到电子邮件被转换为十六进制值的地方,在加密之前,它被前缀为metadata1内容

Tags: 密码表单过程passwordrsaalgorithmlengthaes