2023年7月31日发(作者:)

聊聊如何设计安全的web密码在web开发中,⽤户账户系统安全性直接关呼⽤户隐私,通常我们为⽤户提供了⼀个登录页⾯来进⼊系统,⽤户只要提供正的账号和密码,就可以进⼊系统内部。所以密码的安全性是我们⾸先要考虑的。⾸先我们来看⼀下,密码⾯临的威胁:众所周知⽬前破解密码的⽅式主要有:字典攻击与暴⼒攻击、查表法、反向查表法、彩虹表等。字典攻击与暴⼒攻击同属暴⼒破解范筹,其特点是适合简单的、常规性密码的破解,破解速度慢,但⽆法避免,只要时间成本⾜够终会破解成功。查表法对于算法相同的哈希值有着极快的效率,主要思想是预先按照某种哈希算法对字典中的密码进⾏计算,然后把哈希值与密码存储⼀个⽤于快速查询的数据结构中,然后通过查表时⾏破解。反向查表与彩虹表,原理⼤多与此类似。本⽂主要以PHP语⾔为类,展开讲解。以前我们通常的做法是使⽤md5或md5+salt⽅式来加密密码,以保证密码的安全。Demo:但是PHP5.5引⼊了Password Hashing函数,内核 ⾃带⽆需扩展。在PHP5.4下也是⽀持的。Password Hashing主要提供了4个函数//查看哈希值的相关信息array password_get_info(string $hash)//创建hash密码string password_hash(string $password,integer $algo [,array $options])//判断hash密码是否特定选项、算法所创建boolean password_needs_rehash(string $hash,integer $algo [,array $options])//验证密码是否正确boolean password_verify(string $password,string $hash)demo:⼆、另外推荐⼀些算法PBKDF2、bcrypt、scrypt来加密密码。PBKDF2它的特点:1、可以通过调整KEY来扩展,从⽽避免暴⼒破解,通过key扩展的基本思路是,在将密码哈希后,再使⽤key加上哈希值再使⽤相同的算法进⾏多次的哈希。如果⿊客尝试去破解的话,他会因此多花费⼏⼗亿次计算的时间。前⾯提到过,越慢越好,PBKDF2可以通过指定迭代次数,你想让他多慢,他就有多慢。2、通过加盐的⽅式预防彩虹表的破解⽅式。盐是⼀个添加到⽤户的密码哈希过程中的⼀段随机序列。这个机制能够防⽌通过预先计算结果的彩虹表破解。每个⽤户都有⾃⼰的盐,这样的结果就是即使⽤户的密码相同,通过加盐后哈希值也将不同。然⽽,在将盐与密⽂存储的位置上有很多⽭盾的地⽅,有的时候将两者存在⼀起⽐较⽅便,有的时候为了安全考虑⼜不得不将两者分开存储。由于PBKDF2算法通过key的机制避免了暴⼒破解,我觉得没必要将盐隐藏起来,就跟密⽂存储在同⼀个位置。 3、不需要额外的库或者⼯具,这是⼀个开源的实现,在⼯作环境中能很⽅便的使⽤。bcrypt是专门为密码存储⽽设计的算法,基于Blowfish加密算法变形⽽来。其最⼤的好处是有⼀个参数(work factor)可⽤于调整计算强度,⽽且work factor是包括在输出摘要中的。随着攻击者计算能⼒的提⾼,使⽤者可以增⼤work factor,⽽且不会影响⼰有⽤户的登录。scrypt不仅计算时间长,⽽且占⽤内存多。使得并⾏计算多个摘要异常困难,因此利⽤rainbow table进⾏暴⼒攻击更加困难。scrypt没有在⽣产环境中⼤规模应⽤,并且缺乏仔细的审察和⼴泛的函数库⽀持。但是,scrypt在算法层⾯只要没有破绽,它的安全性应该⾼于PBKDF2和bcrypt。

