你知道密码如何在网站中存储吗?

哈希加密的概况

早期也就是很早的时候,系统里可能直接存的就是用户的明文密码,密码是什么就存什么,然后每次校验直接匹配就好了.后来人们开始使用哈希进行加密,得到现在的普遍使用的密文.

最简单的基于密文的密码存储策略(通常可能是MD5加密方式)就是我下面画的图:

  • 哈希算法是一个单向的函数,将任意大小的数据转换成统一长度的密文,并且无法被反向计算.并且每个不同数据通过哈希函数转换成的结果都是不同的.
  • 程序中真正比对的是密文哈希值,只有相同才被授权.不相同也不要告知到底是用户名错误还是密码错误,给出一个模糊的提示就行,防攻击者在不知道密码的情况下,遍历出可用的用户名.
  • 不是所有的哈希函数都是安全的,适用于加密的.有些哈希函数是用于哈希表这类数据结构,方便快速查找的.适用于加密的有类似于:SHA256,SHA512,RipeMD之类的哈希函数.
  • 最后要说明,单纯的哈希加密太容易破解了,从目前的状况看它并不安全.

为何说单纯的哈希加密并不安全?

  • 之所以说单纯的哈希加密并不安全因为破解的方式有很多,鉴于现在计算机性能(CPU发展已经到了一个瓶颈,现在普通的笔记本性能几乎就是20年前的超级计算机)的提升以及黑客技术的进步,很多网站都提供了破解哈希的功能.下面列举出一些常用的破解方式:
  • 暴力破解(这是不可阻止的破解方式之一,在给定长度的情况下尝试各种字符的组合,虽然效率非常低,但通过遍历最终一定会得到密码,相当于把所有的可能都尝试一遍)
  • 字典攻击(同样是不可阻止的破解方式之一,相当于暴力破解的升级版,通过收集常用的单词,词组,密码然后将所有的都存储起来,根据这些更加接近的数据进行比对,碰运气去猜)
  • 查表法(预先计算密码字典中得每个密码,然后把哈希值和对应密码存储到一个快插查询的数据结构中,以后就查询这个表就行了)
  • 彩虹表(这才是大杀器,说白了就是把一定长度的明文密码以及对应的哈希密码都存储下来,然后按照查表法的方式进行破解)

传说中让彩虹表都无力的加盐

我们上面说到的几种破解方式都是基于一个最基本的原则,所有密码都以相同的方式进行哈希加密.也就是说如果两个账号明文密码相同,他们哈希后得到的密文也是相同的.如果我们能通过一些'小手段'让它们不同,那么破解的难度就是指数级的倍增了.

具体的做法就是在密码中加入一段"随机化"的字符串,然后再进行哈希化.这样就将原来的同样明文映射到同样密文的规则打乱了,其中混入的'随机'字符串就是所谓的'盐'.

