我怎样才能正确地模仿这种加密方法来为 encryptedPwd 字段生成正确的值?

Posted

技术标签:

【中文标题】我怎样才能正确地模仿这种加密方法来为 encryptedPwd 字段生成正确的值?【英文标题】:How can I properly mimic this encryption method to produce the proper value for the encryptedPwd field? 【发布时间】:2021-07-12 08:01:59 【问题描述】:

背景

我需要通过 python 脚本每周从亚马逊的卖家中心门户为我们的多个客户提取报告。我尽量避免使用 webdriver,因为它们在不同的操作系统中不一致、容易出错(根据经验)。因此,我认为尝试对 Sellercentral.amazon.com 的登录过程进行逆向工程将是一个有趣的小项目(也许最终会徒劳无功)。这个过程并不难,除了初始登录表单中的两个字段:passwordmetadata1password 字段将在下面详细讨论。 metadata1 字段似乎采用了类似的技术,同时引入了每隔几秒更改一次的额外障碍。当我监视metadata1 值时,它似乎是使用各种浏览器指标的大型 json 对象生成的。但是,一次只做一件事,所以我将在这篇文章中专注于密码加密,并在以后的文章中关注metadata1

切入正题 

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

我的发现

到目前为止,我一直在查看 javascript 文件并逐步执行代码序列,并了解了以下内容:

他们使用专有的 SiegeCrypto.js 脚本作为主要加密库(Siege 是亚马逊的安全入口和出口团队)和 SubtleCrypto 作为生成加密密码的过程的一部分 - 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

查看亚马逊的 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 sn-p 以及解释,所以我可以看到encryptedPwd 字段值是如何生成的?这是一个用于演示的虚拟密码:Blamazon123

上述虚拟密码的两个示例值为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 创建用于生成的 crcTable 1839 计算校验和(用于metadata1 进程) 2540 是返回 metadata1 值的位置(从第 332 行开始) 2672 和 2704 是我注意到电子邮件被转换为十六进制值的地方,该值在加密之前以 metadata1 内容为前缀

【问题讨论】:

Here 某种日志记录来获取kindle的信息,所以它可能会有所帮助。 那些看起来很像 JWT 令牌,请参阅 jwt.io。字符串 jwkPublicKey 也强烈暗示了 JWT。 我怀疑 metadata1 对象将是至关重要的;它几乎肯定是用来防止自动登录的。它的使用方式可能与验证码的工作方式相同:增加人们与浏览器交互的信心。 【参考方案1】:

metadata1 在 XXTEA 中加密。我编写了一个 Python 脚本来解码和编码metadata1。这可以找到here。

【讨论】:

以上是关于我怎样才能正确地模仿这种加密方法来为 encryptedPwd 字段生成正确的值?的主要内容,如果未能解决你的问题,请参考以下文章

怎样学好英语和语文?

我怎样才能正确地进行非主动/主动约束?

我怎样才能正确地重写网址?

我怎样才能正确地评价这个 PHP 代码? [关闭]

我怎样才能正确地让 SKLabelNode 跟随物理的身体?

iOS - 从 ios 应用程序以加密形式将信用卡/借记卡存储在服务器上,然后再次从应用程序解密。我怎样才能最安全地管理它?