用户登录安全:使用 Salt + Hash 来为密码加密

我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码。

 

加Salt可以一定程度上解决这一问题。所谓加Salt方法,就是加点“佐料”。其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,已确定密码是否正确。
 
  这里的“佐料”被称作“Salt值”,这个值是由系统随机生成的,并且只有系统知道。这样,即便两个用户使用了同一个密码,由于系统为它们生成的salt值不同,他们的散列值也是不同的。即便黑客可以通过自己的密码和自己生成的散列值来找具有特定密码的用户,但这个几率太小了(密码和salt值都得和黑客使用的一样才行)。

(一) 为什么要用哈希函数来加密密码

 

 

如果你需要保存密码(比如网站用户的密码),你要考虑如何保护这些密码数据,象下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码。

 

解决的办法是将密码加密后再存储进数据库,比较常用的加密方法是使用哈希函数(Hash Function)。哈希函数的具体定义,大家可以在网上或者相关书籍中查阅到,简单地说,它的特性如下:

(1)原始密码经哈希函数计算后得到一个哈希值

(2)改变原始密码,哈希函数计算出的哈希值也会相应改变

(3) 同样的密码,哈希值也是相同的

(4) 哈希函数是单向、不可逆的。也就是说从哈希值,你无法推算出原始的密码是多少

有了哈希函数,我们就可以将密码的哈希值存储进数据库。用户登录网站的时候,我们可以检验用户输入密码的哈希值是否与数据库中的哈希值相同。

 

由于哈希函数是不可逆的,即使有人打开了数据库,也无法看到用户的密码是多少。

那么存储经过哈希函数加密后的密码是否就是安全的了呢?我们先来看一下几种常见的破解密码的方法。

 

(二) 几种常见的破解密码的方法

 

最简单、常见的破解方式当属字典破解(Dictionary Attack)和暴力破解(Brute Force Attack)方式。这两种方法说白了就是猜密码。

 

字典破解和暴力破解都是效率比较低的破解方式。如果你知道了数据库中密码的哈希值,你就可以采用一种更高效的破解方式,查表法(Lookup Tables)。还有一些方法,比如逆向查表法(Reverse Lookup Tables)、彩虹表(Rainbow Tables)等,都和查表法大同小异。现在我们来看一下查表法的原理。

 

查表法不像字典破解和暴力破解那样猜密码,它首先将一些比较常用的密码的哈希值算好,然后建立一张表,当然密码越多,这张表就越大。当你知道某个密码的哈希值时,你只需要在你建立好的表中查找该哈希值,如果找到了,你就知道对应的密码了。

 

(三) 为密码加盐(Salt)

 

从上面的查表法可以看出,即便是将原始密码加密后的哈希值存储在数据库中依然是不够安全的。那么有什么好的办法来解决这个问题呢?答案是加盐。

 

盐(Salt)是什么?就是一个随机生成的字符串。我们将盐与原始密码连接(concat)在一起(放在前面或后面都可以),然后将concat后的字符串加密。采用这种方式加密密码,查表法就不灵了(因为盐是随机生成的)。

 

(四) 在.NET中的实现

 

在.NET中,生成盐可以使用RNGCryptoServiceProvider类,当然也可以使用GUID。哈希函数的算法我们可以使用SHA(Secure Hash Algorithm)家族算法,当然哈希函数的算法有很多,比如你也可以采用MD5。这里顺便提一下,美国政府以前广泛采用SHA-1算法,在2005年被我国山东大学的王小云教授发现了安全漏洞,所以现在比较常用SHA-1加长的变种,比如SHA-256。在.NET中,可以使用SHA256Managed类。

 

下面来看一段代码演示如何在.NET中实现给密码加盐加密。加密后的密码保存在MySQL数据库中。

下面的代码演示如何注册一个新帐户。盐的生成可以使用新Guid,也可以使用RNGCryptoServiceProvider 类。将byte[]转换为string,可以使用Base64String(我在以前的博客中介绍过Base 64 Encoding 编码),也可以使用下面的ToHexString方法。

 

