SRP 从 Amazon Cognito 登录

SRP login with Amazon Cognito from

我正在尝试使用以下代码将 cognito 登录集成到 .net 控制台应用程序:

    public static async Task LoginAsync()
    {
        var credentials = new AnonymousAWSCredentials();
        using var client = new AmazonCognitoIdentityProviderClient(credentials, Amazon.RegionEndpoint.USEast1);

        var initAuthRequest = new InitiateAuthRequest();
        initAuthRequest.AuthParameters.Add("USERNAME", "myuser@myemail.com");
        initAuthRequest.AuthParameters.Add("SRP_A", "3ab487035b1635659eb0f349d2czab124d258b03725x5322138ff24ab5c870311b16585659eb0f349d2ceab124d258b0372555322138ff2");
        initAuthRequest.ClientId = "my_amazon_client_id";
        initAuthRequest.AuthFlow = AuthFlowType.USER_SRP_AUTH;
        var response = await client.InitiateAuthAsync(initAuthRequest);
    }

这非常有效,我收到的回复是:

  1. SECRET_BLOCK
  2. SRP_B
  3. 用户名
  4. USER_ID_FOR_SRP

根据文档,我必须生成一个 PASSWORD_CLAIM_SIGNATURE,但我不知道如何生成它或加密函数应遵循什么顺序。我试图遵循所有 Amazon 文档,但没有很好的记录,我找到的唯一解决方案依赖于 GetUserPoolId,我不知道从哪里得到它。我看到了另一个 Xamrin.Forms 教程,但它并没有完全遵循我需要的这种 SRP 方式。

有什么想法吗?

谢谢!

PASSWORD_CLAIM_SIGNATURE是根据以下成一个base64编码的字符串。

  • Let K_USER = SHA256_HASH(S_USER)
    让 S_USER = (SRP_B - k * gx)(a + ux)
    让 x = SHA256_HASH(盐 + FULL_PASSWORD)
    让你 = SHA256_HASH(SRP_A + SRP_B)
    让 k = SHA256_HASH(N + g)
  • 回答所有 MFA 质询后,Amazon Cognito 在 NewDeviceMetadataType 字段中使用 DeviceGroupKey 和唯一的 DeviceKey 进行响应。
  • 对于PASSWORD_CLAIM_SECRET_BLOCK,使用SECRET_BLOCK的值。
  • 对于 TIMESTAMP,包括当前时间。 (例如,9 月 25 日星期二 00:09:40 2018 年协调世界时。)
Let PASSWORD_CLAIM_SIGNATURE = SHA256_HMAC(K_USER, DeviceGroupKey + DeviceKey + PASSWORD_CLAIM_SECRET_BLOCK + TIMESTAMP), base64-encoded

参考:Link, Link2, Link3