C#数据库密码加密保存和登录验证方法

目录

1. 使用哈希算法加密密码

2. 用户注册时加密密码并保存到数据库

3. 用户登录时验证密码

注意事项

如何实现加盐处理

安装BCrypt.Net包

密码哈希和验证

用户注册时加盐并哈希密码

用户登录时验证密码


1. 使用哈希算法加密密码

可以使用C#中的System.Security.Cryptography库来进行密码加密。示例代码如下:

using System;
using System.Security.Cryptography;
using System.Text;

public class PasswordHasher
{
    public static string HashPassword(string password)
    {
        using (SHA256 sha256 = SHA256.Create())
        {
            byte[] bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(password));
            StringBuilder builder = new StringBuilder();
            foreach (byte b in bytes)
            {
                builder.Append(b.ToString("x2"));
            }
            return builder.ToString();
        }
    }
}

2. 用户注册时加密密码并保存到数据库

假设使用ADO.NET来操作数据库,示例代码如下:

string connectionString = "your_connection_string_here";
string username = "username_from_user_input";
string password = "password_from_user_input";
string hashedPassword = PasswordHasher.HashPassword(password);

using (SqlConnection connection = new SqlConnection(connectionString))
{
    string query = "INSERT INTO Users (Username, Password) VALUES (@Username, @Password)";
    using (SqlCommand command = new SqlCommand(query, connection))
    {
        command.Parameters.AddWithValue("@Username", username);
        command.Parameters.AddWithValue("@Password", hashedPassword);
        connection.Open();
        command.ExecuteNonQuery();
    }
}

3. 用户登录时验证密码

在用户登录时,比较输入的密码加密值与数据库中存储的加密值。示例代码如下:

string connectionString = "your_connection_string_here";
string username = "username_from_user_input";
string password = "password_from_user_input";
string hashedPassword = PasswordHasher.HashPassword(password);

using (SqlConnection connection = new SqlConnection(connectionString))
{
    string query = "SELECT Password FROM Users WHERE Username = @Username";
    using (SqlCommand command = new SqlCommand(query, connection))
    {
        command.Parameters.AddWithValue("@Username", username);
        connection.Open();
        string storedHashedPassword = (string)command.ExecuteScalar();

        if (storedHashedPassword == hashedPassword)
        {
            // 登录成功
        }
        else
        {
            // 登录失败
        }
    }
}

注意事项

  • 加盐处理:为了增加安全性,建议在加密密码之前使用盐值(Salt),这样即使相同的密码每次加密的结果也会不同。可以使用随机生成的盐值并将其存储在数据库中与加密后的密码一起保存。
  • 使用更安全的算法:尽量使用bcrypt或Argon2等更为安全的算法来进行密码加密和验证,而不是直接使用SHA-256。
  • 防止SQL注入:永远使用参数化查询或ORM(如Entity Framework)来防止SQL注入攻击。

如何实现加盐处理

下面是一个加盐处理的示例,使用了C#和bcrypt进行密码加密和验证:

安装BCrypt.Net包

dotnet add package BCrypt.Net-Next

密码哈希和验证

使用BCrypt.Net库,可以非常方便地进行加盐处理和密码哈希。示例代码如下:

using BCrypt.Net;

public class PasswordHasher
{
    // 生成带盐值的密码哈希
    public static string HashPassword(string password)
    {
        // 自动生成盐值并进行哈希处理
        return BCrypt.Net.BCrypt.HashPassword(password);
    }

    // 验证密码
    public static bool VerifyPassword(string password, string hashedPassword)
    {
        // 验证输入的密码与存储的哈希值是否匹配
        return BCrypt.Net.BCrypt.Verify(password, hashedPassword);
    }
}

用户注册时加盐并哈希密码

在用户注册时,使用HashPassword方法对密码进行加盐和哈希处理,然后将结果存储到数据库中:

string connectionString = "your_connection_string_here";
string username = "username_from_user_input";
string password = "password_from_user_input";
string hashedPassword = PasswordHasher.HashPassword(password);

using (SqlConnection connection = new SqlConnection(connectionString))
{
    string query = "INSERT INTO Users (Username, Password) VALUES (@Username, @Password)";
    using (SqlCommand command = new SqlCommand(query, connection))
    {
        command.Parameters.AddWithValue("@Username", username);
        command.Parameters.AddWithValue("@Password", hashedPassword);
        connection.Open();
        command.ExecuteNonQuery();
    }
}