[csharp]  view plain  copy
 
  1. protected void ButtonRegister_Click(object sender, EventArgs e)   
  2. {   
  3.     string username = TextBoxUserName.Text;   
  4.     string password = TextBoxPassword.Text;   
  5.     // random salt   
  6.     string salt = Guid.NewGuid().ToString();  
  7.   
  8.     // random salt   
  9.     // you can also use RNGCryptoServiceProvider class              
  10.     //System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();   
  11.     //byte[] saltBytes = new byte[36];   
  12.     //rng.GetBytes(saltBytes);   
  13.     //string salt = Convert.ToBase64String(saltBytes);   
  14.     //string salt = ToHexString(saltBytes);   
  15.                    
  16.     byte[] passwordAndSaltBytes = System.Text.Encoding.UTF8.GetBytes(password + salt);              
  17.     byte[] hashBytes = new System.Security.Cryptography.SHA256Managed().ComputeHash(passwordAndSaltBytes);  
  18.   
  19.     string hashString = Convert.ToBase64String(hashBytes);  
  20.   
  21.     // you can also use ToHexString to convert byte[] to string   
  22.     //string hashString = ToHexString(hashBytes);   
  23.       
  24.     var db = new TestEntities();   
  25.     usercredential newRecord = usercredential.Createusercredential(username, hashString, salt);   
  26.     db.usercredentials.AddObject(newRecord);   
  27.     db.SaveChanges();   
  28. }  
  29.   
  30.    
  31.   
  32. string ToHexString(byte[] bytes)   
  33. {   
  34.     var hex = new StringBuilder();   
  35.     foreach (byte b in bytes)   
  36.     {   
  37.         hex.AppendFormat("{0:x2}", b);   
  38.     }   
  39.     return hex.ToString();   
  40. }  


下面的代码演示了如何检验登录用户的密码是否正确。首先检验用户名是否存在,如果存在,获得该用户的盐,然后用该盐和用户输入的密码来计算哈希值,并和数据库中的哈希值进行比较。

 

 

[csharp]  view plain  copy
 
  1. protected void ButtonSignIn_Click(object sender, EventArgs e)   
  2. {   
  3.     string username = TextBoxUserName.Text;   
  4.     string password = TextBoxPassword.Text;  
  5.   
  6.     var db = new TestEntities();   
  7.     usercredential record = db.usercredentials.Where(x => string.Compare(x.UserName, username, true) == 0).FirstOrDefault();   
  8.     if (record == default(usercredential))   
  9.     {   
  10.         throw new ApplicationException("invalid user name and password");   
  11.     }  
  12.   
  13.     string salt = record.Salt;   
  14.     byte[] passwordAndSaltBytes = System.Text.Encoding.UTF8.GetBytes(password + salt);   
  15.     byte[] hashBytes = new System.Security.Cryptography.SHA256Managed().ComputeHash(passwordAndSaltBytes);   
  16.     string hashString = Convert.ToBase64String(hashBytes);  
  17.   
  18.     if (hashString == record.PasswordHash)   
  19.     {   
  20.         // user login successfully   
  21.     }   
  22.     else   
  23.     {   
  24.         throw new ApplicationException("invalid user name and password");   
  25.     }   
  26. }  


总结:单单使用哈希函数来为密码加密是不够的,需要为密码加盐来提高安全性,盐的长度不能过短,并且盐的产生应该是随机的。

aes 加密 解密with salt aes加密with salt  ,可变输出密文, 密度更高级别,现在没有实际使用。 package util; import java.security.SecureRandom; import java.security.spec.KeySpec; import javax.crypto.Cipher; import javax.crypto.SecretKey; impo... 阅读详情

相关推荐

hash算法概念和hash加盐法

hash算法简单介绍,以及hash加盐法的简单介绍

社区之星的专栏 3691

哈希加盐法(HASH+SALT)

一些网站的数据库管理着用户的ID及口令,口令以MD5等加密后的

蒟蒻升级中...Orz 2万+

迭代慢hash密码让你的用户更放心

前言 项目中,用户的登录密码怎么保存呢?明文?MD5加密?MD5加盐?其实这些做法都不是很好的选择!原因如下: 明文肯定是不可取的,一旦数据库被“脱裤”了,基本上用户信息就完蛋了 简单的MD5加密安全性上只比明文高一点,为什么呢?只要你有一个MD5加密集,对照数据库里的密文,很容易就能把密码破解出来!常用的手段就是:字典破解、彩虹表 MD5加盐,其实就是在生成密码MD5值的时候,随机拼接一个字...

