资讯专栏INFORMATION COLUMN

给你的密码加盐

Y3G / 1973人阅读

摘要:第三阶段这种方式是在实习中学习到的,也就是对密码来进行加盐。什么是加盐在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为加盐。

写在前面

本文描述了本人,对于数据库中如何保存密码的认识过程。从最简单的明文保存到密码加盐保存,下面与大家分享下:

第一阶段

最开始接触web开发时,对于用户表的密码基本是明文保存,如:

username | password
---------|----------
zp1996   |123456
zpy      |123456789

这种方式可以说很不安全,一旦数据库泄漏,那么所以得用户信息就会被泄漏。之前,国内普遍采用这种方式,造成了很多的事故,如csdn600万用户信息泄漏、12306用户信息泄漏等。

第二阶段

本人大学做过的所有的项目基本采用的都是这种方式来保存用户密码,就是对密码进行md5加密,在phpmd5即可,在node中利用crypto模块就好:

const encrypt = (text) => {
    return crypto.createHash("md5").update(String(text)).digest("hex");
};

作为初学者的我,认为这种方式是很安全的,因为md5不可逆(指攻击者不能从哈希值h(x)中逆推出x)而且碰撞几率低(指攻击值不能找到两个值x、x"具有相同的哈希值);然而这种方式也是不安全的,只要枚举出所有的常用密码,做成一个索引表,就可以推出来原始密码,这张索引表也被叫做“彩虹表”(之前csdn600万用户明文密码就是一个很好的素材)。

第三阶段

这种方式是在实习中学习到的,也就是对密码来进行加盐。

什么是加盐?

在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”。

加盐很好理解,就是给原始密码加上特定的字符串,这样给攻击者增加攻击的成本,加盐的关键在于如何选择盐:

固定字符串

采用固定的字符串作为盐,如下面这样:

const encrypt = (text) => {
    text = text + "zp";
    return crypto.createHash("md5").update(text).digest("hex");
};

这种加盐方式与多进行几次md5一样的,没有任何意义,攻击者都可以拿到数据库,难道拿不到源代码吗,根据源代码攻击者很轻松的就可以构造新的彩虹表出来逆推密码。

随机字符串

盐一般要求是固定长度的随机字符串,且每个用户的盐不同,比如10位,数据库可以这样存储:

username | password                         |salt  
---------|---------—------------------------|----------
zp1996   |2636fd8789595482abf3423833901f6e  |63UrCwJhTH   
zpy      |659ec972c3ed72d04fac7a2147b5827b  |84GljVnhDT

采用的加密方式为:

md5(md5(password) + salt)

将其转化为node代码:

/*
 * 10位盐
 * 时间戳(2)+随机字母(8)
 */
const salt = () => {
    var time = Date.now() % 100,
        str = "";
    time = time === 0 ? "00" : String(time);
    for (let i = 0; i < 8; i++) {
        const base = Math.random() < 0.5 ? 65 : 97;
        str += String.fromCharCode(
            base + 
            Math.floor(
                Math.random() * 26 
            )
        );
    }
    return time + str;
};
const md5 = (text) => {
    return crypto.createHash("md5").update(String(text)).digest("hex");
};
const encrypt = (password) => {
    return md5(md5(password) + salt());
};
写在最后

以随机字符串作为盐对密码进行加盐仅仅是增加破解密码的难度,假如目前有30w的用户数据,那么就会有30w个盐,利用600w的索引表去比对的话,需要创造出30w*600w的数据来一一比对,这样会增加攻击者的成本。以上内容,如有错误,欢迎大家指出。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88113.html

相关文章

  • [转]MD5(1)-安全性与原理

    摘要:没错,年的破解就是证明了在碰撞上面不可靠,也就是可以通过某种方式快速的找到具有相同散列值的另一个信息。好,第二个不安全的误区来了上述破解过程对于绝大多数散列函数来说,基本上都是一个道理。 转载请注明出处 http://www.paraller.com 原文排版地址 点击获取更好阅读体验 转载: http://blog.sina.com.cn/s/blog_77e8d1350100w...

    ideaa 评论0 收藏0
  • 漫话密码存储

    摘要:通俗一点说就是彩虹表牺牲了一点计算速度,换来的好处是较少的空间存储更多的密码数据。关于盐的使用有一点需要说明加盐的目的是为了增加提前构造字典和彩虹表的代价,并不是为了加密或增加密码的计算复杂性。 背景 密码是用来进行鉴权(身份认证)一种手段,说白了就是证明你是谁。一般鉴权都可以总结为下面3种形式: 你知道什么? (如密码,密码提示问题等) 你有什么? (如信用卡,token卡等) 你...

    Godtoy 评论0 收藏0
  • nodejs-md5加盐到解密比对

    摘要:加密工具模块提供了加密功能,包括对的哈希加密解密签名以及验证功能的一整套封装。当然也是优缺点的加密相同的字符是结果都是相同的码,会出现撞库的风险。 nodejs-crypto 加密工具 crypto 模块提供了加密功能,包括对 OpenSSL 的哈希、MD5、HMAC、加密、解密、签名、以及验证功能的一整套封装。 crypto 常用的MD5 MD5 是一种不可逆的加密算法,目前是最牢靠...

    MasonEast 评论0 收藏0
  • Python中MD5加密

    摘要:的作用是让大容量信息在用数字签名软件签署私人密钥前被压缩成一种保密的格式就是把一个任意长度的字节串变换成一定长的十六进制数字串。获取由位随机大小写字母数字组成的值每次从中随机取一位获取原始密码的值原始密码随机生成位加密后的密码 MD5是什么 下面的概念是百度百科的: Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列...

    chadLi 评论0 收藏0

发表评论

0条评论

Y3G

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<