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

问题描述 投票:9回答:15

我希望我的应用程序将加密的密码保存在数据库或文本文件中。假设任何人都可以打开数据库或文本文件,该怎么办?

Duplicate

Encrypting/Hashing plain text passwords in database

不重复我正在要求特定于.NET的代码

编辑:我正在保存密码以备后用。我需要对其进行解码并使用它来登录。它不必是超级安全的,只需要人眼不易理解,并且很难用平凡的脚本进行解码。

c# .net security
15个回答
23
投票

StackOverflow读者不知道如何编写安全的密码方案,您也不知道。如果要这样做,请坚持使用纯文本以节省时间。从Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes

彩虹表很容易被击败。对于每个密码,随机产生数字(随机数)。散列密码与随机数一起存储哈希和随机数。服务器有足够的信息来验证密码(随机数存储在明文中)。但是即使随机值很小,比方说16位彩虹表不可行:现在有65,536每个哈希的“变体”,而是在3000亿个彩虹表条目中,你需要四千万。随机数这种方案称为“盐”。

很酷吧?是的,还有Unix crypt-几乎是最低的公分母在安全系统中-已自1976年以来一直是该功能。你,你不应该在设计密码系统。使用别人的好人。

使用BCrypt-.NET和Mono的强密码散列。这是一个简单编写的.cs文件,随着密码破解计算机变得越来越快,它将继续满足您的需求。


0
投票

就像八极游戏,我将使用TripleDes,我也将盐保存在数据库中。对我来说,密钥通常是硬编码的,但是对于每个加密的项目,盐值都应更改。


0
投票

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

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


0
投票

您真的需要能够本身检索密码吗?如果您出于验证某人(或某物)的目的而存储密码,则应将其哈希(加盐),然后将其与希望验证的一方提供的密码的哈希进行比较。

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


0
投票

我知道它已经10岁了,但这是我在Github上找到的lib。使用起来很简单,如下所示:

using System.Security;
using System.Text;
string text = "A simple text";

EncryptString myEncryptor = new EncryptString();//creating instance to main class

string encryptedText = myEncryptor.Encrypt(text, Encoding.ASCII);
//any encoding will work actually, but MUST be the same encoding to use while decypting.

Console.WriteLine(encryptedText + "\n" + "\n");

string decryptedText = myEncryptor.Decrypt(encryptedText, Encoding.ASCII);
Console.WriteLine(decryptedText);

它支持密码加密,并且说明在lib随附的.readme文件中。


-3
投票

简短地:

获得一个较大的随机数,您将对其保密,只有您的应用程序代码才能访问。

[使用像SHA1这样的加密算法来加密密码+随机数,大多数编程语言都具有加密框架。

存储哈希密码。

稍后,当您要检查输入的密码时,可以重新哈希用户输入并与“虚拟的”不可识别的存储密码进行比较。


-3
投票

这里是带有示例代码.NET的字符串加密文章,>

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

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


15
投票

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


9
投票

三重DES是一种做到这一点的方式,只要您的意思是“我的系统需要能够重新命名才能访问资源的密码”。如果您是说密码是用户必须能够访问系统的密码,则可能不需要加密,只需哈希即可。当您存储哈希密码值时,它对任何具有直接数据库访问权限的人都是无用的,但是仍可用于身份验证。您要做的只是将存储的哈希与输入密码的哈希进行比较。如果它们匹配,则您授予访问权限。

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

[如果您想证明您希望在用户丢失/忘记密码时将密码提供给用户,请不要这样做。向他们颁发一个临时密码(您将其存储在数据库中的哈希值中)并让他们在首次登录时进行更改。


8
投票

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


4
投票

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

由于这是我们在这里谈论的密码,所以更好的解决方案是使用单向哈希。当用户首次创建密码时,最好对密码进行哈希处理(最好使用盐值进行哈希处理)并存储生成的哈希值。由于哈希是单向的,因此没有人可以将哈希反转为原始的纯文本值。

要检查用户密码是否正确,您只需向用户输入纯文本密码,再次对他们的输入进行哈希处理,然后将得到的哈希值与您存储的哈希值进行比较(当然要考虑盐)。如果两个哈希值相同,则用户输入了正确的密码。

请参阅以下链接以获取更多信息:Hashing Password with Salt

对于加密(如果需要使用它,我将使用Rijndael (AES)


2
投票

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

A。如果您只需要使用他们的密码进行身份验证就可以了。

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

  1. [将密码从客户端传输到服务器时,请确保连接已加密。这将防止它被嗅出。对于Web应用程序而言,这是微不足道的,因为Web服务器正在为您完成繁重的工作。如果不是这样的话,它会变得很棘手,并且是另一个问题的主题。

  2. 选择可靠的散列算法以防止冲突。我建议使用SHA-256,即使它确实提供比SHA1或MD5更大的结果。 Microsoft使用其算法算法的参考是here

  3. 为防止使用Rainbowtable进行攻击而对密码加盐(即在大表中使用预先计算的哈希值和明文形式的关联密码查找密码)。答案here(位于您的问题中)在Python中提供了有关如何实现的良好伪代码。 .NET代码here也是一个很好的示例。

B。如果您需要出于验证用户的其他目的而能够读取每个用户的密码。

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


2
投票

如果您需要解密密码以供以后使用,并且不必超级安全,请在此处使用方法:

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

有据可查,而且易于理解。


1
投票

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

不使用2向加密的原因是,由于良好的散列函数会发生冲突,因此无法解密密钥。


1
投票

我个人会使用一种具有单向加密的功能-MD5,SHA1等...

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

© www.soinside.com 2019 - 2024. All rights reserved.