博文

目前显示的是 八月, 2008的博文

SecurID 卡的原理

163为它的游戏用户推出了动态口令卡。售价才10元。这让我非常的诧异。首先,我觉得这几乎是无懈可击的密保技术。其次,RSA的 SecurID卡在国内在几百RMB一个。而163的这东西,实在是便宜……以前一直对这东西的原理很好奇。今天翻了些文档,略微整理如下:1、密码:
登陆密码=f(静态密码,动态密码)。
静态密码就是用户自己设置的一个密码。
动态密码是通过卡动态生成的密码。
f是一个简单函数。例如不进位的加法、字符串拼接。
用户的静态密码最好是不要通过电脑键盘输入不通过网络传输的,所以很不推荐采用字符串拼接的方式。2、构成
一个8位的处理器,一个时钟,一个LCD显示屏,一块电池。可能还会有一个键盘。
外壳的设计目标:一旦打开外壳,那么立即清空内存数据。
内部的设计目标:存储一个种子文件。然后按文件中的数据和当前时间拼起来进行AES,然后hash成6-8位的数字,显示在LCD上。如果有键盘,那么用户可以通过键盘输入一串数字(用户的静态密码)。卡把这串数字(静态密码)与卡实际生成的数字(动态密码)用一种公开的算法(前面所说的那个f)进行组合,然后显示出来。通常采用的是不进位的加法。因此这个部件不是我们所需要关心的部分。理论上来讲,如果知道种子、如果知道时间、如果知道生成器内部所采用的算法,那么我们就可以自行的算出这个动态密码。既然RSA公司敢发布软件版的生成器,那么就意味着它不怕这个算法被知道。事实上这个算法被hacker们公开已经是10年前的事情了。一个俄国hacker在发布自己的软件模拟器后留下这样一段话:
“RSA公司的伙计们:
如果你需要人帮助你设计安全的加密算法和协议,告诉我们,我们将会帮助你做出来。俄罗斯人并不都是熊。我们的国际象棋比你们下的好,记住!”但是难点在于从卡中取走种子文件。就目前而言,是不可能通过它产生的随机序列反推回去得到它的种子文件的。在网上看到了另一种类似方案:
1、用户输入一个用户名,发送给服务器
2、服务器返回一个随机数,记做C
3、用户使用自己的密码unlock动态口令卡
4、用户输入C。动态口令卡计算f(C,time,seed),然后显示出来
5、用户把口令卡的结果发送给服务器6
6、用户锁住口令卡

Berkeley db in Tuxedo?

今天看Berkeley DB 4.7的文档的时候发现,在创建Berkeley db 的时候可以选择不把它放在Berkeley db的env中,而是放在Tuxedo中让它来做Transaction Container。这非常的让我意外。
Tuxedo据说很好很强大的哦。期待改天能有机会用用看。

tail recursion

ML尽管是一门函数式语言,但是在使用的时候要万分注意自己所写的rec函数是否能被编辑器优化成普通的loop。我现在唯一所知的就是tail recursion可以被优化掉。我刚开始写了这样两个函数,(* 生成一个长度为length的list,其每个元素是n *)letrec gen_list length n = match length with0 -> [] |_ -> n::(gen_list (length-1) n);; (* 对list求和*)letrec sum = function[] -> 0 | a::l -> a+(sum l) ;; 运行发现,只要list的长度很大,就会报告“Fatal error: exception Stack_overflow”let rec gen_list2 length n = let rec appendl length n = if(length=0) then lelseappend (n::l) (length-1) ninappend [] length n;; let sum2 l = let rec myloop ltotal= match l with [] -> total | a::other -> myloop other (total+a) in myloop l 0;; 规则就是:从rec调用得到值不要再进行任何运算,立刻返回!

ocaml中的浮点数真是奇怪

# 11 == 11 ;;: bool = true # 1.1 == 1.1 ;;: bool = false 真是奇怪哦~ 另外,ocaml中通过在每个int中保留一位做GC的方式,也是令我相当的惊讶。迄今为止我还没有听说过有别的语言这么做的。还有哪个语言的int上限是12亿而不是24亿?

级数{1/n}的发散性

课本上证明级数{1/n}是发散的,是采用柯西准则。从第m+1项开始选取了m项,然后证明这m项的和的绝对值大于1/2。
昨天做题的时候看见一个有趣的序列:a(n)={1+1/2+1/3+...+1/n-Ln(n)},这个序列是收敛的。于是显然,减号左边的东西是发散的。

mysql中怎么复制一条记录?

mytable 中有一条id=1的记录,我想把它复制一条,并且把id设置为2。
我这样写:insertinto mytable (select * from mytable where id=1) ON DUPLICATE KEYUPDATE id=2;结果发现效果等同于update mytable set id=2where id=1;啊!!!
要么就是show create table mytable;
然后修改下,创建一个新表,然后插入,然后修改key,然后再插回来,然后删除临时表
有没有简单点的办法啊?