3

我正在为我的应用程序编写身份验证服务。客户端将通过 HTTP 连接到此身份验证服务以注册或连接。在他们连接后,他们会收到一个 sessionkey,他们可以使用加密的 TCP/UDP 数据包发送到辅助服务器。这仍然是 WIP,只是为了给你一个大局观。

服务器端,我使用 BCrypt 对传入的密码进行哈希处理。并将其存储在数据库中。在服务器端,我还使用 BCrypts 验证方法来检查任何带有存储哈希的传入密码。所以这基本上有效。

但是,我自然不想通过网络传输未散列的密码。Windows Store 应用程序没有 BCrypt,但我发现一些 MSDN 示例代码演示了如何使用新的 Cryptography API for Windows Store 应用程序来散列字符串,如下所示:

    public static string Hash(string password)
    {
        HashAlgorithmProvider provider = 
            HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha512);

        CryptographicHash hash = provider.CreateHash();

        IBuffer buffer = CryptographicBuffer.ConvertStringToBinary(password, BinaryStringEncoding.Utf16BE);
        hash.Append(buffer);
        IBuffer hashedBuffer = hash.GetValueAndReset();

        return CryptographicBuffer.EncodeToBase64String(hashedBuffer);
    }

我计划让各种客户端连接到该服务,不仅是 Windows 商店应用程序(还有传统的 Windows 桌面应用程序)。所以自然我想要散列密码客户端的“一种”方式。

我需要关于我应该实施的其他安全机制的建议,如果使用 SHA512 散列密码客户端,如上面的代码所示,在将其传输到服务器时“足够”(在存储之前再次对其进行散列和加盐)。

4

1 回答 1

0

在没有 TLS 保护的情况下执行任何类型的身份验证都会给您留下漏洞。Bcrypt 服务器端可以为您提供有限的保护,防止对被盗数据库的攻击。然而,通过线路发送未受保护的(散列)密码应被视为安全风险。


应该可以向客户端引入至少一个盐和一个工作因子。这些参数可以从服务器端检索,因为它们需要保持不变。然后你可以使用 brypt 客户端。你说它在 API 中不可用,但这不应该让你担心。Bcrypt 只是一种算法,网上会有它的实现。

攻击者(窃听者)仍然可以使用蛮力攻击和字典攻击,但它们将更难完成,为具有中等强度密码的用户提供有限的保护(如果客户端代码可以信任)。

于 2016-02-06T13:11:53.923 回答