qq_36655073的博客 1235

C#使用 Salt + Hash 来为密码加密

(一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站用户的密码),你要考虑如何保护这些密码数据,象下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码。 解决的办法是将密码加密后再存储进数据库,比较常用的加密方法是使用哈希函数(Hash Function)。哈希函数的具体定义,大家可以在网上或者相关书籍中查阅到,简单地说,它的特性如

chengly0129的专栏 2221

密码哈希技术

SHA-3 是 SHA-2 的后继者,由 NIST(美国国家标准与技术研究院)通过全球竞赛选定,最终由 Keccak 团队开发的算法胜出。本文将深入探讨密码哈希的基本原理、哈希碰撞的风险、SHA-2/SHA-3 等现代哈希算法的安全性,以及哈希在文件完整性校验中的应用。SHA-2 目前仍然足够安全,但 SHA-3 作为下一代哈希算法,提供了更高的安全性。,如果黑客攻破数据库,所有用户的密码都会被泄露。由于 MD5 的安全性已被攻破,建议使用更安全的哈希算法,如 SHA-2 或 SHA-3。

idlecloud0105的博客 1484

C#实现MD5加密登录用户名与密码的安全实践

是MD5类中最常用的成员方法,用于将任意输入数据转换为固定长度的 128 位哈希值。该方法支持多种输入形式,适应不同的应用场景。理解其参数差异、执行模式和状态管理机制,对于高效且安全地使用 MD5 至关重要。方法有多个重载,此处使用byte[]版本最为常见。其输出始终为16 字节(128位)的固定长度数组。示例演示多次调用的行为:输出:这表明每次调用都会独立计算哈希,无需手动重置状态——只要是在新的using块内创建实例即可。❗ 注意:若复用同一个。

weixin_29840475的博客 886

哈希密码的加盐强化

在当今的信息时代,数据安全的重要性不言而喻。我们的系统中包含了许多敏感数据,其中就包括用户的密码。尽管密码是敏感的,但直接存储明文密码会导致严重的安全问题。因此,对密码进行哈希加密以提供更好的安全性是常见的做法。在这篇文章中,我将带你深入理解加盐哈希加密算法,并演示如何在Java中实现它。

书生-w的博客 7595

RTX 4060笔记本也能跑!保姆级教程:用Ollama在Windows上部署DeepSeek-R1-8B模型

本文详细介绍了如何在RTX 4060笔记本上通过Ollama本地部署DeepSeek-R1-8B模型,提供从环境配置到性能调优的全流程优化指南。针对笔记本用户的显存、散热等问题,给出了量化模型选择、启动参数优化及散热解决方案,帮助用户在消费级硬件上高效运行大语言模型。

weixin_28745067的博客 524

使用Hash加密用户密码

本文介绍了使用Hash加密和Salt盐值保护用户密码的方法。主要内容包括:1)Hash加密不可逆,通过二次Hash校验密码;2)每次加密使用随机Salt避免相同密码的Hash结果重复;3)数据库需存储Hash值和Salt值;4)提供了C#实现代码示例,包含生成Salt、计算Hash和验证密码的方法;5)演示了用户注册和登录时的密码处理流程。这种方法有效防止数据库泄露导致密码暴露,提升了系统安全性。全文提供了完整的技术实现方案。

HQL_Q的博客 270

攀藤PMS系列传感器STM32驱动开发与数据解析实战

本文详细介绍了攀藤PMS系列传感器与STM32微控制器的驱动开发与数据解析实战,涵盖硬件连接、数据协议解析、驱动源码编写及数据处理优化。重点解析了传感器数据帧结构,提供了完整的STM32驱动实现代码,并分享了实际应用中的问题排查与性能优化经验,帮助开发者快速实现高精度颗粒物浓度检测。

milk8的博客 347

php对接建行h5网页支付

php对接建行h5网页支付前言H5页面支付H5页面支付回调通知退款及其他的业务 前言 最近接到公司乙方要求,需要再支付上面增加建行的支付渠道。之前一直用的都是微信和支付宝这种第三方支付平台,银行直接对接比较少。没办法就只能上网搜索,搜索一番返现网上对接建行的资料比较少,没办法只好摸着石头过河,中间也借鉴了一些大佬的文章内容。 H5页面支付 根据建行的h5网页支付对接文档,还是可以看出是比较简单的。...

