2、安全设计

分类: 365体育官方app 发布时间: 2026-01-08 11:56:44
作者: admin 阅读: 2002 | 点赞: 642
2、安全设计

1、常见问题1.1、账号密码暴力破解根据输入密码的设定长度、选定的字符集生成可能的密码全集,进行地毯式搜索。例如一个已知是四位并且全部由数字组成的密码,其可能共有10000种组合,因此最多尝试10000次就能找到正确的密码。理论上利用这种方法可以破解任何一种密码,但随着密码复杂度增加,破解密码的时间会指数级延长。

1.2、撞库字典式攻击是将出现频率最高的密码或者已经泄漏的密码保存到文件中,这文件就是字典,暴破时使用字典中的这些密码去猜解。字典式攻击适用于猜解人为设定的口令,因为人为设定受人方便记忆影响不同密码出现的概率是不一样的,12345678、password作为密码的概率比fghtsaer作为密码的概率要高得多。字典式攻击虽然损失了较小的命中率但节省了较多的时间。

1.3、破解md5彩虹表攻击也属于字典式攻击,但它是一种高效地破解哈希算法(MD5、SHA1、SHA256/512等)的攻击方式。网站为了增加安全性,不会直接将用户密码存储在数据库中,而是将密码进行哈希,变成一长串毫无意义的字符,并且哈希算法是不可逆的,没有解密算法可以还原成原来的密码。面对哈希后的密码,破解的方法有两个,一是用穷举法组合出所有的密码可能,然后经哈希加密算法计算,将结果与目标哈希值进行比对,但边计算边比对会耗费海量的时间;二是提前生成可能密码与对应哈希串的对照表,但是对照表将占据海量的磁盘空间,以14位字母和数字的组合密码为例,生成的密码32位哈希串的对照表将占用5.7×10^14 TB的存储空间。彩虹表是时间空间折中的方法,其核心思想是将明文计算得到的哈希值由R函数映射回明文空间,交替计算明文和哈希值,生成哈希链,将这个链的首尾存储在表中,中间的都删掉,用的时候临时算,那么存储的空间比原来的减少了一半,而计算次数也并没有大量增多。由于在哈希链的计算过程中引入不同的R函数,将不同的R函数用不同的颜色表示,众多的哈希链就会像彩虹一样,所以叫做彩虹表。

2、安全设计2.1、提升密码长度和复杂度密码应由数字、大小写字母和特殊符号混合组成,且密码越长,破解密码的时间就会成指数增加,一旦密码超过了某个长度,基本上就不能用暴力破解了。例如,使用破解的服务器集群,每秒可以尝试3500亿次,这个速度破解6位密码只需要4.08秒,7位密码只需6.47分钟,8位密码需要10.24小时,9位密码需要40.53天,10位密码就需要10.55年了。

2.2、密码设计提示提示用户避免使用字典单词、数字组合、相邻键盘组合、重复的字符串。例如 password 、12345678、asdfg 、aaaa 或 123abc。

2.3、定期修改密码以90天为周期提示用户修改密码。

2.4、账号锁定策略用户输错密码5次就锁定一段时间。具体错误次数可以根据业务场景进行调整。

2.5、图形验证码技术要求用户完成简单的交互操作才能登录到系统。例如滑动型验证码、顺序点击验证码等。

2.6、双因子认证结合两种不同的认证因素对用户进行认证的方法。例如密码、安全令牌、指纹、面部识别、地理信息等。根据业务场景重要程度来确定是否使用双因子认证。

2.7、加盐存储密码如果两个用户使用了同样的密码,那么一定他们的密码hash也一定相同。我们可以通过让每一个hash随机化,同一个密码hash两次,得到的不同的hash来避免这种攻击。具体的操作就是给密码加一个随即的前缀或者后缀,然后再进行hash。这个随即的后缀或者前缀成为“盐”。正如上面给出的例子一样,通过加盐,相同的密码每次hash都是完全不一样的字符串了。检查用户输入的密码是否正确的时候,我们也还需要这个盐,所以盐一般都是跟hash一起保存在数据库里,或者作为hash字符串的一部分。盐不需要保密,只要盐是随机的话,查表,彩虹表都会失效。因为攻击者无法事先知道盐是什么,也就没有办法预先计算出查询表和彩虹表。如果每个用户都是使用了不同的盐,那么反向查表攻击也没法成功。

3、伪代码================请求、响应===================

//请求

https://a.com/login/

ua:xx

xx:xx

Content-Length:xx

{

"username":RSA(123),

"passwd":RSA(qwe),

//图形验证码

"picturetext":"ed24",

//图形验证码uuid

"uuid":"xxxxxxxxxxxxx",

"timestap":"1705286217",

"sign":"xxxx-xx-xx-x-x-x"

}

================后端===================

//校验

BOOL APICheck(username,passwd,picturetext,uuid,timestap,sign){

//校验是否满足期望参数格式,避免畸形数据,特殊字符

if( regex_check(username,passwd,picturetext,uuid,timestap,sign) == Flase)

return False;

//校验图形验证码

if(cheakpicturetext(picturetext,uuid)==False)

return False;

//数据校验

if( ECDSACheckSign(passwd,uuid,timestap) != sign )

return False;

return True;

}

//图形验证码加茶

BOOL cheakpicturetext(picturetext,uuid){

if(GetTextByUUID(uuid) == picturetext ){

//

//

Mutex.Lock()

//成功删除redis里的图形验证码则返回True

//删除失败redis里的图形验证码则返回False

// ----------------------⚠️注意⚠️----------------------

// redis删除时要用del而不是unlink,确保同步删除,防止多线程并发情况下打时间差

// ----------------------⚠️注意⚠️----------------------

BooL result=DeletePicturetextInRedis(uuid)

Mutex.Unlock()

if(result == True){

return True:

}

else{

return False;

}

}

else{

return False;

}

}

//业务处理

String DoBusiness(username,passwd){

newpasswd=hash(passwd,salt);

oldpasswd=GetOldPasswdbyUsername(username);

if(newpasswd != oldpasswd){

return False;

}

else{

return True;

}

}