2023年7月31日发(作者:)

聊聊如何设计安全的web密码在web开发中,⽤户账户系统安全性直接关呼⽤户隐私,通常我们为⽤户提供了⼀个登录页⾯来进⼊系统,⽤户只要提供正的账号和密码,就可以进⼊系统内部。所以密码的安全性是我们⾸先要考虑的。⾸先我们来看⼀下,密码⾯临的威胁:众所周知⽬前破解密码的⽅式主要有:字典攻击与暴⼒攻击、查表法、反向查表法、彩虹表等。字典攻击与暴⼒攻击同属暴⼒破解范筹,其特点是适合简单的、常规性密码的破解,破解速度慢,但⽆法避免,只要时间成本⾜够终会破解成功。查表法对于算法相同的哈希值有着极快的效率,主要思想是预先按照某种哈希算法对字典中的密码进⾏计算,然后把哈希值与密码存储⼀个⽤于快速查询的数据结构中,然后通过查表时⾏破解。反向查表与彩虹表,原理⼤多与此类似。本⽂主要以PHP语⾔为类,展开讲解。以前我们通常的做法是使⽤md5或md5+salt⽅式来加密密码,以保证密码的安全。Demo:但是PHP5.5引⼊了Password Hashing函数,内核 ⾃带⽆需扩展。在PHP5.4下也是⽀持的。Password Hashing主要提供了4个函数//查看哈希值的相关信息array password_get_info(string $hash)//创建hash密码string password_hash(string $password,integer $algo [,array $options])//判断hash密码是否特定选项、算法所创建boolean password_needs_rehash(string $hash,integer $algo [,array $options])//验证密码是否正确boolean password_verify(string $password,string $hash)demo:⼆、另外推荐⼀些算法PBKDF2、bcrypt、scrypt来加密密码。PBKDF2它的特点:1、可以通过调整KEY来扩展,从⽽避免暴⼒破解,通过key扩展的基本思路是,在将密码哈希后,再使⽤key加上哈希值再使⽤相同的算法进⾏多次的哈希。如果⿊客尝试去破解的话,他会因此多花费⼏⼗亿次计算的时间。前⾯提到过,越慢越好,PBKDF2可以通过指定迭代次数,你想让他多慢,他就有多慢。2、通过加盐的⽅式预防彩虹表的破解⽅式。盐是⼀个添加到⽤户的密码哈希过程中的⼀段随机序列。这个机制能够防⽌通过预先计算结果的彩虹表破解。每个⽤户都有⾃⼰的盐,这样的结果就是即使⽤户的密码相同,通过加盐后哈希值也将不同。然⽽,在将盐与密⽂存储的位置上有很多⽭盾的地⽅,有的时候将两者存在⼀起⽐较⽅便,有的时候为了安全考虑⼜不得不将两者分开存储。由于PBKDF2算法通过key的机制避免了暴⼒破解,我觉得没必要将盐隐藏起来,就跟密⽂存储在同⼀个位置。 3、不需要额外的库或者⼯具,这是⼀个开源的实现,在⼯作环境中能很⽅便的使⽤。bcrypt是专门为密码存储⽽设计的算法,基于Blowfish加密算法变形⽽来。其最⼤的好处是有⼀个参数(work factor)可⽤于调整计算强度,⽽且work factor是包括在输出摘要中的。随着攻击者计算能⼒的提⾼,使⽤者可以增⼤work factor,⽽且不会影响⼰有⽤户的登录。scrypt不仅计算时间长,⽽且占⽤内存多。使得并⾏计算多个摘要异常困难,因此利⽤rainbow table进⾏暴⼒攻击更加困难。scrypt没有在⽣产环境中⼤规模应⽤,并且缺乏仔细的审察和⼴泛的函数库⽀持。但是,scrypt在算法层⾯只要没有破绽,它的安全性应该⾼于PBKDF2和bcrypt。