lihua100862的博客 5407

Sha256Hash+salt 加密

1.对比 2.加密种类的简单了解 3.为什么要加盐salt? 4.如何验证登录 1.对比 无加密数据库 2.加密之后的 2.加密种类的简单了解 常见加密算法分类 对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES 非对称加密算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Ga...

老孟嘚吧嘚 2万+

5分钟搞定Vivado IP核的VCS仿真:从Export脚本到Verdi波形查看全流程

本文详细介绍了如何利用Vivado的Export Simulation功能,快速搭建Vivado IP核的VCS与Verdi联合仿真环境。通过自动化脚本生成、FSDB波形配置及高效调试技巧,实现从工程导出到波形查看的全流程,大幅提升FPGA验证效率,尤其适合IC验证工程师和竞赛团队。

weixin_29306261的博客 475

vue-example-login密码加密教程:双重SHA1哈希算法实现详解

vue-example-login是一个基于Vue.js的登录示例项目,它展示了如何在前端实现安全的密码加密处理。本文将详细介绍该项目中使用的双重SHA1哈希算法实现方法,帮助开发者理解前端密码加密的核心原理和实践步骤。 ## 为什么需要前端密码加密? 在Web应用中,密码安全是至关重要的一环。直接将明文密码发送到服务器会带来极大的安全风险,一旦数据在传输过程中被截获,用户密码就会泄露。前端密

gitblog_00051的博客 736

PlutoSDR在matlab中的环境配置(包括驱动和硬件支持包)

双击下载到的驱动,除了点击接受协议和设置安装路径,其他只要点击下一步或者安装即可。登录或者注册你的账号,选择你的matlab版本(这里我的是2023b),点击下一步。设置安装路径,并选择我接受,点击下一步,即可安装完成,并在安装路径中得到。完成后,打开设备管理器,在端口和通用串行总线设备一栏,即可看见下图。点击进入,选择相应的系统安装包,这里我选择的Windows。可看到我们要安装的Pluto支持包,安装即可。右击桌面matlab,选择打开文件所在位置。右上角搜索pluto,选择并点击下一步。

weixin_53160338的博客 4864

DSP28335学习笔记——McBSP配置为SPI

由于28335硬件外设上只有一个SPI接口,所以当SPI接口不够用时,可以将McBSP配置为SPI接口。 参考28335的数据手册,当DSP为主机时,配置McBSP为SPI所用到的接线如下图所示。 另外总结一些调试过程中的经验。 1.传输数据位数的确定 由RCR1寄存器中的RWDLEN1和XCR1寄存器中的XWDLEN1决定。分别对应着接受和发送的位数,在配置成SPI模式的时候,这

捕虫少年 1万+

密码与加密基础篇(3):salt 和 pepper 到底是什么?为什么 salt 可以放数据库?

本文深入解析了密码存储中的两个关键概念:salt和pepper。salt是公开的随机字符串,主要作用是防止相同密码产生相同哈希值,避免彩虹表攻击,可安全存储在数据库中;pepper则是服务端私有秘密,用于在数据库泄露后增加破解难度,必须严格保密且不应存储在数据库。文章强调现代密码存储应优先使用bcrypt/Argon2id等慢哈希算法,配合salt和pepper形成多层防护。同时指出常见误区,如混淆两者的保密要求或试图用pepper替代安全哈希算法。最终建议完整的密码安全策略应包含:强哈希算法、salt机制

Mark Wu 的博客 948

64、5G 侧链通信技术详解

本文详细解析了5G侧链通信的关键技术,包括资源感知与选择、UE间协调、混合ARQ、功率控制、信道探测与CSI报告以及侧链同步。资源感知与选择通过周期性或随机方式实现资源分配,UE间协调通过主动或被动方式避免资源冲突。混合ARQ机制确保数据传输可靠性,功率控制和信道探测优化传输质量并减少干扰。侧链同步则通过多种方式确保设备间时间一致性。这些技术相互配合,构建了高效稳定的5G侧链通信体系,适用于智能交通、物联网、应急通信等多个领域,为未来无线通信发展提供强大支撑。

oil88的博客 99

使用 Salt + Hash 来为密码加密

