我怎样才能正确地模仿这种加密方法来为 encryptedPwd 字段生成正确的值?
How can I properly mimic this encryption method to produce the proper value for the encryptedPwd field?
背景
我需要通过 python 脚本每周从亚马逊的卖家中心门户为我们的多个客户提取报告。我尽量避免使用 webdrivers,因为它们在不同操作系统之间不一致、容易出错(根据经验)。因此,我认为尝试对 sellercentral.amazon.com 的登录过程进行逆向工程将是一个有趣的小项目(也许最终是徒劳的)。这个过程并不困难,除了初始登录表单中的两个字段:password
和 metadata1
。 password
字段将在下面详细讨论。 metadata1
字段似乎采用了类似的技术,同时引入了每隔几秒更改一次的额外障碍。当我监视 metadata1
值时,它似乎是使用各种浏览器指标的大型 json 对象生成的。但是,一次一件事,所以我将专注于此 post 中的密码加密,并担心将来 post.
中的 metadata1
进入正题
提交表单后,password
字段中的值将使用下文 post 中进一步讨论的技术进行加密。生成的加密值然后替换密码字段中的值并将该字段重命名为 encryptedPwd
我的发现
到目前为止,我一直在查看 javascript 文件并单步执行代码序列,并了解了以下内容:
- 他们利用专有的 SiegeCrypto.js script as the main cryptographic library (Siege being Amazon's Secure Ingress and Egress Team) & 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 片段以及解释,以便我了解 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
内容为前缀
metadata1
在 XXTEA 中加密。我写了一个 Python 脚本来解码和编码 metadata1
。这可以找到 here.
背景
我需要通过 python 脚本每周从亚马逊的卖家中心门户为我们的多个客户提取报告。我尽量避免使用 webdrivers,因为它们在不同操作系统之间不一致、容易出错(根据经验)。因此,我认为尝试对 sellercentral.amazon.com 的登录过程进行逆向工程将是一个有趣的小项目(也许最终是徒劳的)。这个过程并不困难,除了初始登录表单中的两个字段:password
和 metadata1
。 password
字段将在下面详细讨论。 metadata1
字段似乎采用了类似的技术,同时引入了每隔几秒更改一次的额外障碍。当我监视 metadata1
值时,它似乎是使用各种浏览器指标的大型 json 对象生成的。但是,一次一件事,所以我将专注于此 post 中的密码加密,并担心将来 post.
metadata1
进入正题
提交表单后,password
字段中的值将使用下文 post 中进一步讨论的技术进行加密。生成的加密值然后替换密码字段中的值并将该字段重命名为 encryptedPwd
我的发现
到目前为止,我一直在查看 javascript 文件并单步执行代码序列,并了解了以下内容:
- 他们利用专有的 SiegeCrypto.js script as the main cryptographic library (Siege being Amazon's Secure Ingress and Egress Team) & 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 片段以及解释,以便我了解 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
内容为前缀
metadata1
在 XXTEA 中加密。我写了一个 Python 脚本来解码和编码 metadata1
。这可以找到 here.