程序员之网络安全系列(二):如何安全保存用户密码及哈希算法

简介:

系列目录:

前言

在很多网站的早期,甚至是现在仍然有一些网站,当你点击忘记密码功能时,你的邮箱会收到一封邮件,然后里面赫然写着你的密码,很多普通用户还会觉得庆幸,总算是找回来了,殊不知,这是多么可怕地一件事,说明了网站是“几乎是”明文存储你的密码,一旦数据用户数据泄露或者被拖库,那么用户密码将赤裸裸的暴露了,想想之前几次互联网密码泄露事件。

那么如何解决呢?

加密

为了不让密码明文存储,我们需要对密码进行加密,这样即使数据库用户密码暴露,也是加密后的。但是如何让加密后的数据难以解密呢?我们现在比较流行的做法就是把密码进行Hash存储。

Hash

哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式. 典型的哈希算法包括 MD2、MD4、MD5 和 SHA-1

Hash算法是给消息生成摘要,那么什么是摘要呢?

举个例子:

比如你给你女朋友写了一封邮件,确保没被人改过,你可以生成这样一份摘要 “第50个字是我,第100个字是爱, 第998个字是你”,那么你女朋友收到这个摘要,检查一下你的邮件就可以了。

Hash算法有两个非常主要的特征:

  • 不能通过摘要来反推出原文
  • 原文的非常细小的改动,都会引起Hash结果的非常大的变化

因此,这个比较适合用来保存用户密码,因为不能反推出用户密码,Hash结果一致就证明原文一致,我们来用Ruby代码试一下上面的第二点 (MD5是一种常用的Hash算法)

2.2.3 :003 > require 'digest/md5.so'
=> true
2.2.3 :004 > puts Digest::MD5.hexdigest('I love you')
e4f58a805a6e1fd0f6bef58c86f9ceb3
=> nil
2.2.3 :005 > puts Digest::MD5.hexdigest('I love you!')
690a8cda8894e37a6fff4d1790d53b33
=> nil
2.2.3 :006 > puts Digest::MD5.hexdigest('I love you !')
b2c63c3ca6019cff3bad64fcfa807361
=> nil
2.2.3 :007 > puts Digest::MD5.hexdigest('I love you')
e4f58a805a6e1fd0f6bef58c86f9ceb3
=> nil
2.2.3 :008 > 

那么我们在使用MD5保存密码时候的验证流程是什么呢?

  • 用户注册时,把用户密码是MD5(password)后保存到数据库。
  • 用户输入用户名和密码
  • 服务器从数据库查找用户名
  • 如果有这个用户,A=MD5(input password), B=Database password
  • 如果A==B, 那么说明用户密码输入正确,如果不相等,用户输入错误。

为什么Hash(MD5)后仍然不够安全?

穷举

但是,如果你认为就只是这样密码就不会被人知道,那么就不对了,这只是比明文更安全,为什么?

因为,大部分人的密码都非常简单,当拿到MD5的密码后,攻击者也可以通过比对的方式,比如你的密码是4218

2.2.3 :008 > puts Digest::MD5.hexdigest('4218')
d278df4919453195d221030324127a0e

那么攻击者可以把1到4218个数字都MD5一下,然后和你密码的MD5对比一下,就知道你原密码是什么了。

曾经我的密码箱密码忘了,我把锁给撬了,后来我才想起可以用穷举法,最多就999次不就打开了?那么问题来了,你的密码箱还安全吗?

彩虹表

除了穷举法外,由于之前的密码泄露,那么攻击者们,手上都有大量的彩虹表,比如"I love you",生日等等,这个表保存了这些原值以及MD5后的值,那么使用时直接从已有库里就可以查出来对应的密码。

加盐 Salt

那么,由于简单的对密码进行Hash算法不够安全,那么我们就可以对密码加Salt,比如密码是"I love you", 虽然彩虹表里有这条数据,但是如果加上"安红我爱你",这样MD5结果就大不一样.

jacks-MacBook-Air:~ jack$ irb
2.2.3 :001 > require 'digest/md5.so'
=> true
2.2.3 :002 > puts Digest::MD5.hexdigest('I love you')
e4f58a805a6e1fd0f6bef58c86f9ceb3
=> nil
2.2.3 :003 > puts Digest::MD5.hexdigest('I love you安红我爱你')
b10d890bf46b1a045eb99af5d43c7b13
=> nil
2.2.3 :004 > puts Digest::MD5.hexdigest('I dont love you')
c82294c9a7b6e4a372ad25ed4d6011c9
=> nil
2.2.3 :005 > puts Digest::MD5.hexdigest('I dont love you安红我爱你')
dce67bcdfdf007445dd4a2c2dc3d29c1
=> nil
2.2.3 :006 >