使用 Salt + Hash 来为密码加密 2013年11月20日 09:43:44 wxwzy738 阅读数:20506 转:http://www.cnblogs.com/jfzhu/archive/2012/12/20/2825802.html 我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码。 加Salt...

jgn_123的博客 1868

基于 Langchain 开发一个完整的支持多轮数据分析(直连 mysql 数据,多表综合分析 SQL 取数,数据分析,报表生成)ChatBI 系统(前后端完整实现源代码)

ChatBI系统开发摘要 本文介绍了基于Langchain的多轮数据分析ChatBI系统开发方案。该系统支持MySQL数据库连接,提供多表分析、SQL查询、数据分析和报表生成功能。系统采用前后端分离架构:前端使用React+Ant Design+ECharts实现交互界面;后端基于FastAPI搭建服务,集成Langchain处理自然语言到SQL的转换;核心技术栈还包括SQLAlchemy、Pandas和Matplotlib。 系统核心模块包括: 数据库连接层:使用SQLAlchemy管理MySQL连接 L

AI天才研究院 812

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

用户密码加密 MD5+Salt

用户密码加密 MD5+Salt 1.设计工具类 EncrptUtil和SaltUtil类分别实现MD5散列和随机生成16位salt // 生成MD5值 public class EncryptUtil { public static String md5(String plainText){ String encryStr=null; if(plainText==null&&!"".equals(plainText)){

qq_33811654的博客 1078

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

salt值(盐值)

即使黑客有密文查询到的值,也是加了salt值的密码,而非用户设置的密码。而当用户登录时,系统为用户提供的代码撒上同样的加盐值,然后散列,再比较散列值,已确定密码是否正确。2、产生:随着对MD5密文查询工具的出现,而很多用户的密码又设置简单,单纯的对用户密码进行MD5加密后保存,用密文很容易就能反查询得到某用户的密码。SALT值属于随机值。5、其它:经过添加salt值处理的密码,即使用户设置的原密码是相通的,数据库中的密文却是不同的。-----明文----> 单向散列算法 ----->密文。

wys0127的博客 2907

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

使用哈希加盐法来为密码加密

(一)为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站用户的密码),你要考虑如何保护这些密码数据,象下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码。   解决的办法是将密码加密后再存储进数据库,比较常用的加密方法是使用哈希函数(Hash Function)。哈希函数的具体定义,大家可以在网上或者相关书籍中查阅到,

每天积累一点,一年后你会发现,自己变化很大 2996

Shiro - 初识 Shiro 加密 实现密码的简单加密存储

摘要 本文介绍了Apache Shiro框架在密码安全存储中的应用,重点讲解了如何使用Shiro实现密码加密存储。主要内容包括: Shiro框架简介:作为Java安全框架,提供认证、授权、会话管理和加密功能 密码加密的必要性:分析了明文存储的风险,强调了单向哈希加盐的重要性 Shiro加密模块:介绍了HashService、SimpleHash等核心类及SHA-256等安全算法 实践指南: 使用SecureRandomNumberGenerator生成安全盐值 通过SimpleHash实现密码哈希计算 完整

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

盐哈希与AES加密:我们该如何保护好用户数据?

【盐哈希与AES加密:开发者必懂的安全基石】 盐哈希和AES加密是保障系统安全的两大核心技术。盐哈希采用单向加密,通过为每个密码添加随机盐值(如SHA-256加盐),有效抵御彩虹表攻击,适用于密码存储等验证场景。AES作为对称加密算法,使用同一密钥进行加解密(推荐256位+GCM模式),适合敏感数据存储和通信加密,其安全性依赖于严格的密钥管理。两者本质区别在于:盐哈希用于数据验证(不可逆),AES用于数据保密(可逆)。实际开发中,密码存储必用盐哈希,而需还原的敏感数据则采用AES加密,配合专业密钥管理服务(

明月朗,潇水寒 1428

salt盐度与用户密码加密机制

<br />  我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码。<br />  加Salt可以一定程度上解决这一问题。所谓加Salt方法,就是加点“佐料”。其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,已确定密码是否正确。<br />  这里的“佐料”被称作“Salt值”,这个值

yanick技术博客 6299
上一篇: jquery引入项目后原本的js函数不能调用,显示错误是未声明函数
下一篇: jsp自定义tag在项目中的应用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值