技术

Java/PHP/C ... 几种语言 RSA 的互操作

最近有一个项目,涉及到和别的网站合作,双方通信的鉴权计划是通过 RSA 来做。由于可能涉及到不同的开发环境,于是要研究一下各个语言对 RSA 的支持

  1. openssl 缺省创建出来的公密钥文件是 PEM 格式的,但 Java API 导入密码只能是 DER 格式,特别是密钥必须用 PKCS#8 编码。这就需要对 openssl 产生出来的文件做一下转换
    • openssl rsa -inform PEM -in rsapriv.pem -outform DER -pubout -out rsapub.der
    • openssl pkcs8 -topk8 -inform PEM -in rsapriv.pem -outform DER -nocrypt -out rsapriv.der
  2. 基础算法的标准是 openssl 的:RSA_private_encrypt/RSA_public_decrypt、RSA_public_encrypt/RSA_private_decrypt 这4个函数,因为 PHP 的 openssl 模块也只提供了这 4 个基础函数(不要幻想用非 openssl 模块之外的东西来做 RSA 运算,比如 PEAR 的 Crypt_RSA,速度慢到令人发指)
  3. 要注意上述 4 个函数里,可使用的 padding 参数只有那么有限的几种。对应 Java 里面 Cipher.getInstance() 的参数,只能用 "RSA/NONE/PKCS1Padding" 或 "RSA/NONE/NoPadding"(或许 "RSA/None/OAEPPadding" 是对应RSA_PKCS1_OAEP_PADDING,但我没有深究了)。缺省 PHP 里的 padding 是 RSA_PKCS1_PADDING
  4. 关于 python... 嗯,直接用 ctypes 就好啦
  5. 用 RSA 签名都是首先将文本做一个单向 hash,然后用私钥将签名加密;校验端拿到签名和文本,用公钥将签名解密,对比是否是文本的 hash。openssl 因此封装了 RSA_sign/RSA_verify 来做这个事情。

    总之为了更多语言的互操作能力,我们现在没有用 RSA_sign/RSA_verify 这两个封装好的函数。
Topic: 技术

将 DV Type-1 AVI 转换为 Type-2

关于这两种类型的差别有人写的很明白了:http://www.igenus.org/blog/2006/10/dv.html ...

家里移动硬盘一共4块,其中最古老的已然是 2003 年的产品了,我觉得数据眼看就不太保险,于是买了一个 500G 的移动硬盘,整个五一假期就在家里备份数据(不仅仅是移动硬盘,大概20张左右2003年刻的 SVCD 这次也一并做成 ISO 保存起来)

数据的大头是以前的 DV,有部分采集后还没有压缩的,于是就得先压缩。但有那么10G左右的数据无法用偶的 DV-2-XviD 处理,甚至用 AutoGK 也会报错,后来我上网搜了一下,说是这种错误应该是由于 Type-1 的 AVI 格式导致的,用 GSpot 一看,果然如此

反正得去找转换工具。但 google 出来的转换工具都是死链接,要么就是根本无法转换。最后无意中发现 ffmpeg 可以做这个事情:

ffmpeg -i SRC.avi -vcodec copy -vtag dvsd -acodec pcm_s16le -f avi DST.avi

然后就是上 DV-2-XviD,很容易就搞定了

Topic: 技术

用 js 做 URL 跳转带来的 Referer 丢失问题.

http 302 重定向是可以保持 referer 的。例:在 A 页面上提交登录表单到 B,B 返回一个重定向页面到 C,在 C 处理里面检查 Referer 可知道它的来源是 A 而不是 B。

但是如果用 window.location 或 document.location 做这个跳转就不一样了。假如在 A 页面上执行 window.location = B,如果是 IE 浏览器,会发现 B 页面的 Referer 为空。firefox 倒是可以保持 Referer,不过在 IE 占绝大部分市场份额的中国,必须想办法避免这个影响。

最后从网上找到这么一个解决方案:

  1. function goTo(url) {
  2.     var a = document.createElement("a");
  3.     if(!a.click) { //only IE has this (at the moment);
  4.         window.location = url;
  5.         return;
  6.     }
  7.     a.setAttribute("href", url);
  8.     a.style.display = "none";
  9.     document.body.appendChild(a);
  10.     a.click();
  11. }

现在我可以追踪到所有跳转到搜狐邮件的来源了

Topic: 技术

为什么不用ntpdate,而要用ntpd

搜狐的服务器在被 Tech-NO 安装的时候,缺省都会设上一个每天自动 ntpdate 同步时间的脚本。这个精度对付一般的应用可能也就够了,但我们的几台 pv 统计服务器最大的时间差能到10s,对于计算用户访问的入口点来说就可能产生极大的偏差。

本文的题目来自 Xin Li 的这篇文章,其实他说的已经很好了,我这里再详细补充一下:

NTPD 在和时间服务器的同步过程中,会把 BIOS 计时器的振荡频率偏差——或者说 Local Clock 的自然漂移(drift)——记录下来。这样即使网络有问题,本机仍然能维持一个相当精确的走时。

NTPD 唯一的问题,可能就是安全性了。我理解为什么 Tech-NO 大规模装机不用 ntpd,但我觉得技术上还是应该这么去做的。

Topic: 技术

