February 2009 Archives

许多新的笔记本计算机系统配备了基于指纹的身份识别系统。与通常人们的认知不同,这类系统的安全性往往仅仅与使用口令相当,甚至要比基于口令的身份认证系统来的更差;这类系统的价值在于,它们简化了用户的身份验证过程,而不是其改善了系统的安全性。

指纹识别,以及目前采用的其他生物特征识别技术,其共同特点是需要使用某种加密存储来保存特征数据 以及 用户用于验证身份的信息,这类信息可能是口令,也可能是私钥等等。

不可避免地,由于生物特征只能以基于概率的方法来进行验证(例如,指纹验证通常是取几十个数据点,如果符合的比例超过一个阈值则认为匹配),而不是通过采样得到数据直接来进行计算(话说回来,即使是这样也有问题,因为那样的话,便没有办法任意修改这些数据来获得与更换密钥同样的效果),因此,这些加密存储也就不得不要求验证系统本身持有解密的密钥。换言之,如果负责身份验证的芯片存在后门或漏洞的话,是否持有带生物特征的信任状,并不会改变能否拿到机密数据这个结果。又比如,身份认证芯片本身如果完成的是取解密密钥,而不是解密这样的操作(从减少成本的角度说,很有理由这样做),那么一旦软件系统存在的漏洞所导致的风险就大大提高;而由硬件直接完成解密操作的问题则是,硬件事实上没有办法验证软件是否仍然在一个"理性"的状态运行,或者说,硬件并没有办法来验证访问它的软件是不是它期待的那一份。

不过,从积极的方面看,基于生物特征识别技术的身份验证方案尽管并不能消除系统中的任何薄弱环节(如果不是增加薄弱环节的话),但是对于缺乏安全知识的用户还是有一些积极意义的,例如:

- 由于不需要每次都输入很长的口令,这些用户会更乐意接受不容易被穷举的、复杂的长口令。当然,任何理性的远程验证系统都应该有适当的密码重试锁定策略,这种做法只是减少或消除了偶然猜中密码的可能性。

- 减少了使用长口令的用户登录的时间。

- 看起來很"酷"。

不过很遗憾,这个列表并不包含直接地改善系统的安全性。

为什么FreeBSD没有CIRCLEQ_*

| 1 Comment | No TrackBacks

最近在看 Berkeley DB,发现一套 FreeBSD 上没有的宏, CIRCLEQ_*。

看了一下,这组宏是来自 4.4BSD 的,因此 FreeBSD 曾经有过这个宏;后来, phk 在 2000 年 12 月 29 日从 FreeBSD 里面把它拿掉了(SVN revision 70469),当时的说明如下:

CIRCLEQs are a disgrace to everything Knuth taught us in Volume 1 Chapter 2.

Retire them before anybody starts to use them again.

Use TAILQ instead, it provides the same functionality.

这个说的并不是很明确。查了一下,果然当时引起过争议(反对的意见主要是认为这会导致无法从 NetBSD 和 OpenBSD 移植代码,而另一方面,这被认为是 4.4BSD API 的一部分)。

Kirk McKusick(queue.h的作者)随后表示 支持 这一变动。具体的原因是 CIRCLEQ 的所有的功能,都可以用 TAILQ 以更高效的方式实现(因为 TAILQ 产生的 比较 操作更少)。

在移植代码时,只需简单地将 CIRCLEQ 替换为 TAILQ 即可。需要注意的是,如果代码中有绕过宏进行的操作,则需要进行相应的变动。

刘纪鹏老师一篇很有意思的 文章,对这个问题有兴趣的同学建议读一读。

OpenJDK on FreeBSD

| 2 Comments | No TrackBacks

Maho今天正式commit了 OpenJDKport,表面上看这是一小步,但在我看来这却是一项历史性的进步,因为终于可以不再受到之前那个 click-through 许可证的限制了(也就是说,可以几乎没有任何限制地随光盘,或者通过网站提供可用的jdk源代码和二进制版本了)。

与此同时,继续期待 Apache Harmony 的 FreeBSD port,有没有人有兴趣搞一下?

How Project Really Work......

| 2 Comments | No TrackBacks

