如何制作一个简单的加密" ASP.NET MVC应用程序中的密码?

时间:2016-02-27 01:08:41

标签: c# asp.net asp.net-mvc

我只想要一个登录到我的网络应用程序管理部分的密码。所以我不认为我需要在数据库中为此创建一个表。我将生成一个随机的,安全的密码,我将其烘焙到应用程序中。我怎样才能以安全的方式做到这一点?我是否将其粘贴在web.config中,还是用private static readonly _pswd = ...等C#代码编写?

1 个答案:

答案 0 :(得分:3)

使用PBKDF2存储密码的盐渍哈希值。首先,创建一个控制台应用程序,并使用它来计算哈希值,如下所示:

var r = new System.Security.Cryptography.Rfc2898DeriveBytes("password!", 16, 100000);
byte[] saltedHash = r.GetBytes(32);
byte[] salt = r.Salt;

运行此命令并使用调试器查看saltedHashsalt的内容(或者再编写几行代码将它们写入文本文件)。然后使用它来编写这样的方法:

    private static Boolean passwordCorrect(string pw)
    {
        byte[] salt = { 0x2A, 0x6B, 0xE3, 0xAB, 0x21, 0x78, 0xC6, 0xEE, 0xC9, 0xF0, 0xDB, 0xC6, 0xFA, 0x7A, 0x4E, 0x98 };
        var r = new System.Security.Cryptography.Rfc2898DeriveBytes(pw, salt, 100000);
        var entered = r.GetBytes(32);
        byte[] pbkdf2 = { 0xAF, 0x16, 0x60, 0xA3, 0xD0, 0x58, 0x2C, 0xCF, 0xA2, 0x32, 0xE0, 0x3B, 0x18,
            0x75, 0xDD, 0x6F, 0xA3, 0x35, 0x8, 0x70, 0x6B, 0x72, 0x45, 0xEC, 0xD7, 0x9B, 0x86, 0x59, 0x73, 0x38, 0xAC, 0xBB };

        // Compares two byte arrays in length-constant time; from https://stackoverflow.com/questions/16953231/cryptography-net-avoiding-timing-attack
        byte diff = 0;
        for (int i = 0; i < 32; i++)
            diff |= (byte)(entered[i] ^ pbkdf2[i]);
        return diff == 0;
    }

尽管如此,上述评论者都是正确的:对这样的密码进行硬编码是一种糟糕的安全措施。您应该让自己能够更改密码而无需重新编译。但是,至少通过使用像PBKDF2这样的密码散列算法,您可以显着降低有权访问您的代码的攻击者获取密码的风险。