关于盐值加密

  第一次听说盐值加密的时候,总是感觉怪怪的。因为总会联想到咸,联想到密码是咸的。

其实这里所说的盐,简单的说,就是一组安全随机数。它会在特定的时候,加入到密码中(一般来说是加密后的密码)。从而使密码变得更有味道(从单一简单化到复杂化),更安全。

下面我们就通过安全威胁分析分别说说当前两种加盐的形式:

一、数据库泄露

众所周知,用户名和密码是被保存在数据库中。可是一旦数据库发生了泄露,用户名和密码就都遭到了泄露。攻击者可以轻松的获取用户名和密码,进行操作。更大的危害是,由于现在需要注册的网站、app越来越多。用户名和密码很多时候都是相同的。一旦某处发生了泄露,则后果会慢慢的扩散。这些危害大家可以查询下近些年发生的一些安全事故,如Sony数据库泄露、网易数据库泄露、CSDN数据库泄露等。

解决这个问题的通用方法是:

1、对密码进行加密存储

这样的好处是,即使数据库发生了泄露,攻击者也不会拿到明文密码,依然无法直接使用这些密码。

但是这样的存储方式也存在缺点:很多用户在注册时都是使用的弱密码。攻击者可以通过大量的注册用户,这些用户使用扩散的使用各种弱密码。当拿到数据库密文后,根据已知的用户名密码,就可以获取到相关的彩虹表。然后依据彩虹表依次匹配数据库中的密码。这样就可以得到其中使用弱(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )密码的用户了。同时app、web等软件由于用户体验等原因,也不可能让用户设置安全系数过高的密码。如8位以上、包含大小写、特殊字符、于最近三次的密码不能相同、于上次密码至少有三位不同、不能包含密码字典中涉及的简单密码等等。举个例子:如ATM、微信支付密码使用的是纯6位数字,这样就有了10^6种可能,攻击者只要拿到了全套的密码对应的彩虹表,就可以获取到所有用户的密码。这套彩虹表,攻击者可以通过使用大量的简单密码注册用户得到。然后从获取到的数据库中找到攻击者自己注册的这些用户数据,进而拿到彩虹表。那么该怎么解决呢?这就涉及到固定盐值加密。

2、对密码进行加密

如前文所说,这个盐是一个随机数。当用户注册一个简单密码时,系统会同时生成这样一个salt,于该用户对应,保存到数据库中。

这样当用户的密码是888888时,后台真实存储的密码时888888盐化以后的值。

操作步骤如下:

(1)注册、修改密码时,前台将 888888加密后的pwd1,传入后台

(2)后台拿到pwd1以后,生成一个相应的随机数 salt。将pwd1与salt拼接并再次加密,生成pwd2

(3)后台将pwd2和salt 一并存储到数据库中。

(1-)当用户每次输入用户名密码后,将密码加密生成pwd1‘后,传入后台。

(2-)后台拿到pwd1‘后,根据用户名id拿到对应的盐值。与盐值拼接加密后,生成pwd2‘。

(3-)然后判断pwd2‘与数据库中的pwd2是否一致即可。

这里有两点需要注意:

1、密码在前后台的加密方式可以采用不同的形式

2、盐值的拼接不一定非要拼接到最后,也可以放在前边、插在中间、甚至拆开或者倒序拼接。

3、(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )

这样即使是简单密码也没关系。因为相同的密码在数据库中存储的值并不一样。攻击者无法构造有效的彩虹表进行破解。

(二)重放攻击

  先抛开前边的固化盐值加密不说,我们再说说另外一种攻击方式:重放攻击(Replay Attacks)又叫重播攻击、回放攻击或新鲜性攻击(Freshness Attacks)。

  这里举个简单的例子:当用户A进行登录后,前台会将加密后的密码,以数据包的形式发送到服务端。服务端会进行盐化等加密手段后,再进行安全校验。可是如果这个数据包被攻击者截获。并且分析出数据包的结构(如哪些字段代表用户名、哪些代表IP/会话ID),然后进行适当的修改,再次发送给服务端后,服务端依然会进行常规的校验,依然会验证通过。也就是说无论客户端,服务端的加密手段多么的复杂,一旦攻击者有能力截获和修改前后台通信的数据包,那么这些攻击都将不起作用。

那么如何防范呢?仔细想想重放攻击,攻击者利用的是每次发送的包(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )中用户名密码等部分不变的机理。

那么我们可以让他改变,怎么改变呢?

大致思路如下:

(1-)每次登陆时,我们可以生成一个随机数(一个动态生成的salt),这个salt在前后台各自保存一份。

