【问题标题】:How to store a hashed password in SQL Server 2008 R2如何在 SQL Server 2008 R2 中存储散列密码
【发布时间】:2015-11-08 06:09:18
【问题描述】:

我试图在 SQL Server 2008 R2 中存储散列密码,但是当我将存储的版本与原始版本进行比较时,它们不匹配。

string password = "12345";
User user = new User();
user.USERNAME = "JohnDoe";

using (var rngCsp = new RNGCryptoServiceProvider())
{
            byte[] salt = new byte[32];
            rngCsp.GetBytes(salt);
            user.SALT = UTF8Encoding.UTF8.GetString(salt);
}

using (SHA256CryptoServiceProvider sha = new SHA256CryptoServiceProvider())
{
    user.PASSWORD = UTF32Encoding.UTF8.GetString(sha.ComputeHash(UTF8Encoding.UTF8.GetBytes(password + user.SALT)));
}

//store the user on db
db.UserUpdate(user);

// now get the db values that have been saved and compare with original
var userOnDB = db.UsersGet(user.USERNAME);
var passwordOnDb = userOnDB.PASSWORD;

//this returns false
if (passwordOnDb == user.PASSWORD)
{

}

SQL Server 表具有以下列:

TABLE [dbo].[USERS]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [SALT] [nvarchar](50) NOT NULL,
    [PASSWORD] [nvarchar](50) NOT NULL,
    .........
)

这是我的数据库访问代码:

public USER UsersGet(string userName)
{
        using (MyEntities ctx = new MyEntities())
        {
            return ctx.USERS.Where(a => a.USERNAME == userName).FirstOrDefault();
        }
}

public void UserUpdate(USER user)
{
    try
    {
            using (MyEntities ctx = new MyEntities())
            {
                if (controller.ID == 0)
                {
                    ctx.Entry(user).State = System.Data.Entity.EntityState.Added;
                }
                else
                {
                    ctx.Entry(user).State = System.Data.Entity.EntityState.Modified;
                }

                ctx.SaveChanges();
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.InnerException.InnerException.Message);
        }
    }

这是我的User 对象

public int ID { get; set; }
public string FIRSTNAME { get; set; }
public string LASTNAME { get; set; }
public string ADDRESS1 { get; set; }
public string ADDRESS2 { get; set; }
public string ADDRESS3 { get; set; }
public string TOWN { get; set; }
public string POCODE { get; set; }
public string MOBILE { get; set; }
public string COMMENTS { get; set; }
public bool ACTIVE { get; set; }
public string NIC { get; set; }
public string LANDLINE { get; set; }
public string USERNAME { get; set; }
public string EMAIL { get; set; }
public string SALT { get; set; }
public string PASSWORD { get; set; }

所以我认为 SQL Server 表中的列类型一定是错误的。

【问题讨论】:

  • 您的问题与密码、哈希、盐或数据类型无关。您只是在读取数据或将数据写入数据库的方式上存在错误,但我们没有关于您程序的那部分的详细信息。

标签: c# sql-server sha


【解决方案1】:

如果你希望密码哈希匹配你需要使用保存在数据库中的盐而不是创建一个新的

【讨论】:

  • 我相信 Salt 只创建一次,然后与用户一起存储,然后立即检索和比较。
  • ok 假设如果表只有 2 列密码和盐,用户是否链接到密码?
  • 已编辑删除一些不相关的内容并包含 SQL 表
  • 在 UserUpdate 函数中放置一个断点并确保 Id 不为零。我怀疑你有一堆用户名记录
猜你喜欢
  • 2012-06-22
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多