常见用户密码加密方式之特殊的单向HASH算法

Posted 弘连网络

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见用户密码加密方式之特殊的单向HASH算法相关的知识,希望对你有一定的参考价值。

平时我们对用户密码加密的方式主要包括了:

1、直接明文

2、对称加密算法

3、单向HASH算法:

3.1 直接使用MD5、SHA1这类HASH加密

3.2 加盐(Salt)后使用MD5、SHA1这类特殊的单向HASH加密  

3.3 PBKDF2算法,大致相当于在HASH算法基础上增加随机盐(Salt)

4、Bcrypt、Scrypt等算法

今天简单跟大家聊一聊,在平时遇到最多的一种加密方式:MD5+SHA1+Salt这类特殊的单向HASH算法。  

基本概念:

MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 中被加以规范。

SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

盐(Salt),在密码学中,是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。

在大部分情况,盐是不需要保密的。盐可以是随机产生的字符串,其插入的位置可以也是随意而定。如果这个散列结果在将来需要进行验证(例如:验证用户输入的密码),则需要将已使用的盐记录下来。

简单实现原理:

加盐的实现过程通常是在需要散列的字段的特定位置增加特定的字符,打乱原始的字符串,使其生成的散列结果产生变化。比如,用户使用了一个密码:

x7faqgjw

经过SHA散列后,可以得出结果:

58ecbf2b3136ceda7fddfd986ba8bd8d59b2d73779691e839f3f176ce2c04b84

但是由于用户密码位数不足,短密码的散列结果很容易被彩虹表破解,因此,在用户的密码末尾添加特定字符串(红色为加盐的字段):

x7faqgjwabcdefghijklmnopqrstuvwxyz

因此,加盐后的密码位数更长了,散列的结果也发生了变化:

7b5001a5a8bcdcfa1b64d41f6339cfa7a5c0eca04cca6ff6a6c1d6aad17794cc

以上就是加盐过程的简单描述,在实际使用过程中,还需要通过特定位数插入、倒序或多种方法对原始密码进行固定的加盐处理,使得散列的结果更加不容易被破解或轻易得到原始密码。

简单案例:

我们经常在案件中碰到,数据库中保存了大量的加密后的用户名和用户密码字符串,与此同时我们也从对象的笔记本中找到了他们记录的明文密码(没有用户名),那么我们怎么通过上面的知识来让这些明文密码和对应起来呢。    

下面我举得例子是使用的明文密码加Salt通过SHA算法进行的密码保存:

已知数据如下:

明文密码:

asdfgh

qwerdf

数据库中User1、User2用户保存的密码:

7b01991aeb414ffe8b602c57bbb21ffa72fcca9fasdfghjklz

945fa898f739f1f4f18ffcfedd903dbc268cffacyuiopasdfg

那么我们怎么让这两个明文密码对应上这两个用户名呢    

首先我们要明确的是,SHA1的长度是40位,我们可以看到这两个加密后的密码字符串是50位,那么我们可以先假设后10位是Salt,前40位是明文密码+Salt后计算SHA1的结果。      

使用在线工具可以快速尝试,这里我使用的是https://cc.forensix.cn,我们把明文密码+Salt组合好后,通过计算SHA1后发现,结果是

945fa898f739f1f4f18ffcfedd903dbc268cffac

这个值刚好跟我们从数据库中发现的

945fa898f739f1f4f18ffcfedd903dbc268cffacyuiopasdfg    

前40位吻合,那么现在我们可以猜测,我们的设想是对的,这个数据库保存用户密码的方式是明文密码+Salt后计算SHA1,末尾加上Salt值进行保存的。  

我们接着尝试另外的一个明文密码,验证下这个设想,发现是正确的,

所以我们可以知道User1的密码是qwerdf,User2的密码是asdfgh。    

结尾:

上面的原理和案例只是为了方便大家初步的了解加盐(Salt)后使用MD5、SHA1这类特殊的单向HASH加密这类特殊的密码加密方式,当然在实际的案子中更多的需要我们从网站的代码中分析出所使用的加密方式。  

参考资料:

https://zh.wikipedia.org/wiki/MD5

https://zh.wikipedia.org/wiki/SHA-1

https://zh.wikipedia.org/wiki/盐_(密码学)

https://zh.wikipedia.org/wiki/分组密码工作模式

以上是关于常见用户密码加密方式之特殊的单向HASH算法的主要内容,如果未能解决你的问题,请参考以下文章

加密解密

接口数据: 如何安全传输存储

接口数据: 如何安全传输存储

非对称加密算法都有哪些,安全性能对比

WEB—加密算法

单向散列算法的常见算法