氪星被设计用来使用大量的内存,如果不使用所有的内存,计算起来会慢几个数量级。不管是哪种方式,它都可以抵抗自定义硬件攻击,在这些攻击中,内存往往不多。
我在想,为什么还要让时间记忆权衡呢?如果使用具有非常大的(当然是可调的)内部状态的散列函数,难道不是更好吗?内部状态的大小决定了内存需求,而轮数是工作因素。
发布于 2017-09-13 03:33:20
我认为您已经描述过沙三,其中capacity c (以及较小的程度上,rate r)正是您所指的“非常大(当然是可调的)内部状态”。
您不必将其提升到很高的级别(512位/ 1024位)才能获得256 / 512位安全级别。
不过,请记住,密码学的目标不是让攻击者做大量的工作,而是让攻击者比合法用户做更多的工作。哈希涉及对内部状态执行昂贵的操作,因此盲目地增加内部状态的大小对合法用户的伤害与对攻击者的伤害一样大。
大内存scrypt需求的目的是利用合法用户(一次处理少量登录请求的服务器)所拥有的资源,但对于在大规模并行化硬件平台上运行的攻击者来说却是稀缺的。
发布于 2017-09-13 05:58:52
这叫“交换”是有原因的。:)
正如Mike建议的那样,攻击者和合法用户之间存在着不对称。但是,在合法的用例中也存在不对称。
例如,您的scrypt实现可能会被调优,以便在正常情况下并行地验证一小部分用户。但是,如果出现中断或中断,所有用户都被断开连接,然后(可能是自动的)尝试同时重新连接?如果该故障模式是您的应用程序的潜在用例,则可能需要相应地调整您的氪星可调性。
但是,如果你只使用scrypt来保护个人系统上一个高度敏感的加密卷,那么延迟几秒钟可能对你来说是可以接受的,并且可以增加攻击的成本。
这就是权衡。
发布于 2018-01-21 08:58:22
在某种程度上,时间-记忆的权衡是一个不可避免的结果有一个大的内部状态。CS.SE的人员可能会想出一个更正式的解释,但基本上,如果您的密码哈希调用了大量的中间值,那么内存受限的攻击者总是可以按需计算这些值。
https://security.stackexchange.com/questions/169323
复制相似问题