(2-)当用户名输入完密码pwd后。前台会进行 f1(pwd)加密,然后与动态生成的salt拼接,然后再次加密。

也就是 pwd1=f2(f1(pwd)+salt)。之后前台就把这个pwd1发送到后台。(注意由于动态salt每次都会改变,所以pwd1每次也会改变)

(3-)后台拿到数据后,如果没有使用固化盐值加密的话,直接将数据库中的数据采用相同的方式与服务端保存的动态salt拼接加密然后再对比即可。

如果同时存在固化盐值加密的话,需要想办法剔除掉这个动态salt(即f2()使用可逆的机密算法),然后再拼接固化salt接着再次加密,最后与数据库对比即可。

时间: 2024-10-18 23:48:47

关于盐值加密的相关文章

盐值加密-MD5

盐值加密-MD5 什么叫盐值加密 Spring security怎样进行盐值加密 以前的md5原理是 密码密文=md5算法(密码明文): 这样明文与密文其实还是一一对应的 那么人家就可以用字典攻击(就是一个一个的试)来探测密码 加盐(盐值加密)的算法很多 Spring security用的是: 密码密文=md5算法(密码明文{盐值}): 这个盐值就可以自己随便设置了,弄一个静态字符串或者用用户的登录名 举个例子: 用户名:thr 密码:fou 用用户名作为盐值 打开网页:http://www.m

MD5盐值加密

加密思路 思路解析:(数据解析过程基于16进制来处理的,加密后为16进制字符串) 加密阶段: 对一个字符串进行MD5加密,我们需要使用到MessageDigest(消息摘要对象),需要一个盐值(salt),这个值可以是我们在业务中的一个标识号,比如银行业务中的商户号. 然后对使用salt对password进行组合加密,形成一个加密串Encryp_password,但这时候并不是真正完整的加密串,我们还需要将salt放到加密串的最前面,方便在数据验证时,获取salt. 因此最终的加密串为:SAL_

(转)浅谈MD5加密算法中的加盐值(SALT)

我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法,就是加点“佐料”.其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列.而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,已确定密码是否正确. 这里的“佐料”被称作“Salt值”,这个值是由系统随机生成的,并且只有系统

(转,学习记录)MD5加密算法中的加盐值(SALT)

我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法,就是加点“佐料”.其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列.而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,已确定密码是否正确. 这里的“佐料”被称作“Salt值”,这个值是由系统随机生成的,并且只有系统

(原创)随机串的产生,可以用于盐值

之前要加密密码的时候,要加入盐值以加强强度,找了部分,又在网上的基础上修改了下(参考网页:http://blog.csdn.net/wangchangshuai0010/article/details/17188417) //产生长度为length的随机字符串 char pSymbol[] = {'~','`','!','@','#','$','%','^','&', '*','(',')','_','+','-','=','{','}','|','[',']', ':',';','<','

Web应用你加盐了吗?——浅谈MD5加密算法中的加盐值(SALT)

转自:http://blog.csdn.net/blade2001/article/details/6341078 我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法,就是加点“佐料”.其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列.而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后

salt值(盐值)

SALT值属于随机值.用户注册时,系统用来和用户密码进行组合而生成的随机数值,称作salt值,通称为加盐值. 1.背景:系统通常把用户的密码如MD5加密后,以密文形式保存在数据库中,来防止黑客偷窥. 2.产生:随着对MD5密文查询工具的出现,而很多用户的密码又设置简单,单纯的对用户密码进行MD5加密后保存,用密文很容易就能反查询得到某用户的密码. 3.原理:为用户密码添加Salt值,使得加密的得到的密文更加冷僻,不宜查询.即使黑客有密文查询到的值,也是加了salt值的密码,而非用户设置的密码.s

密码盐码加密

每次新建账号密码的时候都需要获取一下新的盐码,之后用使用MD5为用户密码加密 /// <summary> /// 获取新的密码盐码 /// </summary> /// <returns></returns> public static string GetPasswordSalt() { var salt = new byte[128/8]; using (var saltnum = RandomNumberGenerator.Create()) { sa

(转) 密码学中的“盐值 Salt”

为什么要在密码里加点"盐" 盐(Salt) 在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为"加盐". 以上这句话是维基百科上对于 Salt 的定义,但是仅凭这句话还是很难理解什么叫 Salt,以及它究竟起到什么作用. 第一代密码 早期的软件系统或者互联网应用,数据库中设计用户表的时候,大致是这样的结构: mysql> desc User; +----------+--------------