密码加密
我们的项目如果是使用flask框架开发的话,那么可以使用flask中提供的安全模块,将密码进行加密。这样做的好处是保障用户信息安全,要不然公司内任何一个程序员都可以从数据库查询到相关的私密敏感信息,如果发生泄漏,后果不堪设想。这只是一种小概率事件,那么大概率事件是什么呢?如果网站做的足够大,用户群体十分庞大,那么肯定会有一些不法分子会入侵,攻破网站盗取数据啊,如果我们加密之后,是不是就安全多了呢?
你一开始想到的就是哈希,对不对?对,但是不全面。经过老师的指导,我查了相关的资料,发现了还要加盐......首先声明,这里的盐并不是吃的食用盐,而是盐值,说白了就是一段随机的字符串。那么加盐哈希怎么用呢?简单的来说就是将这个随机的字符串混入密码中,然后再通过哈希加密。这在工作中可是常用的,也是相对来说安全的一种方式。作为拓展内容,大家了解即可。如果想深入探究,那么我推荐大家看一篇博文,写的非常的详细,但是有点难理解,链接地址是:
http://blog.jobbole.com/61872/#toc1
你也许会有疑问,哈希都加密成那个样子了,难道还不安全?你还说对了,还真不安全,作为拓展内容给大家介绍几种出名且有效的破解哈希的方法,大家了解即可:
字典攻击:这种方式简单来说就是靠猜,哈哈哈,服不服?关键是怎么猜?也简单,就是准备一个字典文件。这个字典文件可不是简单的字典文件,它包含了单词、短语、常用密码以及其他可能用作密码的字符串,然后这些都是经过哈希过的。就是拿这个哈希值的字典文件去和你的密码哈希比对,一样,那么就是这个密码了呗。
字典文件的构成是从大段文本中分解出的单词,甚至还包括一些数据库中真实的密码。然后还可以对字典文件进行更进一步的处理使它更有效,比如把单词中的字母替换为它们的“形近字”(hello变为h3110)
暴力攻击:顾名思义,就是简单粗暴的方式,也是靠猜。但是这一种方式需要大量的计算,太耗时,但是它一定会成功,只是成功的过程需要几百年,甚至更长......
暴力攻击会尝试每一个在给定长度下各种字符的组合。这种攻击会消耗大量的计算,也通常是破解哈希加密中效率最低的办法,但是它最终会找到正确的密码。因此密码需要足够长,以至于遍历所有可能的字符串组合将耗费太长时间,从而不值得去破解它。
查表法:
查表法对于破解一系列算法相同的哈希值有着无与伦比的效率。主要的思想就是预计算密码字典中的每个密码,然后把哈希值和对应的密码储存到一个用于快速查询的数据结构中。一个良好的查表实现可以每秒进行数百次哈希查询,即使表中储存了几十亿个哈希值。
反向查表法:
这种方法可以使攻击者同时对多个哈希值发起字典攻击或暴力攻击,而不需要预先计算出一个查询表。
首先攻击者构造一个基于密码-用户名的一对多的表,当然数据需要从某个已经被入侵的数据库获得,然后猜测一系列哈希值并且从表中查找拥有此密码的用户。通常许多用户可能有着相同的密码,因此这种攻击方式也显得尤为有效。
彩虹表:
彩虹表是一种在时间和空间的消耗上找寻平衡的破解技术。它和查表法很类似,但是为了使查询表占用的空间更小而牺牲了破解速度。因为它更小,于是我们可以在一定的空间内存储更多的哈希值,从而使攻击更加有效。能够破解任何8位及以下长度MD5值的彩虹表已经出现了。
看到没有,方法还不止一种,现在你还认为哈希加密安全吗?
SHA256
前面都是一些了解内容,我们还是回归正传,比如咱们上一个网站里面用到的密码加密是什么啊?怎么用的啊?代码是什么呢?是不是忘记了,很正常,人要是学习了不忘记,那是流氓,o(∩_∩)o 哈哈,正常人都是学习了会忘记,而且遵循那个什么什么曲线,(悄悄告诉你,那叫艾宾浩斯遗忘曲线)管它是什么,总之就是学了会忘,忘了还得学,所以,再带着大家回忆一下:
代码语言:javascript复制user.password = password #密码的加密处理
#使用@property装饰的方法,可以当成属性来使用,比如: print(user.password)
@property
def password(self):
raise AttributeError("当前属性不可读")
#@password.setter给password方法,加了一个设置方法, 比如: user.password = 'haha'
@password.setter
def password(self, value):
#使用了系统的generate_password_hash方法,使用的是sha256算法加密
self.password_hash = generate_password_hash(value)
def check_passowrd(self, password):
#系统提供的校验密码的方法,check_password_hash,传递密文和明文,返回的是True或者False
return check_password_hash(self.password_hash, password)
- 目的: 使用flask中提供的安全模块,将密码进行加密
- 注意点
- @property装饰方法之后,可以被属性使用
- @属性.setter,给方法增加一个设置方式
- generator_password_hash() 系统提供的加密方法
- check_password_hash() 系统提供的密码校验方法
上面是前面的笔记,大家可以结合给的代码块中的注释和代码进行回顾学习。这一篇的小科普就到此为止了,咱们江湖见.....
优质文章推荐:
公众号使用指南
redis操作命令总结
前端中那些让你头疼的英文单词
Flask框架重点知识总结回顾
项目重点知识点详解
难点理解&面试题问答
flask框架中的一些常见问题