From Project Cartoon. This is version 2.0.

注意:如果您熟悉RAID请不必浪费时间阅读这篇文章。

为什么用RAID-Z/RAID-Z2而不是RAID-5呢?

答案是:RAID-5有一个不可避免的问题,即它必须使用后备电源才能保证写入的正确性。这也是为什么我一直极力反对使用低档RAID卡和软件实现的RAID-5的原因。

简单地说,RAID-5在写入数据时会需要覆写整个stripe(通常需要读,然后计算parity,然后再写),由于条件限制,尽管写入操作可能只涉及两块磁盘,但整个stripe很可能在不同的磁盘上并不是同时、原子地写入。这样的结果是,磁盘上可能出现不一致、并且无法检测的数据。如果RAID-5的cache很大,这很可能会是多个stripe的数据。因此,想要确保数据的可靠性,就必须为RAID-5的写入缓冲配备后备电源,或保存在非掉电丢失的存储中。

RAID-Z和Z2是解决这个问题的一种方法。RAID-Z采用写时复制的方法,即,不覆写数据;另一方面,由于文件系统元数据中记录了checksum,使得数据的正确性能够被检测出来;最后,RAID-Z使用动态的stripe尺寸,这个优化使得RAID-Z能够获得更好的性能。在RAID-Z配置中,带后备电源的缓冲的作用是在断电时留住更多的数据,而不再是确保数据的完整性,因此,也就不再是必需的了。

1987年

| 3 Comments | No TrackBacks

1987年,菲律宾前总统访华,谈到南沙主权问题时说:"至少在地理上,那些岛屿离菲律宾更近。"

邓小平抽了口烟,说:"在地理上,菲律宾离中国也很近。"

从此,南沙再无战事。

一道小学数学题

| 16 Comments | No TrackBacks

很久没有shared chaos了,今天来一道小学数学题。

有一个水池,进水的速度恒定,提前接了一定时间的水;水池有若干出水口均在底部,假设所有出水口的出水速度一样(换言之,每多开一个出水口,速度即相应线性提高----本人注)。同时打开3个出水口,水池水位在80秒后会下降到0;同时打开4个出水口,水池水位在50秒后会下降到0;问:如果同时打开8个出水口,水位需要多长时间下降到0?

其实是个很简单的常识,居然搞了我半个小时......

fgetc()的返回值是int,因为这个值除了返回拿到的字符之外,还兼作错误标志。由于fgetc()允许文件中包含任意内容,所以只好增大返回值的宽度来表达。

因此,很显然,(ch = (char)fgetc(fp)) == EOF是不对的。

一个问题请教WxWidget高手

| 6 Comments | No TrackBacks

WxClassInfo的析构函数(~WxClassInfo)死循环是什么原因?检查发现RTTI的那个链表有个环,但是不太明白这个表(从上下文看是由Register()方法维护的)为什么能出现环?

具体的案例是 MadEdit (FreeBSD port) 退出时,由于 exit() 会调用 atexit() 定义的钩子,后者调用 WxClassInfo 的析构函数,并在此时陷入死循环。

BeOS Reborn: Haiku

| 1 Comment | No TrackBacks

Pretty interesting project: Haiku.

It looks like that it uses a lot of FreeBSD code by creating glue between FreeBSD and BeOS API, on the other hand they are using MIT license for most of their code, making sharing code easy.

memchr(3) rewrite

| 1 Comment | No TrackBacks

I have taken some time to rewrite memchr(3) to utilize similiar algorithm as my strlen(3) did. Two different formular, however, would have a roughly 1/3 difference.

Currently I have taken an approach that when memchr(3) is trying to match a pattern of 8-bit, then consider the string as 8-bit, which uses the first formular which is expected to have uniform O(n) time complexity by reducing unnecessary branches.

This approach, however, might be bogus since if you find 7-bit character within a 8-bit string, in that case, memchr(3) would perform poorly, if there are a lot of characters having their MSB as 1.

I'm thinking about how to deal this in a more reasonable way.

Monthly Archives

Pages

OpenID accepted here Learn more about OpenID
Powered by Movable Type 5.2.3