介绍一下SystemTap

很久以前听说的 SystemTap,自从 Mac 和 FreeBSD 先后从 Solaris 那里移植来 DTrace 后,Linux 就在系统性能调优方面,成为一个很受果粉和F粉鄙视的操作系统(老实说,其实我们三方一直在互相鄙视),偶们L粉这方面唯一可以拿来自慰的,就是 SystemTap 了。

听说归听说,但从来没有用过。直到这个星期某同事调查设备IO Wait极高的故障,我就建议他从 SystemTap 入手。既然给别人挖了一个坑,我也顺便试了试该功能:

  1. 从宽泛的层面看,DTrace/SystemTap更像是一个给系统管理员定位瓶颈的工具。程序员若要解决自己程序的问题,可能优先会去考虑profile工具。但有些情况,比如Daemon进程,要去profile这个不间断运行,不断fork的环境,估计力有未逮,DTrace/SystemTap这就能排上用场
  2. 使用SystemTap,本质上是写一段小小的脚本,SystemTap会将它处理为一个C程序,然后编译成一个内核模块(!!!),插入内核,在各个系统调用的进出点执行脚本里定义的计数等任务,并打印出来
  3. 没有用过DTrace,反正看评论是大家都说其比SystemTap好使。想要用好SystemTap,必须对syscall很熟悉才成。估计DTrace对各类系统任务封装的更好,可能不会 C 语言,不懂什么是 syscall 也能使用。
  4. SystemTap 脚本语言居然支持 hashtable 数据结构,这还真是一个挺高级的特性
  5. SystemTap从2.6.11才在标准内核里出现,RedHat从RHEL4(尽管是2.6.9)开始内置了这个特性——注意还得同时安装kernel-debuginfo
  6. 最后,我觉得任何一个在 Linux 下工作的程序员/管理员都应该关注这个东西,在这个互联网时代,找出服务的瓶颈并改进可能将是最重要的技能之一。
Topic: 技术

open(2)

直到今天才注意到一个问题,就是以 O_CREAT 模式打开一个新文件,比 O_APPEND 追加一个文件要慢得多!同事简单测试了一下,结果是这样:

  1. O_CREAT 比 O_APPEND 至少慢三倍。(以前只是直观的感觉创建文件会慢,但没想到会慢这么多)
  2. 创建一个文件,写4次,每次4k,(共16k)再关闭。所耗费的时间,大概是给一个文件追加16k时间的1.5倍
Topic: 技术

用 apxs 辅助工具在 Win32 下编译 Apache Module

最近 Passport Module 有一个重大升级,在自己的 WinXP 上做开发的同事需要我们提供一个 win32 的新模块。

上次编译 module 是 2 年前了,那时候环境为 Apache 2.0.x + VC7.1 (2003),现在则是 Apache 2.2.x + VC9.0 (2008),按以前的套路三下五除二搞出来一个 mod_passport 后,发现 apache 无法加载。

折磨了半天,最后是从一个专门作 apache module win32 build 的地方,弄到一个专门给 Win32 平台用的 apxs (http://www.apachelounge.com/download/apxs_win32.zip)。用它编译则轻松搞定,看起来原因是必须用 MT.exe 加入 manifest 后,才能正确加载模块(上网搜了一下,从 VC8.0/VS2005开始就是介个样子了)。就是:

cl /MD /D "WIN32" /c mod_foobar.c
link /DLL mod_foobar.obj libhttpd.lib libapr-1.lib
mt /manifest mod_foobar.dll.manifest /outputresource:mod_foobar.dll;#2

PS: 对于一个需要偶尔在 win32 下编译开源程序的 console控来说,Windows SDK for Windows Server 2008 and .NET Framework 3.5 就足够了,已经自带了 VC 9.0,不用再去安装 Visual C++ 2008 Express 了

Topic: 技术

blog feed 全文输出

前段时间在 Google Reader 里(应该是在这里,别的地方我也不去了)看到好几篇 blog 都在推荐一个工具,把不是全文输出的 feed 变成全文输出。因为那时没有感觉到有这个必要,所以扫一眼,就下一篇了。

这两天,发现新浪博客开始搞这一手了(也许是部分比较知名的博客),于是在网上搜了一下,找到一个 http://mrss.dokoda.jp/。也不知道是不是就是前段时间看到的别人推荐的工具,反正我试了一下,只需拷贝 blog 的地址或者 feed,再粘贴到输入框中,点 [GO] 按钮就行,超级简单,超级傻瓜,很不错。

Topic: 技术 网络

写了一个 Word Doc Binary Parser

最近这十来天,业余时间基本上都在弄这个东西... 对照着微软公开的文档,以及参考 http://b2xtranslator.sourceforge.net/ 这个项目的源代码来作开发。

用 python 开发,到现在可工作的代码还不到 1000 行,已经能 convert 出一个 html 来了——只有文档结构,包括列表和表格,没有 style/picture.....

如果不是因为部分代码和文档参考是在上班时间抽空作的,我就公开发布了,现在么...只能是给内部用了。

估计再弄个2个星期,就可以给webmail用户玩在线预览了,WAP用户其实现在就可以用我这个简单的成果了. :)

Topic: 技术
订阅 RSS - 技术 | BT的花