首先,一点背景:我正在为CodeIgniter实现一个auth + auth系统并不是什么秘密,到目前为止我赢了(可以这么说).但是我遇到了一个非常重要的挑战(大多数auth库完全错过了,但我坚持正确处理它):如何智能地处理大规模,分布式,可变用户名的暴力攻击.
我知道所有常用的技巧:
现在,这些只是理论上可行的想法.有很多垃圾想法可以打开网站(比如琐碎的DoS攻击).我想要的是更好的东西.更好的是,我的意思是:
它必须安全(+)抵御DoS和暴力攻击,并且不会引入任何新的漏洞,这些漏洞可能会让稍微狡猾的机器人继续在雷达下运行
它必须是自动化的.如果需要人工操作员验证每次登录或监控可疑活动,那么它无法在真实场景中运行
它必须适用于主流网络使用(即可由非程序员执行的高流失率,高流量和开放式注册)
它不会妨碍用户体验到临时用户会感到烦恼或沮丧(并可能放弃网站)
它不能涉及小猫,除非它们真的是非常安全的小猫
(+)'安全',我的意思是至少和偏执的用户保密密码一样安全
所以 - 让我们听听吧!你会怎么做?你知道我没有提到过的最佳实践(哦,请你说)吗?我承认我对自己有所了解(结合3和4的想法),但我会让真正的专家在让自己尴尬之前说话;-)
在工作中,我们有两种相互竞争的盐理论.我工作的产品使用类似用户名或电话号码来加密哈希值.基本上每个用户都有不同的东西,但我们可以随时使用.另一个产品为每个用户随机生成一个salt,并在每次用户更改密码时更改.然后在数据库中加密盐.
My question is if the second approach is really necessary? I can understand from a purely theoretical perspective that it is more secure than the first approach, but what about from a practicality point of view. Right now to authenticate a user, the salt must be unencrypted and applied to the login information.
在考虑之后,我只是没有从这种方法中看到真正的安全性收益.将盐从帐户更改为帐户,即使攻击者知道如何快速确定每个帐户的内容,仍然会使某人尝试强制执行散列算法变得非常困难.这是基于密码足够强的假设.(显然,找到一组密码的正确哈希值,它们都是两位数,比找到8位密码的正确哈希值要容易得多).我的逻辑是不正确的,还是我缺少的东西?
编辑:好的,所以这就是为什么我认为加密盐真的没有意义.(lemme知道我是否在正确的轨道上).
对于以下说明,我们假设密码总是8个字符,盐是5,所有密码都由小写字母组成(它只是使数学更容易).
Having a different salt for each entry means that I can't use the same rainbow table (actually technically I could if I …
这是Java中的算法:
public String getHash(String password, String salt) throws Exception {
String input = password + salt;
MessageDigest md = MessageDigest.getInstance(SHA-512);
byte[] out = md.digest(input.getBytes());
return HexEncoder.toHex(out);
}
Run Code Online (Sandbox Code Playgroud)
假设盐是已知的.我想知道在密码是字典单词时以及它不是字典单词时暴力的时间.
作为对最近的Twitter劫持和Jeff关于字典攻击的帖子的回应,保护您的网站免受暴力登录攻击的最佳方法是什么?
杰夫的帖子建议每次尝试登录都会增加延迟,评论中的建议是在第二次尝试失败后添加验证码.
这两个看起来都是好主意,但你怎么知道它的"尝试数"是什么?您不能依赖会话ID(因为攻击者每次都可以更改它)或IP地址(更好,但易受僵尸网络攻击).只需根据用户名记录它就可以使用延迟方法锁定合法用户(或者至少使登录过程对他们来说非常慢).
思考?建议?
我有登录页面,当然我希望防止暴力攻击,并在用户登录时减少延迟.
目前,您输入用户名和密码登录.
我正在考虑实施一个reCAPTCHA.但是,这显示在3次尝试失败后登录.
我的问题是:
你的尝试基础是什么?IP地址?它总是可以隐藏...用户名?如果他们尝试的用户不存在怎么办?
计算失败登录尝试的最佳方法是什么?
我试图确定列表中的所有元素是否相同.如:
(10,10,10,10,10) --> true
(10,10,20,30,30) --> false
Run Code Online (Sandbox Code Playgroud)
我知道hashset可能会有所帮助,但我不知道如何用java编写.
这是我尝试过的,但没有用:
public static boolean allElementsTheSame(List<String> templist)
{
boolean flag = true;
String first = templist.get(0);
for (int i = 1; i< templist.size() && flag; i++)
{
if(templist.get(i) != first) flag = false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud) 是否有普遍接受的保护Django应用程序免受此类攻击的策略?
加密算法的安全性如何依赖于分解大数?
例如,我在一些数学编程论坛上读过,通过使用Quadratic Sieve或General Number Field Sieve,可以在商用硬件上相对容易地计算256位数.
这如何转化为能够打破RSA,AES等算法的安全性?是否可以将数字的长度系数足够?
有没有人知道加密算法和加密算法能否对它有所了解?
我的Web应用程序安全性由Spring Security 3.02 处理, 但我找不到任何对Brute Force Detection的开箱即用支持.
我想实现一些应用级别的BFD保护.例如,通过在数据库中存储每个用户的失败登录尝试(JPA).然后,受攻击的用户帐户可以通过电子邮件获得锁定期或强制帐户重新激活.
使用Spring Security实现此功能的最佳方法是什么?是否有任何机构有关于此的示例代码或最佳实践?
我需要生成从给定字符集到给定范围的所有可能组合.喜欢,
charset=list(map(str,"abcdefghijklmnopqrstuvwxyz"))
range=10
Run Code Online (Sandbox Code Playgroud)
输出应该是,
[a,b,c,d..................,zzzzzzzzzy,zzzzzzzzzz]
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用已经使用过的库来做到这一点.但我需要知道它们是如何工作的.如果有人能用Python或任何可编程语言给我一个这种算法的注释代码,我将非常感激.