这些思想都不复杂,但是在真正的工作中大多数人还是会犯下一些"错误",使我们的料加的并不好,比如:
  • "盐值"的长度太短(通常要和密文长度一样才行)或者"盐值"出现重复
  • 哈希函数进行嵌套或者组合使用(非常重要的一点,别相信自己发明的某种加密方式,使用由密码学家研究出来的标准算法)
  • 尽量避免使用已经过时或者低端的哈希函数,例如: MD5,SH1等,推荐SH256,SH512等等.
  • "盐值"的产生并不是一个随意的rand()函数,要使用基于加密的伪随机函数生成器,更加高度的随机性.
    文章转载自 开源中国社区 [http://www.oschina.net]
时间: 2024-11-13 08:12:47

你知道密码如何在网站中存储吗?的相关文章

java-selenium中测试网站中忘记密码如何写用例

问题描述 selenium中测试网站中忘记密码如何写用例 3C selenium中测试网站用Java怎样写测试网站中忘记密码的功能?

网站上传的图片是怎么在数据库中存储的

问题描述 网站上传的图片是怎么在数据库中存储的,要是存在数据库中是不是增加数据库的负担,读写效率方面也不高?要是数据库只存放路径,图片存在web服务器文件夹里安全吗?QQ空间照片是怎么存储的?像百度文库doc.txt.pdf文件又是怎么存储的呢 解决方案 1.存到数据库里面,就是对图片数据进行序列化,可以保存到数据库里面2.存库和存硬盘的效率应该是差不多的,如果图片不多,存在库里面和存在硬盘上都一样,如果内容多了存在数据库里面会不方便,对于备份.恢复等操作不太方便3.图片存在web文件夹里面安全

亚马逊印度网站第三方商人被勒令停止在亚马逊的仓库中存储商品

摘要: 据国外媒体报道, 亚马逊 已经陷入印度南方的卡纳塔克邦(Karnataka)政府监管麻烦之中,该邦政府税收机构已经勒令亚马逊印度网站第三方商人停止在亚马逊的仓库中存储商品.为此 据国外媒体报道, 亚马逊 已经陷入印度南方的卡纳塔克邦(Karnataka)政府监管麻烦之中,该邦政府税收机构已经勒令亚马逊印度网站第三方商人停止在亚马逊的仓库中存储商品.为此,亚马逊表示,其位于该邦班加罗尔(Bangalore)的仓储中心或将被迫关闭. 与卡纳塔克邦政府之间的这一争端,牵涉第三方商人销售的商品以

Android实战教程第七篇之如何在内存中存储用户名和密码

本文实例为大家分享了Android内存中存储用户名和密码的方法,供大家参考,具体内容如下 首先是配置文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layo

PHP网站中整体防注入方法

防注入 今天写代码的时候猛然想到是不能能够通过一个文件来处理整个网站中所有可能出现注入的地方进行防范呢?这样就能够不用在每个程序里对每个变量进行过滤,节省了时间和代码. 我们主要是从两点出发,因为我们的获取的变量一般都是通过GET或者POST方式提交过来的,那么我们只要对GET和POST过来的变量进行过滤,那么就能够达到防止注入的效果.而且我们的PHP真是非常好,已经内置了$_GET和$_POST两个数组来存储所有变量,我们要做的工作就是过滤每个变量就可以了. 下面看具体的代码: /* Auth

如何在azure网站中快速删除一个大文件夹

问题描述 如何在azure网站中快速删除一个大文件夹 我在Azure网站中部署了个我的website的应用,我现在想删去里面一个文件夹,大小大概有3G,我尝试使用ftp去做,但是速度太慢了,有们有什么快速的方法. 解决方案 Hi, 我们可以通过kudu这个工具快速的删除一个文件夹,我们首先去Azure网站的仪表盘下载发布配置文件,具体如下图: 打开配置文件找出用户名密码,然后我们打开IE输入https://***.scm.chinacloudsites.cn/, ***是你的网站名称,输入上面记

[译]再谈如何安全地在 Android 中存储令牌

本文讲的是[译]再谈如何安全地在 Android 中存储令牌, 原文地址:A follow-up on how to store tokens securely in Android 原文作者:Enrique López Mañas 译文出自:掘金翻译计划 译者: lovexiaov 校对者:luoqiuyu hackerkevin 作为本文的序言,我想对读者做一个简短的声明.下面的引言对本文的后续内容而言十分重要. 没有绝对的安全.所谓的安全是指利用一系列措施的堆积和组合,来试图延缓必然发生的

Web服务在垂直型B2B电子商务网站中的应用

本文讲的是Web服务在垂直型B2B电子商务网站中的应用,[IT168 资讯]1垂直B2B电子商务网站简介 B2B电子商务网站也称为B2B电子市场,简单的说,就是一种网站可在该网站选择多家供应商的产品和服务.B2B电子市场就是一个能够为采购商和供应商提供产品和服务交易信息的互联网交易平台.垂直型B2B电子市场是面向特定行业,如化工行业.医药行业.服装行业等.提供一个信息的集散地. 对于一般的中小型行业来说,他们的接触范围都比较窄,信息的共享就变得非常重要的.正是因为如此,在目前的垂直型B2B电子商

sql server-SQLServer如何定位数据库中存储的是那些信息

问题描述 SQLServer如何定位数据库中存储的是那些信息 我有一个网站后台数据库的备份,并且已经在自己机器上还原了,现在我想知道 这个数据库里面的每张表都对应的是网站上的那些信息,有什么好点的办法么?求大神指导 解决方案 这个需要分析,数据库存放数据跟网站信息对应是逻辑关系,只有网站开发者清楚,你需要先分析网站的数据是如何读取,组织的.然后再结合数据库来看各个字段是如何对应关系 解决方案二: NULL在SQLServer数据库日志文件中的存储 解决方案三: 这个只能通过字段找到那些内容是属于