繁体   English   中英

删除以散列方式存储在数据库C#中的组合框项目

[英]Remove combo box items that stored as hashed in the database c#

我有一个关于验证数据库中的哈希文本的问题。 现在,已在数据库中注册的UserType如下图所示被散列:

我希望当数据库中存储有作为哈希值的管理员文本时,程序将验证哈希值并检查验证是否为管理员文本。 如果是,那么它将仅删除组合框列表中的管理员文本。

我通过哈希将UserType存储到数据库的原因是,我限制其他UserType以获得对系统的完全访问权限,并防止黑客将UserType更改为Administrator以外的其他类型(如果我以纯文本格式存储它)一旦找到)。

在此处输入图片说明

上面的图像显示UserType已被哈希处理,哈希的文本是UserType的管理员。

现在,我将散列的UserType像这样添加并存储到数据库中:

public static void AddDatabase(string _selectedIndex)
        {
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                string query = "INSERT INTO [Member] ([UserType]) VALUES (@UserType)";

                connection.Open();

                _hashedType = BCrypt.CreateHash(_selectedIndex, BCrypt.GenerateSalt(12));

                using (OleDbCommand command = new OleDbCommand(query, connection))
                {
                    command.Parameters.Add("@UserType", OleDbType.VarChar);
                    command.Parameters["@UserType"].Value = _hashedType;
                    command.ExecuteNonQuery();
                }

                connection.Close();
            }
        }

void button2_Click(object sender, EventArgs e)
        {
  SystemManager.AddDatabase(this.comboBox1.Text);
        }

void Registration_Load(object sender, EventArgs e)
        {
            if (SystemManager.CheckType("Administrator") != true)
            {
                this.comboBox1.Items.Add("Administrator");
            }

            this.comboBox1.Items.Add("Member");

            this.comboBox1.SelectedIndex = 0;
        }

为了验证它,我像下面的代码一样使用它。 但是,一旦我运行该程序,所有内容将变为空(组合框下拉列表不显示任何内容(空文本),如下图所示):

public static bool CheckType(string _value1)
        {
            using (OleDbConnection connection = new OleDbConnection(SystemManager.connectionString))
            {
                string query = "SELECT COUNT(*) FROM [Member] WHERE [UserType] = @UserType";

                connection.Open();

                using (OleDbCommand command = new OleDbCommand(query, connection))
                {
                    command.Parameters.Add("@UserType", OleDbType.VarChar);
                    command.Parameters["@UserType"].Value = BCrypt.ValidateHash(_value1, _hashedType);

                    _count = (int)command.ExecuteScalar();

                    connection.Close();
                }

            }

            return _count > 0;
        }

在此处输入图片说明

非常感谢你!

非常感谢您的回答

两件事情:

首先,由于您显示的代码在ComboBox中无条件地添加了字符串“ Member”,因此可以确定该方法根本没有被调用,或者稍后有一些代码清除了ComboBox。 您没有发布足够完整的示例来让其他人知道哪个是正确的答案,因此您必须自己调试。 首先在方法上放置一个断点,以确定是否完全调用它。

其次,我对使用散列值以确保不会有人更改值的整个策略提出质疑。 如果他们有权访问数据库并可以修改其元素,那么他们将拥有所需的一切。 散列敏感信息仅在您可以假设存储的散列本身不能被修改并且您希望要求其他人提供只有他们自己知道的某些数据(例如密码)时才有用,以便您可以散列该数据并进行比较到存储的哈希。 当然,这仅在使用安全哈希时有效。

不加盐,如果我是攻击者,并且我可以访问数据库,并且想将一个用户的类型更改为其他类型,那么我要做的就是复制在其他相同类型的用户中找到的值我想将其更改为。 在这里您会加盐,但即使这样也无济于事,如果作为攻击者我知道所用的盐和哈希算法(您在此处提供的两条信息); 我可以随意从头开始生成哈希。

如果您希望数据库不受更改的影响,则无需让攻击者首先对其进行更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM