Cryptography
新的 arc4random_uniform 实现
本月初, Robert Clausecker 替换了 FreeBSD 的 arc4random_uniform(3)。
arc4random_uniform(3) 是 arc4random(3) 之上封装的一个生成一个较小范围伪随机数的函数。
arc4random(3) 采用密码学安全的伪随机数生成一个在 32-bit 范围,即 内均匀分布的伪随机整数,
此处的随机分布是依靠对称加密算法(目前采用的是 Chacha20)中用于实现加密的伪随机置换(Pseudorandom
Permutation)来保证的。
检测中间人攻击
今天在邮件列表里看到 John Nagle (就是发明 TCP Nagle 算法的 那个 John Nagle)提到希望 OpenSSL 提供一些帮助自动检测中间人攻击的 方法。简单地说,因为中间人攻击会改变双方看到的加密流(密钥变了),因此,如果上层协议包含了加密流的某些特征,攻击者想要实施中间人攻击的成本就会大大增加。他同时举了一个例子,一种早期的加密电话会在话机上显示从密文开始的部分计算的两位数字,而通话双方则通过通话来确认数字相同,这样,中间人攻击的实施者就必须解析语音并替换掉相关的字词来避免被发现。
简单的例子是,比如准备发出 HTML/XML 之前,首先发出它们在加密之后的密文的 hash。攻击者如果简单地截获并重新加密文档,则攻击会被立即发现;如果缓冲并重新计算结果,必然会引入延迟;如果事先准备好文件并做好计算,则需要在看到文件之前就准备好这些资料(不过实际应用中,攻击者很可能会选择这么做)。这些都会增加实施中间人攻击的困难。
阅读全文…gmpy/离散对数
前几天做一个解离散对数的题用到了 gmpy,它是 GMP 的 Python 封装,用来算大数。
这里记两笔。首先是大整数需要用 mpz 对象,例如:
p = mpz(13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084171)判断大数是否是质数:is_prime(p) (求离散对数其实用不着)
求逆元 :invert(x, p)。例如, y = invert(x, p) 则
多次使用同一个一次性密码本的破解
正确地使用一次性密码本进行加密,在理论上是无法破解的。需要注意的是,许多对称式加密算法本质上是通过一定的算法来将密钥作为伪随机数发生器的种子来产生(近似于)一次性密码本的序列,因此类似的问题也需要予以重视:不要重复使用同一个一次性密码本(或密钥)来加密不同的明文数据。
以基本的一次性密码本加密算法,即按字节做 XOR 来看,由于在这个算法中明文和密文的字节位置是一一对应的,很明显,同一个位置的两份密文之间做 XOR,可以知道两份明文之间的 XOR 值(因为在这个过程中,密钥 k 被 XOR 消去了)。
假如明文碰巧又没有做任何压缩处理,实际上我们可以用程序来穷举出部分的密码本,并逐步解出全部明文。具体方法大致如下:
阅读全文…SHA512-crypt
早期的 FreeBSD 版本中采用的是 md5crypt,其作者 Poul Henning-Kamp 最近发表了一篇文章:Md5crypt Password scrambler is no longer considered safe by author,所以 FreeBSD 预设的密码格式也就随之改成了 SHA512 crypt。
阅读全文…计时攻击和登录系统设计
计时攻击是一种通过观测由于某些操作时泄露出来的时间信息来获取更多信息的攻击。由于设计和实现的不同,攻击者能够通过计时得到的信息也会不一样。简而言之,作为安全系统的设计者,必须对可能泄露信息的各种渠道有充分的了解,并针对它们采取因应措施。
阅读全文…备忘:OpenSSL valgrind报"Conditional jump or move depends on uninitialised value(s)"的解决
最近改一个用到 OpenSSL 的程序,顺手用 valgrind 抓了一下,发现很多「Conditional jump or move depends on uninitialised value(s)」的错误。发现 OpenSSL 的 FAQ 提到,在生成随机数时会将输入缓冲区(未初始化)的内容直接混入 entropy pool,使用 valgrind 时便会导致警告。
廉价GPU时代的密码策略
很久以前我曾经建议过别人使用足够长的一大串英文单词作为密码,现时这样做已经完全不能保障安全了。
Colin Percival最近在 一篇文章 中提到了这样的数据:使用价值 $10k 的 GPU 破解使用MD5的34位英文密码(例如"You will never guess this password")所需要的时间仅为两小时(如果使用专用的硬件,以$1M投资的ASIC可以在一秒之内完成破解)。如果密码长度不够长的话,采用了特殊符号的帮助也不大。足够复杂的8位密码,例如"6,uh3y[a"使用 $10k 的 GPU 破解只需10个小时。
阅读全文…tarsnap修正了一个重大安全漏洞
今天 Colin 在blog上介绍说 他刚刚修正了一个 TarSnap 重大安全漏洞。简单地说,用来加密密钥文件的AES-CTR实现时,计数器没有增加(正确的实现中计数器应该每次递增),导致在已知明文时能够通过加密块推算出一块数据使用的密钥,并用它来解密余下的数据。
阅读全文…为什么要用公钥/私钥而不是密码去做SSH身份验证
SSH提供了很多种不同的身份验证,其中最常用的两种便是密码验证和基于公钥/私钥的身份验证。
基于公钥/私钥的身份验证有非常多的优点。
首先,公钥/私钥可以从根本上挫败监听来截取验证信息的企图。
阅读全文…