如此一来,因为攻击者很难猜到“安红我爱你”,那么自然彩虹表里是没有的,当然我建议你在实际项目中不要使用"安红我爱你",你应该使用一个连你自己都猜不到的较长的字符串。

加盐了,就安全了吗?

实际上,加盐并不能100%保证安全,假如有人泄露了你的Salt呢?实际上通过反编译程序很容易可以拿到这个,由于WEB程序一般放在WEB服务器上,那么就需要保证服务器不被攻击,当然这个是运维人员去操心。

为了让加盐更安全,一般情况下我们可以使用一个“盐+盐”,也就是为每个用户保存一个"Salt", 然后再使用全局的盐,我们可以对用户的盐使用自己的加密算法。那么代码就如下:

if MD5(userInputPpassword+globalsalt+usersalt)===user.databasePassword) 
{
    login success
}

普通用户如何做?

由于这个是写给程序员,当然是说在前端用户注册时密码应该如何设置,很简单,我们要求用户必须输入强密码!但是,我知道很多用户觉得很烦,这样你就失掉了一个用户,但我们需要做一个适当的折中,比如至少有一个大写字母,小写字母和数字的组合。

最后

我们来看看解决了之前文章下面例子的什么问题。

假如,明明和丽丽相互不认识,明明想给丽丽写一封情书,让隔壁老王送去

  1. 如何保证隔壁老王不能看到情书内容?(保密性)
  2. 如何保证隔壁老王不修改情书的内容?(完整性)
  3. 如何保证隔壁老王不冒充明明?(身份认证)
  4. 如何保证明明不能否认情书是自己写的?(来源的不可否认)

o_security-1.png

通过了解hash算法,"明明" 就有办法让丽丽知道信的内容没有修改,他可以对邮件进行Hash生成邮件的摘要,然后让"隔壁的李叔叔"把摘要送给丽丽,丽丽拿到邮件的摘要后,把邮件内容也Hash一下,然后把结果和"隔壁的李叔叔"给的摘要对比一下,然后通过比较结果就知道邮件有没有被"隔壁的王叔叔"更改过了。

本文转自敏捷的水博客园博客,原文链接http://www.cnblogs.com/cnblogsfans/p/5120132.html如需转载请自行联系原作者


王德水

