哪种哈希算法保证数据完整性(如何安全保存用户密码及哈希算法)
哪种哈希算法保证数据完整性(如何安全保存用户密码及哈希算法)
2024-11-22 12:57:54  作者:离人眼  网址:https://m.xinb2b.cn/sport/xdv511692.html
前言

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

那么如何解决呢?

加密

为了不让密码明文存储,我们需要对密码进行加密,这样即使数据库用户密码暴露,也是加密后的。但是如何让加密后的数据难以解密呢?我们现在比较流行的做法就是把密码进行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'=> true2.2.3 :004 > puts Digest::MD5.hexdigest('I love you')e4f58a805a6e1fd0f6bef58c86f9ceb3=> nil2.2.3 :005 > puts Digest::MD5.hexdigest('I love you!')690a8cda8894e37a6fff4d1790d53b33=> nil2.2.3 :006 > puts Digest::MD5.hexdigest('I love you !')b2c63c3ca6019cff3bad64fcfa807361=> nil2.2.3 :007 > puts Digest::MD5.hexdigest('I love you')e4f58a805a6e1fd0f6bef58c86f9ceb3=> nil2.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$ irb2.2.3 :001 > require 'digest/md5.so'=> true2.2.3 :002 > puts Digest::MD5.hexdigest('I love you')e4f58a805a6e1fd0f6bef58c86f9ceb3=> nil2.2.3 :003 > puts Digest::MD5.hexdigest('I love you安红我爱你')b10d890bf46b1a045eb99af5d43c7b13=> nil2.2.3 :004 > puts Digest::MD5.hexdigest('I dont love you')c82294c9a7b6e4a372ad25ed4d6011c9=> nil2.2.3 :005 > puts Digest::MD5.hexdigest('I dont love you安红我爱你')dce67bcdfdf007445dd4a2c2dc3d29c1=> nil2.2.3 :006 >

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

加盐了,就安全了吗?

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

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

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

普通用户如何做?

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

最后

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

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

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


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

  • 端游lol云顶之弈新版阵容图(云顶之弈如何在手机玩)
  • 2024-11-22云顶之弈如何在手机玩腾讯作为国内最大的游戏厂商之一,一直受到众多玩家与媒体的关注近期,WeGame新上线了手机串流功能,引起了许多PC玩家的注意,因为串流功能的到来,就意味着PC玩家可以告别电脑,通过手机也可以进行PC游。
  • 做好自己不必自己跟自己过不去(为什么可能毁了你的生活)
  • 2024-11-22为什么可能毁了你的生活“做自己”虽然是个好口号,但可能会演变成一种失败主义的说法,带有逃避现实、停止成长的含义真正的做自己则是需要我们努力成为最好的自己,同时保持诚实和同情心,不断进步成长,这样才能实现更好的自我此外,我们。
  • 设备管理超级密码查询(方便管理所有密码)
  • 2024-11-22方便管理所有密码你记了多少个密码?办公室电脑密码、笔记本密码、家里电脑密码、上网帐号密码、手机服务密码、邮箱密码、QQ密码、银行卡查询密码、银行卡交易密码、银行卡网上支付密码……铅锤哥今天想去查下公积金账户,发现忘记。
  • 为什么优柔寡断处事不果断(一个人从优柔寡断到杀伐果决)
  • 2024-11-22一个人从优柔寡断到杀伐果决1如果善良总让自己受伤,那就收一收一个人从优柔寡断,温顺善良,到杀伐果决,坚硬决绝,他一定经历了普通人无法想到的恐怖,承受了常人难以承受的伤痛,你可以说这叫凤凰涅槃浴火重生,也可以说历经九九八十一难终。
  • 它的意思(它的含义)
  • 2024-11-22它的含义它tāㄊㄚˉ始见于甲骨文蛇、它、也三字形有相混现象自战国后才开始逐渐明确区分《说文解字》:“虫也从虫而长,象冤曲垂尾形上古艸居患它,故相问无它乎蛇,它或从虫”蛇是它之范式,本义是蛇因字义细化它加虫变声。
  • 南北极为啥用s和n表示(南北极用s和n表示的解析)
  • 2024-11-22南北极用s和n表示的解析因为南极英文为South,北极英文为North,其符号代表为英文单词的首字母北极以为地球的最北端,单词为NorthPole;南极以为地球的最南端,单词为SouthPole由于英文是国际通用语言,像此类。
  • 选调生会升到什么级别(有种大学生叫选调生)
  • 2024-11-22有种大学生叫选调生大学生就业历来都是难题,随着就业市场不断成熟,再加上还有大批往届毕业生和失业人员,都让大学生就业变得“雪上加霜”就业竞争越发激烈,大学生也纷纷另寻出路,不是在考研的路上,便是在考公的路上,而前者能获得。
  • 瑞虎8plus 为什么是中型suv(外观尺寸巨无霸)
  • 2024-11-22外观尺寸巨无霸预算有限,又想购买一辆大空间的颜值SUV,该如何选择呢?这时候你不妨考虑一下自主品牌一款车型靠着一己之力支撑着整个汽车品牌,你相信吗?很多人表示并不相信,但事实就是如此,比如奇瑞旗下的瑞虎8车型其实奇。
  • 败絮其中上一句是什么(败絮其中的出处)
  • 2024-11-22败絮其中的出处是“金玉其外”整句话合起来是一句千古名句“金玉其外,败絮其中”意思是:外面像金像玉,里面却是破棉絮比喻外表漂亮,内里破败虚有华美的外表,实质却一团糟金玉:比喻华美;败絮:烂棉花此成语用来表达贬义,现在。
  • 自古金陵繁华地文章(深阅读金陵佳人)
  • 2024-11-22深阅读金陵佳人来源:紫金山新闻今年,南京无数朵铿锵玫瑰绽放在战“疫”一线,让人敬佩其实,金陵自古多佳人“江南佳丽地,金陵帝王州”从南京走出过诸多才女佳人,中国第一所现代意义上的女子大学在南京,中国公学的首批女大学生。
  • 最简单的清蒸鱼家常做法(厨师长教你肉末蒸黄鱼的小技巧)
  • 2024-11-22厨师长教你肉末蒸黄鱼的小技巧大家好,我是第一美食的阿飞,关注阿飞,有更多的家常美食供大家参考今天为大家分享一道家常蒸黄鱼的做法,小黄鱼也就是黄花鱼,有非常高的营养价值,黄鱼含有丰富的蛋白质、矿物质和维生素,对人体有很好的补益作用。