ENCRYPT加密
ENCRYPT(str, salt);使用UNIX crypt()函数,用关键词salt加密字符串str
Salt可以是任意字母、数字、或是字母或数字的组合,但必须是随机产生的,每个用户的Salt 都不一样,用户注册的时候,数据库中存入的不是明文密码,也不是简单的对明文密码进行散列,而是MD5( 明文密码 + Salt),也就是说:
1.MD5('123' + '1ck12b13k1jmjxrg1h0129h2lj') = '6c22ef52be70e11b6f3bcf0f672c96ce'
2.MD5('456' + '1h029kh2lj11jmjxrg13k1c12b') = '7128f587d88d6686974d6ef57c193628'
当用户登陆的时候,同样用这种算法就行验证。
由于加了Salt,即便数据库泄露了,但是由于密码都是加了Salt 之后的散列,坏人们的数据字典已经无法直接匹配,明文密码被破解出来的概率也大大降低。
是不是加了Salt 之后就绝对安全了呢?当然没有!坏人们还是可以他们数据字典中的密码,加上我们泄露数据库中的Salt,然后散列,然后再匹配。但是由于我们的 Salt 是随机产生的,假如我们的用户数据表中有 30w 条数据,数据字典中有 600w 条数据,坏人们如果想要完全覆盖的坏,他们加上Salt后再散列的数据字典数据量就应该是3000006000000 = 1800000000000,一万八千亿啊,干坏事的成本太高了吧。但是如果只是想破解某个用户的密码的话,只需为这 600w 条数据加上 Salt,然后散列匹配。可见 Salt 虽然大大提高了安全系数,*但也并非绝对安全。**
实际项目中,Salt 不一定要加在最前面或最后面,也可以插在中间嘛,也可以分开插入,也可以倒序,程序设计时可以灵活调整,都可以使破解的难度指数级增长。