c# - Windows 商店应用程序中的密码散列

标签 c# .net hash .net-4.5 windows-store-apps

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

服务器端,我使用 BCrypt 来散列传入的密码。并将其存储在数据库中。在服务器端,我还使用 BCrypts Verify 方法使用存储的哈希检查任何传入的密码。这样基本上就可以了。

但是,我自然不想通过网络传输未经哈希处理的密码。没有适用于 Windows 应用商店应用程序的 BCrypt,但我找到了一些 MSDN 示例代码,演示了如何使用适用于 Windows 应用商店应用程序的新密码学 API 来散列字符串,如下所示:

    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 对密码客户端进行哈希处理(如上面的代码所示)在将其传输到服务器时“足够”(在存储之前再次对其进行哈希处理和加盐)。

最佳答案

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


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

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

关于c# - Windows 商店应用程序中的密码散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14069739/

相关文章:

c# - 将数组分解成小数组

ruby-on-rails - 如何一次获取多个哈希值?

c# - Validator 未识别 RegularExpression 数据注释

c# - C# GridView 中的 DateTime 更新字段

c# - 在 Global.asax 的 Application_Start 方法中访问缓存时出错

c# - 从列表中过滤重复的 URL 域 c#

c# - 将缩放值绑定(bind)到控件的大小

c# - 当它是引用类型的字段时,值类型是否装箱?

python - 在 Python 中散列(隐藏)字符串

ruby - 访问 Ruby 哈希变量