相关文章
|
1天前
|
安全 JavaScript 前端开发
第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题—B模块安全事件响应/网络安全数据取证/应用安全
该内容描述了一次网络安全演练,包括七个部分:Linux渗透提权、内存取证、页面信息发现、数字取证调查、网络安全应急响应、Python代码分析和逆向分析。参与者需在模拟环境中收集Flag值,涉及任务如获取服务器信息、提权、解析内存片段、分析网络数据包、处理代码漏洞、解码逆向操作等。每个部分都列出了若干具体任务,要求提取或生成特定信息作为Flag提交。
3 0
|
1天前
|
安全 测试技术 网络安全
2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C安全事件响应/网络安全数据取证/应用安全
B模块涵盖安全事件响应和应用安全,包括Windows渗透测试、页面信息发现、Linux系统提权及网络安全应急响应。在Windows渗透测试中,涉及系统服务扫描、DNS信息提取、管理员密码、.docx文件名及内容、图片中单词等Flag值。页面信息发现任务包括服务器端口、主页Flag、脚本信息、登录成功信息等。Linux系统渗透需收集SSH端口号、主机名、内核版本,并实现提权获取root目录内容和密码。网络安全应急响应涉及删除后门用户、找出ssh后门时间、恢复环境变量文件、识别修改的bin文件格式及定位挖矿病毒钱包地址。
3 0
|
1天前
|
安全 测试技术 Linux
2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A模块安全事件响应/网络安全数据取证/应用安全
该内容描述了一个网络安全挑战,涉及Windows和Linux系统的渗透测试以及隐藏信息探索和内存取证。挑战包括使用Kali Linux对Windows Server进行服务扫描、DNS信息提取、密码获取、文件名和内容查找等。对于Linux系统,任务包括收集服务器信息、提权并查找特定文件内容和密码。此外,还有对Server2007网站的多步骤渗透,寻找登录界面和页面中的隐藏FLAG。最后,需要通过FTP获取win20230306服务器的内存片段,从中提取密码、地址、主机名、挖矿程序信息和浏览器搜索关键词。
2 0
|
1天前
|
安全 测试技术 网络安全
2024年甘肃省职业院校技能大赛中职组 “网络安全”赛项竞赛样题-C模块安全事件响应/网络安全数据取证/应用安全
涉及安全事件响应和应用安全测试。需使用Kali对Windows Server2105进行渗透测试,包括服务扫描、DNS信息提取、管理员密码、文件名与内容、图片中单词等。另外,需收集win20230305的服务器端口、页面信息、脚本、登录后信息等。在Linux Server2214上,要获取SSH端口、主机名、内核版本并进行提权操作。网络安全响应针对Server2228,涉及删除后门用户、查找SSH后门时间、恢复环境变量、识别篡改文件格式和矿池钱包地址。最后,对lin20230509进行网站渗透,获取端口号、数据库服务版本、脚本创建时间、页面路径、内核版本和root目录下的flag文件内容
3 0
|
5天前
|
存储 安全 网络安全
构筑安全之盾:云计算环境下的网络安全与信息保护策略
【4月更文挑战第19天】随着云计算技术的飞速发展,企业和个人越来越依赖于云服务来存储、处理和交换数据。然而,这种便利性背后隐藏着潜在的安全风险。本文深入探讨了在云计算背景下,如何通过综合性的安全措施和策略来强化网络安全防护,确保数据的完整性、可用性和机密性。我们将分析当前面临的主要安全挑战,并基于最新的技术进展提出相应的解决方案,以期达到有效防御外部威胁和内部漏洞的目的。
16 4
|
5天前
|
运维 监控 安全
等保合规:保护企业网络安全的必要性与优势
等保,全称为“信息安全等级保护”,是国家强制性标准,要求特定行业和企业通过安全评估确保网络安全。等保涉及物理安全(如门禁、人员管理、设备保护等)、网络安全、主机安全、应用与数据安全、制度与人员安全、系统建设管理及系统运维管理等七个方面,确保信息系统的安全和可靠性。企业进行等保合规是为了满足《网络安全法》等法律法规要求,防止网络数据泄露,避免罚款。等保工作包括定级备案、安全测评、建设整改等,企业需建立良好的安全保护生态,确保网络安全。通过等保,企业能构建有效的安全保障体系,防御系统入侵,保障用户信息,提升故障修复效率,并符合法律义务。
|
5天前
|
人工智能 监控 安全
构筑安全之盾:云计算环境下的网络安全策略与实践
【4月更文挑战第19天】 在数字化转型的浪潮中,云计算已成为企业IT架构的核心组成部分。然而,随着云服务使用的普及化,网络安全问题亦变得日益复杂和挑战性。本文将深入探讨如何在云计算环境中实施有效的网络安全策略,保障数据的安全性和完整性。我们将从云服务模型出发,分析不同服务模型下的安全威胁,并提出相应的防护措施。文章还将讨论信息安全管理的最佳实践,包括加密技术、身份验证、访问控制以及安全监控等方面,旨在为企业提供一套全面的云计算安全防护框架。
|
6天前
|
安全 网络协议 网络安全
保障数字世界的安全壁垒:网络安全与信息安全探究
在数字化浪潮的推动下,网络安全和信息安全日益成为社会发展的重要议题。本文将从网络安全漏洞、加密技术和安全意识等方面展开探讨,以期为读者呈现一幅数字世界安全的全景图,并提供一些应对措施与建议。
14 1
|
7天前
|
运维 安全 Cloud Native
安全访问服务边缘(SASE):网络新时代的安全与连接解决方案
SASE(安全访问服务边缘)是一种云基安全模型,结合了网络功能和安全策略,由Gartner在2019年提出。它强调身份驱动的私有网络、云原生架构和全面边缘支持,旨在解决传统WAN和安全方案的局限性,如高延迟和分散管理。SASE通过降低IT成本、提升安全响应和网络性能,应对数据分散、风险控制和访问速度等问题,适用于移动办公、多分支办公等场景。随着网络安全挑战的增加,SASE将在企业的数字化转型中扮演关键角色。
|
9天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。

热门文章

最新文章