如何从代码优先种子方法将哈希密码和Salt保存到Varbinary表列



我正在处理实体框架代码优先迁移,我想让Configuration.cs文件中的Seed方法为我创建一个默认用户。我将散列用户密码存储在数据库中,作为varbinary(64),salt作为varbinary16。我复制了现有用户的hash和salt,以便种子方法可以在创建默认用户时使用它。我遇到的问题是将密码hash和salt的字符串表示转换为相应的sql数据类型。以下是我迄今为止所尝试的:

string hashString = "0x81E09FC75CFAB13F54DF1266ADCA53B9FAE45C1D80655C61DE88057846F9B61DC3ED257F2C7D7B73826F9DC0FFA    5FF987B1A594FD9DAE3DC492F5815E989CD34";
string saltString = "0x630FE0A0186365FF9CCBB0FA6161C08B";
Byte[] pbytes = Encoding.ASCII.GetBytes(hashString);
Byte[] sbytes = Encoding.ASCII.GetBytes(saltString);
context.Users.AddOrUpdate(p => p.FirstName,
                new User
                {
                    Id = Guid.NewGuid(),
                    FirstName = "John",
                    LastName = "Doe",
                    Username = "admin",
                    Email = "jdoe@test.com",
                    PasswordHash = pbytes,
                    PasswordSalt = sbytes,
                    RoleId = 1,
                    LastLoginDate = null
                });

当我从Package Manager控制台运行更新数据库时,我会收到一个"一个或多个实体的验证失败"错误。只是为了测试一下,我复制了我的哈希代码,并尝试使用它,结果不出所料。显然,我不想在我的种子方法中重用这些代码,所以我只需要一种方法来转换字符串int Byte[],数据库会对此感到满意。我已经包含了下面的代码。

  byte[] saltBytes = new byte[16];
  RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
  rng.GetNonZeroBytes(saltBytes);
  byte[] plainTextBytes = System.Text.Encoding.UTF8.GetBytes("admin");
  byte[] plainTextWithSaltBytes = new byte[plainTextBytes.Length + saltBytes.Length];
  plainTextBytes.CopyTo(plainTextWithSaltBytes, 0);
  saltBytes.CopyTo(plainTextWithSaltBytes, plainTextBytes.Length);
  var hash = new SHA512Managed();
  byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes);
context.Users.AddOrUpdate(p => p.FirstName,
            new User
            {
                Id = Guid.NewGuid(),
                FirstName = "John",
                LastName = "Doe",
                Username = "admin",
                Email = "jdoe@test.com",
                PasswordHash = hashBytes,
                PasswordSalt = saltBytes,
                RoleId = 1,
                LastLoginDate = null
            });

看起来您正在尝试将十六进制转换为字节,而不是将字符串转换为字节。所以你想从这里开始。。。。如何将十六进制字符串转换为字节数组?

但如果你以一个"正常"字符串开始。。。

    public static byte[] Base64StringToByteArray(string base64String) {
        return Convert.FromBase64String(base64String);
    }

    public static byte[] UnicodeStringToByteArray(this string source) {
        return Encoding.Unicode.GetBytes(source);
    }
    public static byte[] UTF8StringToByteArray(this string source)
    {
        return Encoding.UTF8.GetBytes(source);
    }

最新更新