用户登录时验证密码

在用户登录时,使用VerifyPassword方法验证输入的密码与存储在数据库中的哈希值是否匹配:

string connectionString = "your_connection_string_here";
string username = "username_from_user_input";
string password = "password_from_user_input";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    string query = "SELECT Password FROM Users WHERE Username = @Username";
    using (SqlCommand command = new SqlCommand(query, connection))
    {
        command.Parameters.AddWithValue("@Username", username);
        connection.Open();
        string storedHashedPassword = (string)command.ExecuteScalar();

        bool isPasswordValid = PasswordHasher.VerifyPassword(password, storedHashedPassword);
        if (isPasswordValid)
        {
            // 登录成功
        }
        else
        {
            // 登录失败
        }
    }
}
加盐处理在密码加密中非常重要,可以有效地防止彩虹表攻击和其他形式的密码破解。通过使用BCrypt库,可以轻松实现加盐和密码哈希,提高Web应用程序的安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01 区块链-- Smart Contract

Concept of Smart Contract 1. 智能合约并非区块链的专属 智能合约,就是一段部署在区块链里的代码。 合约有自己的地址,与该地址进行交易会触发代码运行,一旦某个事件触发合约中的条款,代码即自动执行。 也就是说,满…

上海市计算机学会竞赛平台2024年1月月赛丙组成绩等第

题目描述 给定一个在 00 到 100100 之间的整数 𝑎a,请将它转成等第,规则如下: 9090 或以上为 A8080 或以上为 B7070 或以上为 C6060 或以上为 D5959 或以下为 F 输入格式 单个数字表示 𝑎a 输出格式 单个字符表示…

c++快读快写

