【问题标题】:How to store information like passwords encrypted but not in hash如何存储加密但不在哈希中的密码等信息
【发布时间】:2015-09-17 20:09:35
【问题描述】:

我需要在数据库字段中存储“类似密码的信息”。我希望它被加密,但我需要在使用它之前对其进行解密。所以我不能使用 Hash/Salt 解决方案。
如果攻击者将其深入到数据库中,它可能会走得太远,但我认为这至少会阻止错误的数据转储。

  1. 如何加密一个值将其存储到数据库中并解密相同的值以供以后使用?

  2. 哈希不是一个选项(我实际上在其他部分使用它)。

  3. 在哪里存储私钥?用户不会提供任何东西。

这是一个 C# 解决方案,因此 .NET 特定的东西会很棒。我的问题非常相似,但我正在寻找基于 .net 的解决方案:Two-way encryption: I need to store passwords that can be retrieved

编辑: 霍根几乎回答了我的问题。我在那里找到了一些例子,它们的范围从非常复杂到相当简单。看起来 AES 仍然很好,所以我将使用该方法。感谢您的所有帮助。

【问题讨论】:

  • 在 google 搜索如何使用SHA1 加密 SQL Server 中的密码,一旦你完成了设置,你就可以轻松地在 .net 端编写自己的加密/解密代码。我已经完成了在此之前,即使您不使用 SQL Servers 加密,您仍然可以编写自己的代码进行一些谷歌搜索,正如我之前所说的
  • @MethodMan 你在拖钓吗? -- sha1 是一个哈希函数。
  • 您考虑过使用 AD 吗?
  • Dan 我不确定我是否理解,.net 中支持许多 2 路加密功能,并且有大量可用示例——您的问题是否有一些具体问题无法通过标准解决方案解决?正如措辞所言,您的问题很笼统,听起来您正在寻求建议
  • 我看到了一些非常复杂的解决方案,例如:stackoverflow.com/questions/202011/encrypt-and-decrypt-a-string/…,然后我看到了一些相当简单的解决方案 codeproject.com/Tips/839656/… 我缺少什么,因为简单的解决方案看起来很简单。

标签: c# encryption


【解决方案1】:

不涉及私钥的一种解决方案是使用DPAPI

您可以通过 ProtectedData 类从 .NET 使用它。

这是一个例子:

public void Test()
{
    var password = "somepassword";

    var encrypted_password = EncryptPassword(password);

    var decrypted_password = DecryptPassword(encrypted_password);
}

public string EncryptPassword(string password)
{
    var data = Encoding.UTF8.GetBytes(password);

    var encrypted_data = ProtectedData.Protect(data, null, DataProtectionScope.CurrentUser);

    return Convert.ToBase64String(encrypted_data);
}

public string DecryptPassword(string encrypted_password)
{
    var encrypted_data = Convert.FromBase64String(encrypted_password);

    var data = ProtectedData.Unprotect(encrypted_data, null, DataProtectionScope.CurrentUser);

    return Encoding.UTF8.GetString(data);
}

请注意,这种情况下的 DPAPI 取决于当前登录的用户帐户。如果您在应用程序以 User1 身份运行时加密了密码,那么您只能解密在同一用户帐户下运行的密码。请注意,如果您以不正确的方式更改 User1 的 Windows 密码,您将无法解密密码。详情请见this question

如果您不想使用 DPAPI,而希望拥有私钥。那么存储此类私钥的最佳位置是在用户的密钥库中。但是,为了将私钥存储在本地用户存储中,您需要拥有它的证书。您可以创建一个自签名证书并将其与相应的私钥一起存储到本地用户证书存储中。

您可以使用X509Store 类在代码中访问用户存储。您可以使用它来查找要使用的证书(在 C# 中的 X509Certificate2 类中),然后使用它进行加密/解密。

请参阅thisthis 了解更多详情。

【讨论】:

  • 本方案只兼容Windows平台。编译器抱怨代码CA1416。我似乎无法找到适用于所有平台的解决方案。
猜你喜欢
  • 2015-10-07
  • 2020-11-18
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2019-03-17
  • 2020-04-27
相关资源
最近更新 更多