代码之家  ›  专栏  ›  技术社区  ›  Pablo Retyk

如何加密密码以便以后在数据库或文本文件中保存?

  •  9
  • Pablo Retyk  · 技术社区  · 17 年前

    我希望我的应用程序将加密的密码保存在数据库或文本文件中。 如果数据库或文本文件可以由任何人打开,我该如何做呢?

    复制品

    Encrypting/Hashing plain text passwords in database

    不重复 我要的是特定于.NET的代码

    编辑:我正在保存密码供以后使用。我需要解码并使用它登录。 它不必是超级安全的,它只是需要不可读的人眼,并难以用一个微不足道的脚本解码。

    14 回复  |  直到 17 年前
        1
  •  23
  •   joeforker    17 年前

    StackOverflow阅读器不知道如何编写安全密码方案,您也不知道。如果你想这样做,可以用纯文本来节省时间。从 Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes :

    彩虹桌很容易被打败。为了 每个密码,生成一个随机的 数字(时态)。散列密码 和nonce一起存储 哈希和nonce。服务器有 足够的信息来验证密码 (nonce存储在clear中)。 但即使是很小的随机值, 比如,16位,彩虹表是 不可行:现在有65536个 _每个哈希的变体_157;,而不是 在3000亿张彩虹桌上, 你需要万亿。中的临时 该方案称为盐。

    很酷,是吧?是的,还有Unix密码- 几乎是最小公分母 在安全系统中,已经有了 从1976年开始。如果这是新闻 你,你不应该设计 密码系统。使用其他人 好的。

    使用 BCrypt -.NET和Mono的强密码散列。这是一个简洁的.cs文件,随着密码破解计算机速度的加快,它将继续满足您的需求。

        2
  •  15
  •   Svish    17 年前

    BCrypt -.NET和Mono的强密码哈希

        3
  •  9
  •   ZombieSheep    17 年前

    三重DES是实现这一点的一种方法,只要您的意思是“我的系统需要能够调用的密码才能访问资源”。如果您的意思是用户需要密码才能访问您的系统,可能不需要加密,只需要散列就可以了。当您存储哈希密码值时,它对任何直接访问数据库的人都是无用的,但是 仍可以用于身份验证 . 您所要做的就是将存储的哈希与传入密码的哈希进行比较。如果匹配,则授予访问权限。

    无论如何,这并不完美,但99.999%的人都是这样存储密码的。

    如果你想辩称如果用户丢失/忘记了密码,你想把它提供给他们,那么请不要这样做。给他们发一个临时密码(你把它存储在数据库中),让他们在第一次登录时更改密码。

        4
  •  8
  •   abatishchev Karl Johan    16 年前

    使用 Data Protection API 使用用户或计算机存储(例如,程序/数据库服务器运行的每个帐户的不同密钥与每台计算机的一个密钥)。这将帮助您稍后解码密码,您不必记住或存储任何加密密钥。它的缺点是,当您重新安装系统/删除帐户时,我相信您将无法恢复数据。

        5
  •  4
  •   CraigTP    17 年前

    如果您使用加密来安全地存储密码,那么您也需要将加密“密钥”存储在某个地方。这将是“弱链接”,因为如果有人获得加密密钥,他们将能够解密加密的密码。

    因为这是我们在这里讨论的密码,所以更好的解决方案是使用单向哈希。当用户第一次创建密码时(最好使用salt值进行散列),您可以散列密码并存储产生的散列值。因为散列是单向的,所以没有人可以将散列反转为原始纯文本值。

    要检查用户密码是否正确,只需向用户询问纯文本密码,再次对其输入进行哈希运算,并将结果哈希值与存储的哈希值进行比较(当然要考虑到salts)。如果两个哈希值相同,则用户输入了正确的密码。

    有关详细信息,请参阅以下链接: Hashing Password with Salt

    对于加密(如果你需要使用的话),我会使用 Rijndael (AES) .

        6
  •  2
  •   Community Mohan Dere    9 年前

    根据您的问题,根据您存储密码的原因,我可以看到两种方法。

    如果您只需要使用他们的密码进行身份验证,而不需要其他任何方法。

    在这种情况下,使用不可逆的算法( Hashing )会是你最好的选择。您需要确保以下几点:

    1. 在将密码从客户机传输到服务器时,请确保连接已加密。这将防止它被嗅出。这对于Web应用程序来说非常简单,因为Web服务器正在为您做繁重的工作。如果不是这样的话,它会变得更加棘手,并且是整个其他问题的主题。

    2. 选择实体哈希算法以防止冲突。我建议使用sha-256,即使它提供的结果比sha1或md5更大。微软关于使用其算法实现的参考是 here .

    3. 使用rainbowtable盐化密码以防止攻击(即使用预先计算的哈希和相关的明文密码在大表中查找密码)。答案 here (在您的问题中)给出了关于如何使用Python的好的伪代码。还有一个很好的.NET代码示例 here .

    b.如果您需要能够读取每个用户的密码,而不是验证用户身份。

    如果我们只讨论在一台计算机(服务器)上存储密码(或任何敏感信息),那么这种情况就很容易了。如果是这样的话,使用Microsoft数据保护API将是一个很好的解决方案,因为它与计算机以及(取决于您的工作方式)应用程序运行所用的用户绑定在一起,并为您处理最差的作业(创建、存储和使用密钥)。您可以从Microsoft中找到一些代码引用 here . 如果您在多个系统上需要它,并且不愿意在应用程序上安装的每个系统上输入密码,那么事情就会变得复杂很多,因为您需要从头开始实现很多密码。这将是我想的另一个问题的主题。

        7
  •  2
  •   Craig O    17 年前

    如果您需要解密密码以备日后使用,并且密码不必是超级安全的,请使用以下方法:

    http://support.microsoft.com/kb/307010

    它有很好的文档记录,并且易于理解。

        8
  •  1
  •   Gambrinus    17 年前

    是否需要再次加密?否则,使用hashfunction对其进行加密,并使用相同的hashfunction对用户提供的密码进行加密,并查看哈希值是否相等。

    不使用双向加密的原因是无法解密密钥,因为一个好的哈希函数会发生冲突。

        9
  •  1
  •   Kieron    17 年前

    就我个人而言,我会使用单向加密的东西——MD5、SHA1等等……

    您可以将FormsAuthentication类与它一起使用 HashPasswordForStoringInConfigFile 方法。验证用户时,请加密输入的密码并将其与存储的版本进行比较。

        10
  •  0
  •   David Basarab    17 年前

    像ocdecio一样,我也会使用三倍体,将盐保存在数据库中。我的密钥通常是硬编码的,但是每个加密项的salt都应该更改。

        11
  •  0
  •   ybo    17 年前

    如果您只需要内部身份验证过程的密码,则不应保存实际密码,而是保存 hash 密码。当需要检查密码是否有效时,必须对提供的密码运行哈希函数,并将其与存储在数据库/文件中的哈希进行比较。您永远无法从哈希中找到原始密码。

    如果您需要保留原始密码,则必须对其进行加密。您可以使用例如a public key infrastructure 如果您有一个进程写入密码(公钥),另一个进程读取密码(私钥)。

        12
  •  0
  •   Vojislav Stojkovic    17 年前

    您真的需要能够检索密码本身吗?如果为了验证某人(或某物)的身份而存储密码,您应该先将其散列(使用salting),然后将该散列与希望验证的一方提供的密码散列进行比较。

    另一方面,如果您需要存储密码以便能够检索到密码并在稍后将其提供给其他身份验证服务,那么您可能希望将其加密存储。在这种情况下,可以使用任何像样的对称加密算法,如三重加密、AES或Blowfish。

        13
  •  -3
  •   Matthew    17 年前

    简要地:

    得到一个大的随机数,你将保持私密,只有你的应用程序代码将有权访问。

    使用类似sha1的加密算法对密码+随机数进行加密,大多数编程语言都有一个加密框架。

    存储哈希密码。

    稍后,当您想要检查输入的密码时,您可以重新刷新用户输入,并将其与“实际上”不可加密的存储密码进行比较。

        14
  •  -3
  •   John Smith    17 年前

    下面是一篇带.NET示例代码的字符串加密文章

    http://www.devarticles.com/c/a/VB.Net/String-Encryption-With-Visual-Basic-.NET/3/

    没有必要使用任何花哨的东西,因为任何有一点技巧和决心的人都会打破它。