一般来讲,快读快写在针对数据量不是很大的输入输出的时候显得比较无力,但如果是多组数据或者输入量较多,就可以显著提升效率。 快读 一个一个字符读取比读入一个数字(int)快 inline int read(){int x 0, f 1;//in…

【前端】LayUI监听事件汇总

一、监听单选按钮事件 点击资源类型单选按钮时&#xff0c;请求后台接口&#xff0c;把接口返回的内容追加到选择资源下拉框内 HTML <div class"layui-form-item"><label class"layui-form-label">资源类型&#xff1a;</label><d…

【Python快速上手(二十四)】-Python3 JSON数据解析

目录 Python快速上手&#xff08;二十四&#xff09;Python3 JSON数据解析编码&#xff08;序列化&#xff09;解码&#xff08;反序列化&#xff09;读写JSON文件 Python快速上手&#xff08;二十四&#xff09; Python3 JSON数据解析 在Python 3中&#xff0c;使用JSON&…

6. 神经网络的内积

目录 1. 准备知识 1.1 NumPy 的多维数组 1.2 矩阵乘法 1.2.1 矩阵乘法顺序 1.2.2 矩阵乘法范例 2. 神经网络的内积 2.1 使用场合 2.2 Python 实现 1. 准备知识 1.1 NumPy 的多维数组 大家应该对多维数组都很熟悉&#xff0c;我不再多言。在 NumPy 模块中&#xff0c;…

声纹识别在无人机探测上的应用

无人机在民用和军事领域的应用越来越广泛。然而&#xff0c;随着无人机数量的增加&#xff0c;"黑飞"现象也日益严重&#xff0c;对公共安全和隐私构成了威胁。因此&#xff0c;开发有效的无人机探测与识别技术变得尤为重要。及时发现黑飞无人机的存在进而对其型号进…

AI地名故事:鸦岗村

鸦岗村&#xff0c;位于广州市白云区石井镇&#xff0c;是一个历史悠久、文化底蕴深厚的村落。据《广州地名志》记载&#xff0c;南宋时期&#xff0c;南雄珠玑巷的凌氏家族迁移至此地&#xff0c;并在此建立村落。由于村子周边的山岗上常有乌鸦栖息&#xff0c;因此得名“鸦岗…

Redisson中分布式锁的实现原理

redisson版本&#xff1a;3.27.2 简介 锁归根结底就是对同一资源的竞争抢夺&#xff0c;不管是在单体的应用亦或者集群的服务中&#xff0c;上锁都是对同一资源进行修改的操作。至于分布式锁&#xff0c;那就是多个服务器或资源&#xff0c;同时抢占某一单体应用的同个资源了。…

什么是Google SEO优化,如何做好谷歌seo排名?2024年谷歌搜索引擎优化(谷歌SEO)3分钟速通教程指南

1 - 什么是SEO&#xff1f; 谷歌排名优化&#xff08;SEO&#xff1a;Search Engine Optimization&#xff09;是指当您在谷歌搜索那里输入一个您正在推广的产品或服务的关键词时&#xff0c;如何在使您的站在Google里获得一个较高的排名位置而做的优化过程。谷歌排名优化的意…

算法学习笔记(LCA)

L C A LCA LCA&#xff1a;树上两个点的最近公共祖先。&#xff08;两个节点所有公共祖先中&#xff0c;深度最大的公共祖先&#xff09; L C A LCA LCA的性质&#xff1a; 在所有公共祖先中&#xff0c; L C A ( x , y ) LCA(x,y) LCA(x,y)到 x x x和 y y y的距离都最短。 x …

什么是AOT,AOT 有什么优点

JDK 9 引入了一种新的编译模式 AOT (Ahead of Time Compilation)。与 JIT (Just-In-Time Compilation) 不同&#xff0c;AOT 在程序执行前将其编译成机器码&#xff0c;属于静态编译。这种模式具有很多优点&#xff0c;但也有一些限制。本文将详细探讨 AOT 的优点以及其限制。 …

六西格玛培训证书攻略2024:一站式解决方案助你快速上手

目前&#xff0c;企业对于员工的专业能力和综合素质要求越来越高。六西格玛作为一种先进的质量管理方法&#xff0c;已经成为众多企业提升运营效率、降低成本的重要手段。张驰咨询针对2024年六西格玛培训证书考取&#xff0c;为广大学员制定了实用的攻略&#xff0c;帮助学员们…

玩转大模型 企业AI着陆新正解 神州问学AI原生赋能平台正式发布

在人工智能技术日新月异的今天&#xff0c;神州数码凭借深厚的行业洞察和技术积累&#xff0c;揭开了AI原生赋能平台——神州问学的神秘面纱。作为企业AI着陆的加速引擎&#xff0c;神州问学致力于通过AI原生场景赋能&#xff0c;为企业开辟一条通往智能未来的坦途。 神州问学—…

vue3使用el-radio-group获取表格数据无法选中问题

这里是引用 今天写项目发现使用el-radio-group无法获取表格中的数据&#xff0c;于是去官网查看了一下&#xff0c;发现写的没啥问题&#xff0c;就是 <el-radio value"1" size"large"> 未知</el-radio>这样的写法&#xff0c;又在网上看了一些…

不写一行代码,使用ChatGpt开发一个射击游戏

1.简介 最近需要开发一个网页应用&#xff0c;想到了使用ChatGpt生成Html页面&#xff0c;生成的效果非常好&#xff0c;说几句话就可以实现复杂的功能。不过需要一步步耐心的引导。然后我就想到可以用ChatGpt生成一个网页游戏。这个游戏包含了人物移动、跳跃、射击、生命值&a…

02Django项目安装和环境变量设置

凯哥英语视频 Django项目安装和环境变量设置 凯哥英语视频1.汉化1.打开PyCharm&#xff0c;点击File&#xff0c;再点击Settings2.然后点击 Plugins&#xff0c;再Marketplace&#xff0c;找到Chinese&#xff08;simplified&#xff09;Language&#xff0c;再点击Install然后…

linux给history查看历史执行命令加上日期和时间

问题&#xff1a; 打开linux&#xff0c;执行history看一下上次执行的命令&#xff0c;结果命令是显示出来了&#xff0c;但没有日期和时间。 解决办法&#xff1a; 编辑 ~/.bashrc vim ~/.bashrc 在末尾加入以下命令 export HISTTIMEFORMAT"%F %T " 保存并退…

Rust语言实现图像编码转换

一、概述 Rust 作为一门现代的系统编程语言&#xff0c;不仅性能出色&#xff0c;安全性高&#xff0c;而且生态系统也在不断成熟。在图像处理方面&#xff0c;image-rs库是 Rust 社区中广泛使用的一个开源库&#xff0c;它提供了丰富的图像编解码功能。今天&#xff0c;我将带…

GPT-4o: 从最难的“大海捞针”基准看起

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在阅读过程中有些知识点存在盲区&#xff0c;可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果…