嗯,我想哈希密码,我看看ASP.NET Identity在Microsoft.AspNet.Identity.Crypto类中的作用,我来了这个函数(用于比较2密码哈希):
[MethodImpl(MethodImplOptions.NoOptimization)] private static bool ByteArraysEqual(byte[] a,byte[] b) { if (object.ReferenceEquals(a,b)) { return true; } if (((a == null) || (b == null)) || (a.Length != b.Length)) { return false; } bool flag = true; for (int i = 0; i < a.Length; i++) { flag &= a[i] == b[i]; } return flag; }
这是从反射器输出的直接复制…
现在我的问题是,NoOptimization属性是什么好的,为什么它应该在那里(如果我删除会发生什么)?对我来说,它似乎是一个默认的Equals()实现,直到for循环.
我试图看看IL,但对我来说都是废话:/
解决方法
如果一个“智能”编译器将该函数转换为一旦发现不匹配就返回false的东西,那么它可能会使使用此函数的代码容易受到“定时攻击”的攻击.攻击者可以想像出第一个不匹配的位置一个字符串是基于函数需要返回多长时间的.
这不仅仅是科幻小说,实际上,尽管它似乎是这样的.即使使用互联网,您可以采取一大堆样本,并使用一些统计数据来确定如果您猜测实现短路,会发生什么.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。