我想知道是否有人可以详细解释,链条如何在彩虹表中工作,就像你对一个完整的新手一样,但与编程有关.
我知道一个链长16个字节.8个字节标记起始点,8个标记结束.我也明白在文件名中我们有链长,即2400.这意味着在我们的起点和终点之间只有16个字节,我们有2400个可能的明文,什么?这是如何运作的?在这16个字节中,如何获得2400个哈希值和明文,或者我是否误解了这个?
非常感谢您的帮助.
谢谢.
PS:我已经阅读了相关论文,并且搜索了这个主题.我想我只是缺少一些重要的东西来使这些齿轮转动.
由于彩虹表的链很长,是否有许多不同的缩减函数用于减少每个散列,或者只有少数几个,同时使用索引来防止合并?或者是其他东西?
我一直在寻找加密,我已经看到Rainbow Tables的几个实现就像密码上的魅力(比如说windows).
我还没有看到对RAR文件执行Rainbow攻击.为什么会如此.是什么让RAR加密更加安全并且不受这些攻击的影响?
我听说盐的唯一目的是防止彩虹表攻击,但肯定它必须比这更有价值?它不会阻止基于字典的攻击吗?那么暴力强迫,盐会在那里有用吗?你能解释一下原因吗?
其次,假设我有一个算法,它采用了微量的时间,一个128字符的盐和一个介于10亿到100亿之间的随机数,并将它们混合在一起.这会提供很高的安全性吗?因为即使攻击者知道其中一个细节,在我看来计算其余部分仍然在计算上是不可行的.那是对的吗?
谢谢,
本
编辑:为了澄清,攻击者无法访问哈希算法,因此他们不能向系统发送任何信息.它们只有散列,它们必须弄清楚它是如何编译的.当然,即使他们知道哈希是如何产生的,试图用长盐来强制所有组合也会让它变得不切实际?
此外,哈希不是用户的密码或用户名,它只是用于身份验证的随机字符集.因此,不需要存储salt和随机数,只需要存储结果.在这种情况下,上面的系统,如下面的代码所示,是一个很好的系统,以防止攻击者能够真实地猜测用户的哈希可能是什么?
$salt = "some random characters I made up";
hash('sha256', microtime(true).$salt.mt_rand(1000,9999));
Run Code Online (Sandbox Code Playgroud)
我知道只有1000-9999而不是上面提到的数十亿.
再次感谢.
我遇到了一个以如下方式开头的哈希,我正在尝试反转它: $rar3$*1*
但是,我似乎找不到 rar3 哈希算法的彩虹表。
任何人都可以指出我正确的方向。
我无法理解golang crypto bcrypt 存储库中的以下代码
func newFromHash(hashedSecret []byte) (*hashed, error) {
if len(hashedSecret) < minHashSize {
return nil, ErrHashTooShort
}
p := new(hashed)
n, err := p.decodeVersion(hashedSecret)
if err != nil {
return nil, err
}
hashedSecret = hashedSecret[n:]
n, err = p.decodeCost(hashedSecret)
if err != nil {
return nil, err
}
hashedSecret = hashedSecret[n:]
// The "+2" is here because we'll have to append at most 2 '=' to the salt
// when base64 decoding it in expensiveBlowfishSetup(). …Run Code Online (Sandbox Code Playgroud) 我最近获得了Windows的l0pht-CD,并在我的电脑上试了一下它工作!
2600hertz.wordpress.com/2009/12/22/100-windows-xp-vista-7-password-recovery
我正在设计一个以类似方式存储pwd-s的"登录模拟器".目前的实施将容易受到上述攻击.Plz可以任何人(尽可能简单地说明),如何加强对抗这样的彩虹表攻击.
我的目标:构建"登录模拟器"以尽可能安全.(阅读黑客竞争;-))
谢谢.
我试图Rainbow Tables用密码加密来解决这个问题,并且只是到目前为止.
import sys
import random
import hashlib
def mt_rand (low = 0, high = sys.maxint):
"""Generate a better random value
"""
return random.randint (low, high)
def substr (s, start, length = None):
"""Returns the portion of string specified by the start and length
parameters.
"""
if len(s) >= start:
return False
if not length:
return s[start:]
elif length > 0:
return s[start:start + length]
else:
return s[start:length]
def unique_salt():
return substr(hashlib.sha1(mt_rand()),0,22)
password = "12345"
salt = unique_salt() …Run Code Online (Sandbox Code Playgroud) 我已经看到这篇文章描述了在数据库中存储"无盐"密码哈希的危险,这些密码哈希可能会使用所谓的" 彩虹表 " 进行逆向工程.
它还带有这个C#代码示例,它基本上需要在用户密码数据库表中存储两个哈希列(而不是传统的 - 一个.)这种方法的问题是我已经建立了一个带有未加密的用户密码的数据库表哈希,并添加新列将需要重组数据库.所以在我这样做之前,我一直在寻找另一种选择,这就是我想出的.
这里的函数不是简单地计算密码上的SHA1哈希值,而是用一长串伪随机(但一致)数据填充它,然后计算哈希:
byte[] computeSecureHash(string strUserPassword)
{
//RETURN: = SHA1 byte array on the 'strUserPassword'
//Make simple junk array based on the password
ushort v = 117;
byte[] arrJunk = new byte[24];
for (int c = 0, i = 0; i < arrJunk.Length; i++)
{
v ^= strUserPassword[c++];
v *= 7;
arrJunk[i] = (byte)v;
if (c >= strUserPassword.Length)
c = 0;
}
//Make crypto byte array based on the password
Rfc2898DeriveBytes …Run Code Online (Sandbox Code Playgroud) 好的,因此哈希的整个问题是用户不会输入长度超过15个字符的密码.大多数人只使用4-8个字符,使攻击者很容易用彩虹表破解.
解决方案,使用用户salt使哈希输入更复杂,超过50个,这样他们就永远无法生成一个表(对于那些大小的字符串来说是大的).另外,他们必须为每个用户创建一个新表.问题:如果他们下载数据库,他们将获得用户盐,所以如果他们足够关心你就回到原点.
解决方案,使用网站"胡椒"加上用户盐,然后即使他们得到数据库,他们仍然必须知道配置文件.问题:如果他们可以进入您的数据库,他们可能也会进入您的文件系统并发现您的网站.
因此,所有这些都已知 - 让我们假设攻击者进入您的网站并获取所有内容,一切都是如此.那你现在做什么?
在讨论的这一点上,大多数人回答"谁在乎这一点?".但这只是一种廉价的说法,"我不知道下一步该做什么,所以它不可能那么重要".可悲的是,在其他任何地方我都问过这个回答的问题.这表明大多数程序员都错过了一个非常重要的观点.
让图像显示您的网站就像其他95%的网站一样,用户数据 - 甚至是完全的服务器访问 - 都不值得蹲下.攻击者碰巧是在你的一个用户"Bob"之后,因为他知道"Bob"在你的网站上使用与在银行网站上使用相同的密码.他也碰巧知道鲍勃在那里有他的人生储蓄.现在,如果攻击者可以破解我们的网站哈希,剩下的将是小菜一碟.
所以这是我的问题 - 如何在没有任何可追踪路径的情况下扩展密码的长度?或者,如何使哈希过程复杂化并及时复制?我唯一想到的就是你可以重新散列数千次哈希,并将创建最终彩虹表所花费的时间增加1000倍.这是因为攻击者在创建表时必须遵循相同的路径.
还有其他想法吗?
rainbowtable ×10
hash ×4
cryptography ×3
passwords ×3
encryption ×2
asp.net ×1
bcrypt ×1
c# ×1
go ×1
python ×1
rar ×1
salt ×1
security ×1
windows ×1