missing idea

read the fscking manual

导航

Blog统计

公告

My PGP Key | 我的PGP密钥

版权所有. 除非特别声明, 这里的全部原创以如下CC授权发布: 署名.

Creative Commons License

Firefox 3: 秒杀一切浏览器.
Firefox 3

 

文章

收藏

相册

置顶区

存档


正在读取评论……

2009年06月14日

不知道是不是个bug,无论用 cu(1) 还是 GNU screen 都不能设置 /dev/cuad0 设备的波特率,只有预先用 stty(1) 配置好才可以。

stty < /dev/cuad0 19200
screen /dev/cuad0


2008年10月31日

wxWidgets compilation with DDK 3790.1830:

LIB:

nmake -f makefile.vc ^
INCLUDE="%crt_inc_path:\*=\i386%;%ProgramFiles%\Microsoft Platform SDK\include" ^
  CFLAGS=/Gy CPPFLAGS=/Gy LDFLAGS=/OPT:REF ^
 DEBUG_RUNTIME_LIBS=0 UNICODE=1 BUILD=debug SHARED=0

DLL:

  LIB="%crt_lib_path:\*=\i386%;%sdk_lib_path:\*=\i386%" ^
 LDFLAGS=bufferoverflowu.lib SHARED=1




2008年10月21日

最早听说WTL(Windows Template Library),好像是上学时候的事儿了。那时正好刚刚认识VC++ Toolkit 2003和windbg,曾经以为有了它们三个,就可以堂堂正正地在Windows下面用M$的免费工具开发程序啦。

但是今天一通研究发现,现实是残酷的。WTL是开放,但是依赖于ATL。ATL可是VC++的组件,Express版里可是没有的。所以WTL在VCExpress中是不能使用的。

仔细看WTL的readme,就会发现,它说支持VCExpress啊,只要使用Platform SDK中的ATL头文件就可以啦。但是实际使用就会发现,SDK中没有atlthunk.lib,会产生连接错误。尽管这个文件在DDK中有,可DDK中又没有WTL需要的richedit支持。这里提到的SDK和DDK都是Windows 2003 SP1的(SDK:5.2.3790.1830.15 Apr05,DDK:3790.1830)。

通过atlthunk.lib查到M$有人说PSDK05中的MFC和ATL是用于移植程序到64位环境上的,不支持用来生成32位的程序。

This library is not shipped with any build of PSDK because PSDK does not support using PSDK's version of ATL in 32bit builds. [1]

还有一个证据,在Vista和2008的Windows SDK中,MFC和ATL都彻底不见了。我想这里有两层原因,其一,这两样东西本来就是VC的重头戏,不应免费发行,其二,PSDK05中的MFC和ATL都是VC6的改良版,许多代码不是标准的C++写法,跟如今的编译器不兼容,也不应继续发行。

所以,简而言之,WTL只能算是Visual C++正式版的一个正版增值服务。Windows平台上彻底免费的官方开发库只有SDK和DDK。



2008年09月10日

参考 MBSA 的 FAQ. http://technet.microsoft.com/en-us/security/cc184922.aspx

可以先下载用于扫描的数据,

  1. Security update catalog (wsusscn2.cab)
  2. Windows Update Redistribution Catalog (wuredist.cab)
  3. Authorization catalog (muauth.cab)
set MBSACACHE=%USERPROFILE%\Local Settings\Application Data\Microsoft\MBSA\2.1\Cache
wget -SN -P "%MBSACACHE%" "http://go.microsoft.com/fwlink/?LinkId=76054"
wget -SN -P "%MBSACACHE%" "http://update.microsoft.com/redist/wuredist.cab"
wget -SN -P "%MBSACACHE%" "http://download.windowsupdate.com/v7/windowsupdate/redist/standalone/MUAuth.cab"
wget -SN -P "%MBSACACHE%" "http://download.windowsupdate.com/WindowsUpdate/redist/standalone/7.0.6000.381/WindowsUpdateAgent30-x86.exe"

如果要扫描其它计算机, 要关掉它们的防火墙, 禁用来宾访问方式, 最后试验管理员远程 net use. 成功后, 用

runas /netonly /user:Administrator cmd

启用网络上的认证. 然后在拥有网络身份的 cmd 窗口中, 运行

path %ProgramFiles%\Microsoft Baseline Security Analyzer 2;%path%
mbsacli /target 192.168.2.131

 



2008年09月07日

每天在邮箱里收到计算机状态的报告,这样的管理员太爽了。但是好多应用程序一直只支持简单的 SMTP 发送方式,没有 SMTP 认证功能,更不用提 SSL 和 TLS 了。其实只要用 Windows 提供的 SMTP 服务做一个简易的邮件转发,就可以基本满足要求。

很久很久以前,任何一台互联网上的计算机都能用 SMTP 发送邮件。如今不同了,垃圾邮件让整个互联网都神经过敏。公网上的,尤其是个人和小用户的大部分地址都被黑名单了。所以现在要发邮件,必须用大网站提供的服务。有的服务商开放度比较高,只要认证成功,就可以通过他们的 SMTP 发信了,而且还可以在 MAIL FROM 命令后任意填写。有的服务商就要求 MAIL FROM 必须和认证的用户一致,如 163。有的干脆忽略你填写的任何 MAIL FROM 信息,最后只用认证的用户的信息,如 Gmail。另外,有的服务商强制要求所有的连接都采用 SSL 或者 TLS 加密,有的则仍然支持明文的连接。

要通过这些服务商转发邮件,需要将本地的 SMTP 服务配置为通过 smart host 转发的方式。以前我只是在 FreeBSD 下面用 sendmail 配置成功。这次在 Windows XP Professional 下面用 IIS 也实现了,如果服务器需要 SSL 连接 (ssmtp) 那么还需要 stunnel。

smtpsvc

安装 IIS 的 SMTP 服务,配置出站服务器、允许部分地址中继。参考 M$KB: 308161,“如何配置 SMTP 虚拟服务器”。

注意填好出站服务器的地址、用户名、密码。

不过 smtp 的认证是明文的,所以现在很多服务都强制使用 SSL 或者 TLS,如 Gmail。而 smtpsvc 的 starttls 好像和 Gmail 的兼容性有问题。这种情况下最好用 stunnel 了。

注: Windows 2000 Professional 的 IIS 不能指定出站 SMTP 服务器的端口。解决办法留给读者思考。

stunnel

安装 stunnel 后,修改配置文件 stunnel.conf:

socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
client = yes
[ssmtp_gmail]
accept=4654
connect=smtp.gmail.com:465

然后启动 stunnel。最后将 smtpsvc 的出站服务器配置为 [127.0.0.1],端口为 4654。这样 smtpsvc 就可以通过 SSL 通道使用 smtp 协议了。

如果要防止中间人攻击,就得验证服务器的身份,需要添加证书验证机制。在 stunnel.conf 的前面加上:

verify = 2
CAfile = certs.pem

同时在 certs.pem 文本文件中添加相应的 CA 证书。如何得到证书呢?

首先,用 openssl 访问远端 smtp 服务器:

openssl s_client -crlf -connect smtp.gmail.com:465

从 Server certificate 一栏中找到 issuer,找到其中 CN (Common Name) 的值,如 Thawte Premium Server CA。这里就找到了 GMail 的证书颁发人了。

下面到 Windows 的证书管理器 (certmgr.msc) 中,从“受信任的根证书颁发机构”中,找到这个证书,导出成 Base64 格式。再把导出的文本如

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

填到 certs.pem 中, stunnel 就能认证这个颁发人认可的网站了。

测试

要手工测试 smtp 服务,参考 M$KB: 286421



2008年07月26日

给支付宝充值的时候,发现中信银行的证书链是不安全的,你还敢继续吗?

我们来看看这个证书链。

Google 一下 CFCA (搜索简体中文网页),找到了这里:

中国金融认证中心
China Financial Certification Authority
网上信息安全守护神
权威 公正 第三方

当看到这样的认证机构主页如此业余的时候,当发现那几句话是从一个 Flash 里蹦出来的时候,我只想骂街了。

再看看他们的证书下载页面,上面有如下文字:

中国金融认证中心数字证书

下载平台 在下载证书前,请您阅读下面的注意事项:

(一)为了保证证书下载过程顺利完成,建议您先下载并安装下面程序MakeCertOCX。

(二)使用Vista或者IE 7.0的用户在证书下载前,请先下载并执行脚本SetSafe.js(点击此处下载,然后选择“打开”-〉“运行”),然后下载证书。如果无法看到“设置成功”对话框,请您修改IE浏览器的安全设置,将本网站设置成“受信任站点”(设置方法)。

(三)为确保安全,参考号、授权码为一次性使用,即在您的证书成功下载后,下载证书所使用的参考号、授权码作废。如果继续使用相同的参考号、授权码下载证书,会出现错误。

(四)为确保安全,参考号和授权码的有效期为14天,即参考号和授权码在其产生之后的14天内有效,超过有效期使用也会出现错误。

(五)如果您是使用 Direct/Client 或者 高级证书 的用户,请您一定不要在此网页上下载证书。你在此网页下载证书不能在Direct/Client中使用。


被如此不专业的机构摆布,为中国网银扼腕。

  1. 玩儿 PKI 游戏,却不跟着人家一起玩儿:
    自立门户,没有上游认证机构。——人穷志不短 !
    根证书不被操作系统认可。——我是流氓我怕谁!
  2. 玩儿 PKI 游戏,却连安全的基本常识都没掌握:
    显眼的地方没有证书指纹,用户无从对照。——你们懂个屁!
  3. 强奸用户不当回事:
    下个证书还要装 OCX。——有D版啊。反正在中国都是这样的。

好了。牢骚就发到这里了。反正我是坚决抵制使用他们认证的网银了。


P.S. 这两天激愤多了点儿,可能是天热了我躁得难受。




2008年07月22日

本来不想写什么的。杀软蓝屏,常见问题,小事一桩。

但是想想去年赛门铁克出事大家闹得那么凶;这次金山蓝屏,

  1. 主流媒体均不予报道;
  2. 百度基本搜不到什么;
  3. Google搜到的只是只言片语;
  4. 金山论坛上关于蓝屏的帖子全部被删;
  5. 金山只有一篇声明

哦,还好金山有一篇声明,要不然用户们可怎么办。这篇声明我是用Google搜到的,使用的关键字是:金山 升级 蓝屏。百度搜不到,确切地说,是只搜到了转载的。

我苦思冥想,只想到了如下原因,允许自由排列组合:

  1. 中国人确实很团结,构造和谐社会;
  2. 金山确实lj,让诺顿小巫见大巫:占有率实在太低了;
  3. 金山确实ws,瞠目结舌;
  4. 另有高人ws。

2008-07-23 09:01:10 +0800 更新:Google上搜到的金山论坛上的帖子是存在的。百度搜到的金山论坛上的帖子被删除。Google搜到的内容今天针对性更集中了。百度搜索基本没变化。主流媒体依然保持缄默。

2008-07-23 14:08:54 +0800 更新:百度搜索终于有金山官方的公告了。



2008年07月12日

see:

http://movingparts.net/2007/12/10/mencoder-dvd-rip-volume-increase-your-psp-and-you/

encoding H264 (480x272 or 360x272):

nice mencoder video.avi -sub video.srt -o video.mp4 \
-oac faac -faacopts br=128:mpeg=4:object=2:raw \
-ovc x264 -x264encopts threads=2:bitrate=500:global_header:level_idc=30 \
-of lavf -lavfopts format=psp \
-af volume=0 \
-vf-clr -vf scale=480:-2::::::1,scale=-2:272::::::1,expand=480:272

mencoder.conf:

font=~/.mplayer/subfont.ttf
subfont-text-scale=3
subfont-osd-scale=4
subfont-blur=0
subfont-outline=2
subcp=GBK
unicode=yes
slang=zh,ch,tw
sub-fuzziness=1
#sub-ignore-errors=3
subpos=98
subalign=2
spualign=2



2008年07月09日

最近更新于: 2008-07-19 23:37:55 +0800

PDF引擎对比

首先, 来对比一下几种PDF生成方式. 以此参考做出选择.

LaTeX文档生成PDF的引擎
  XeTeX DVIPDFMx1 pdfTeX
支持的字体类型 OpenType (部分)
TrueType
Type 12
OpenType (部分)
TrueType
Type 1
OpenType (未知)
TrueType (不支持ttc3)
Type 1
使用前需要配置的字体类型 仅 Type 1 全部 全部
对传统TeX的支持 可能不成熟4    
中文特殊排版 可能不完善5    
需要CJK宏包支持中文6 不必需
PDF文本搜索和复制(GBK7) N/A 支持 不支持
PDF中文书签(GBK7) N/A 需要编码转换8 不支持
PDF文本搜索和复制(UTF89) 支持 支持 支持
PDF中文书签(UTF89) 支持 支持 支持
配置过程 简单 较复杂
极复杂
使用过程 简单 麻烦6 麻烦6
生成文件大小

1 严格地说, 应该是LaTeX+DVIPDFMx.
2 实际上是通过xdvipdfmx实现的.
3 可以使用breakttc工具把ttc变成ttf.
4 如endash, emdash等, 还有可能的宏包兼容性问题.
5 xeCJK宏包能实现如下中文排版处理: 空格, 标点, 字体.
6 CJK有一个很大的不便之处就是: 要在波浪线 ~ 和空格之间做痛苦的选择.
7 即使用 {CJK}{GBK}{font} 环境.
8 需要一条控制语句和CMaps, 参考
    [1] Ubuntu下用dvipdfmx生成可以复制的中文和中文bookmarks
    [2] Adobe Font and Type Technology Center
9 对于XeTeX, hyperref 宏包打开 xetex 选项; 对于另外两种方式, 使用CJKutf8宏包, 并使用 {CJK}{UTF8}{font} 环境, hyperref 要打开 unicode 选项.

经过这样的对比不难看出, 选择UTF-8比选择GBK得到的好处要多了, 这当然要归功于CJK发展出的CJKutf8宏包. 对UTF-8的支持终于健壮得可以一统江湖了. \^o^/

字体配置cheatsheet

下面是一些字体配置的cheatsheet, 用于向MiKTeX 2.7中添加字体支持.

其实添加字体最简单的方式是安装CTeX的字体包, 但是恐怕只能用GBK编码, 因为人家做tfm的时候就是这么做的. 所以, 如果要使用UTF-8, 或者对字体的授权问题有些敏感的话, 可以考虑自己安装字体.

简单地说, DVIPDFMx方式需要生成tfm文件并更新cid-x.map, pdfTeX方式需要生成tfm, enc文件并更新map文件. 我下面的例子假设的是英文的Windows系统, 没有楷体, 所以使用了文鼎的楷体(用MiKTeX安装arphic包). 中文Windows系统包含了simkai, 就可以拿来使用了.

DVIPDFMx, UTF-8中文字体

mkdir "%TEXMFLOCAL%\fonts\truetype\m$
pushd %TEXMFLOCAL%\fonts\truetype\m$
mklink simsun.ttc %windir%\Fonts\simsun.ttc
mklink simhei.ttf %windir%\Fonts\simhei.ttf
popd

pushd %TEMP%
ttf2tfm %windir%\Fonts\simsun.ttc -q simsun@Unicode@
ttf2tfm %windir%\Fonts\simhei.ttf -q simhei@Unicode@
mkdir "%TEXMFLOCAL%\fonts\tfm\m$\simsun"
move /y simsun*.tfm "%TEXMFLOCAL%\fonts\tfm\m$\simsun" > nul
mkdir "%TEXMFLOCAL%\fonts\tfm\m$\simhei"
move /y simhei*.tfm "%TEXMFLOCAL%\fonts\tfm\m$\simhei" > nul
popd

mkdir "%TEXMFLOCAL%\dvipdfm\config"
echo simsun@Unicode@ Identity-H :0:simsun.ttc>> "%TEXMFLOCAL%\dvipdfm\config\cid-x.map"
echo simhei@Unicode@ Identity-H :0:simhei.ttf>> "%TEXMFLOCAL%\dvipdfm\config\cid-x.map"

mkdir "%TEXMFLOCAL%\tex\latex\cjk\UTF8"
notepad "%TEXMFLOCAL%\tex\latex\cjk\UTF8\c70mswin+arphic.fd"

texhash

其中 c70mswin+arphic.fd 内容如下:

\ProvidesFile{c70mswin+arphic}[]

\DeclareFontFamily{C70}{mswin+arphic}{\hyphenchar \font\m@ne}

\DeclareFontShape{C70}{mswin+arphic}{m}{n}{<-> CJK * simsun}{}
\DeclareFontShape{C70}{mswin+arphic}{bx}{n}{<-> CJK * simhei}{}
\DeclareFontShape{C70}{mswin+arphic}{m}{sl}{<-> CJK * gkaiu}{}
\DeclareFontShape{C70}{mswin+arphic}{m}{it}{<-> CJK * gkaiu}{}
\DeclareFontShape{C70}{mswin+arphic}{bx}{sl}{<-> CJKb * gkaiu}{\CJKbold}
\DeclareFontShape{C70}{mswin+arphic}{bx}{it}{<-> CJKb * gkaiu}{\CJKbold}

\endinput

DVIPDFMx, GBK中文字体

mkdir "%TEXMFLOCAL%\fonts\truetype\m$
pushd %TEXMFLOCAL%\fonts\truetype\m$
mklink simsun.ttc %windir%\Fonts\simsun.ttc
mklink simhei.ttf %windir%\Fonts\simhei.ttf
popd

pushd %TEMP%
ttf2tfm %windir%\Fonts\simsun.ttc -q -w simsun-gbk@UGBK@
ttf2tfm %windir%\Fonts\simhei.ttf -q -w simhei-gbk@UGBK@
mkdir "%TEXMFLOCAL%\fonts\tfm\m$\simsun"
mkdir "%TEXMFLOCAL%\fonts\enc\m$\simsun"
move /y simsun-gbk*.tfm "%TEXMFLOCAL%\fonts\tfm\m$\simsun" > nul
mkdir "%TEXMFLOCAL%\fonts\tfm\m$\simhei"
mkdir "%TEXMFLOCAL%\fonts\enc\m$\simhei"
move /y simhei-gbk*.tfm "%TEXMFLOCAL%\fonts\tfm\m$\simhei" > nul
popd

mkdir "%TEXMFLOCAL%\dvipdfm\config"
echo simsun-gbk@UGBK@ UniGB-UCS2-H :0:simsun.ttc>> "%TEXMFLOCAL%\dvipdfm\config\cid-x.map"
echo simhei-gbk@UGBK@ UniGB-UCS2-H :0:simhei.ttf>> "%TEXMFLOCAL%\dvipdfm\config\cid-x.map"

mkdir "%TEXMFLOCAL%\tex\latex\cjk\GB"
notepad "%TEXMFLOCAL%\tex\latex\cjk\GB\c19mswin+arphic.fd"

texhash

其中 c19mswin+arphic.fd 内容如下:

\ProvidesFile{c19mswin+arphic}[]

\DeclareFontFamily{C19}{mswin+arphic}{\hyphenchar \font\m@ne}

\DeclareFontShape{C19}{mswin+arphic}{m}{n}{<-> CJK * simsun}{}
\DeclareFontShape{C19}{mswin+arphic}{bx}{n}{<-> CJK * simhei}{}
\DeclareFontShape{C19}{mswin+arphic}{m}{sl}{<-> CJK * gkaiu}{}
\DeclareFontShape{C19}{mswin+arphic}{m}{it}{<-> CJK * gkaiu}{}
\DeclareFontShape{C19}{mswin+arphic}{bx}{sl}{<-> CJKb * gkaiu}{\CJKbold}
\DeclareFontShape{C19}{mswin+arphic}{bx}{it}{<-> CJKb * gkaiu}{\CJKbold}

\endinput

pdfTeX, UTF-8中文字体

pushd %TEMP%
ttf2tfm %windir%\Fonts\simsun.ttc -q -w simsun@Unicode@
mkdir "%TEXMFLOCAL%\fonts\tfm\m$\simsun"
mkdir "%TEXMFLOCAL%\fonts\enc\m$\simsun"
move /y simsun*.tfm "%TEXMFLOCAL%\fonts\tfm\m$\simsun" > nul
move /y simsun*.enc "%TEXMFLOCAL%\fonts\enc\m$\simsun" > nul
popd

mkdir "%TEXMFLOCAL%\fonts\map\dvips\m$\simsun"
copy /y nul "%TEXMFLOCAL%\fonts\map\dvips\m$\simsun\simsun.map"
for %i in (%TEXMFLOCAL%\fonts\tfm\m$\simsun\simsun*.tfm) do @echo %~ni SimSun ^< %~ni.enc ^< simsun.ttc>> "%TEXMFLOCAL%\fonts\map\dvips\m$\simsun\simsun.map"
initexmf --edit-config-file updmap

texhash
updmap

其中 initexmf --edit-config-file updmap 打开的文件应添加如下行:

Map simsun.map

XeTeX, T1英文字体

XeTeX虽然支持系统中所有已安装的字体, 但是TeX发行中的一些Type 1字体还是非常好看的. 要使用它们, 必须让它们支持XeTeX定义的EU1编码. 其实很简单, 参考euenc.pdf文档, 里面讲了如何把T1的fd变成EU1. 关于LaTeX的字体编码(即T1, OT1, EU1等等)还有fd文件等概念, 参考TeX Font Guide. 注意, LaTeX中的T1编码和PostScript Type 1字体是两个概念.

mkdir "%TEXMFLOCAL%\tex\xelatex\euenc\psnfss"
pushd "%TEXMFLOCAL%\tex\xelatex\euenc\psnfss"
copy "%TEXMFMAIN%\tex\latex\psnfss\t1*.fd"
cmd /v:on
for %i in (t1*.fd) do @(
set FN=%i
sed -e s/t1/eu1/ -e s/T1/EU1/ "!FN!" > "!FN:t1=eu1!"
del "!FN!" )
exit
popd

texhash




2008年06月24日

这已经不是新闻啦. 我不过是站在一堆巨人的肩膀上玩了一下. 但是太刺激了! :-)

调试机器, 装系统, 免不了遇到别人光驱坏了的情况. 早就想搞USB启动了, 甚至还买了一块USB移动硬盘来试, 但是一直不完美. USB启动, 除了光驱, 没有标准可循, 每种主板都不一定兼容. 最典型的就是DELL的BIOS, 在AMI和AWARD上做好的U盘到DELL上基本都起不来.

前一阵搜索USB启动的时候, 听说了一种叫做"量产"的方法, 可以让U盘划出一块空间来模拟CD-ROM. 这不就全解决了! 昨天一起吃饭, 听哈哈同学说了他自己的成功案例, 我是信心十足呀.

可惜回来拿我的爱国者U盘试验失败. 配置的是安国(Alcor)芯片. 后来发现网上根本就没有成功案例, 大家都是刷进去一个镜像, 有至少一半的数据是坏的.

所以今天回来就要拿我老爸的Kingston DataTraveler 2.0来造啦. 配置是群联(Phison)的PS2231, 正好就是哈哈同学成功的那种. 呵呵, 找到量产工具, 试验了几次就成功啦!

^_^

下面贴上我的参数文件:

UP12_PS2231_Kingston_DataTraveler_2.0.ini

[PenDriveMP]
IC Type=PS2231
Used MPTool=Last Version
[Parameter Mark]
Parameter Type=F1_MP_21
[Customize Info]
USB VID=0x0930
USB PID=0x6545
String Product Name=DataTraveler 2.0
String Manufacturer Name=Kingston
Inquiry Version=PMAP
[Configuration]
Reset Serial Number=0
Preformat Target Capacity=1900
[TestItemOption]
Do Preformat Test=1
[Extra]
Mode=21
[Misc]
Privacy Volume Label=UFD
CDROM Image=C:\MegaBoot.2006.jackqq.iso
[Advance]
Tick=1
FC1=0xff
FC2=0x1
[Firmware]
ISP=1
Burner File=C:\phison-v1.96.00\BN206.BIN
Firmware Name=C:\phison-v1.96.00\FF0110D.BIN
Verified Firmware Name=C:\phison-v1.96.00\FF0110D.BIN


2008年06月22日

我想到了一种保护PGP密钥长时间不换的方法. 就是利用GnuPG的一个扩展, 只导出secret sub keys而不导出primary secret key, 把这些secret sub keys放到不同的地方使用.

最开始是看了GnuPG的FAQ发现的, 后来发现原来还是有很多先人呀. :)

参考:

  How can I use GnuPG in an automated environment?
    http://www.gnupg.org/documentation/faqs.en.html#q4.14

  Using multiple subkeys in GPG
    http://fortytwo.ch/gpg/subkeys

  using various subkeys [HOWTO]
    http://lists.gnupg.org/pipermail/gnupg-users/2002-August/014780.html

  PGP: Public Key Servers
    http://www.rossde.com/PGP/pgp_keyserv.html

这种方法的特点:

  • 可以满足日常的加密, 解密, 签名的需要.
  • 可以在不同地方设置不同的密码, 从而提供不同的保密级别.
  • 只导出secret sub keys可以保护primary key的安全.
  • 只有primary key才能签署其他人的密钥, 这样做使得primary key用起来麻烦一些, 强迫我们三思而后行.

但是,

  • 比较老的PGP keyserver都不支持多个sub keys, 上传的key会被截断. 可以用别的keyserver, 或者直接用文本传.

运行PGP Key Server 0.9.6的服务器, 如MIT的, 就不接受多个sub keys. 而运行SKS 1.0.10的服务器, 如Ubuntu的, 就支持多个sub keys.

还有一个就是密钥生成过程中的存储问题. 因为密钥的生成过程是要保存在外存上的, 即使随后删除也有可能会被离线恢复. 我想了下面几种办法.

一个就是在生成密钥并导出之后, 用Sysinternals的sdelete工具对中间文件进行安全删除. 但是如果假设文件系统一般会为改写的文件重新分配空间, 所以感觉这不是一种很安全的办法.

还有一个就是用NTFS提供的EFS机制, 不过如果对Windows系统保护不够强, 还是形同虚设. 具体做法是, 先将AppData里的gnupg目录设置为加密, 然后再进行创建密钥等操作, 保存到硬盘上的数据起码就不是明文了. 不过通过一些工具盘应该还是能通过SAM找到EFS密钥的.

虽然有顾虑, 其实上面两种办法已经给破解加大了不少难度.

最后, 如果能在一张UDF的CD-R上操作, 然后直接妥善保存这张CD-R, 我想这应该是最安全的了.

Windows Vista本身就支持UDF的写入. Windows XP需要第三方的UDF写入支持, 如

  • Sonic Drive Letter Access
  • Roxio Drag-to-Disc (Adaptec DirectCD)
  • Nero InCD

美中不足的是这些UDF写入方式看起来也不甚兼容.

假设已经以UDF格式化好的CD-R在F:, 那么设置GNUPGHOME环境变量就可以让GnuPG
在光盘上工作了.

C> F:
F> set GNUPGHOME=F:\GnuPG

============================================================

首先创建primary key. 原则上, 作为自己身份的证明, 应该是永远不过期的. passphrase则应足够保险, 自己好记的, 别人不容易猜出的, 允许空格, 最好有数字符号, 不少于20个字符.

F> gpg --gen-key

Please select what kind of key you want:
   (1) DSA and Elgamal (default)
   (2) DSA (sign only)
   (5) RSA (sign only)
Your selection? 1
What keysize do you want? (2048)
Requested keysize is 2048 bits
Key is valid for? (0)
Key does not expire at all

Real name: Quan Qiu
Email address: jackqq@gmail.com
Comment: Testing GnuPG
You selected this USER-ID:
    "Quan Qiu (Testing GnuPG) <jackqq@gmail.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
You need a Passphrase to protect your secret key.
Enter passphrase:
Repeat passphrase:
...............+++++

gpg: key 9061D35B marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   1024D/9061D35B 2008-06-21
      Key fingerprint = 04EE 15CC 1DE5 1115 8F8A  F0F0 6301 CEEF 9061 D35B
uid                  Quan Qiu (Testing GnuPG) <jackqq@gmail.com>
sub   2048g/11DD7B4D 2008-06-21

============================================================

别忘了生成一个密钥撤销证书. 这个一定要妥善保管, 不能泄露.

F> gpg --output revokecert.txt --gen-revoke jackqq

sec  1024D/9061D35B 2008-06-21 Quan Qiu (Testing GnuPG) <jackqq@gmail.com>

Create a revocation certificate for this key? (y/N) y
Please select the reason for the revocation:
  0 = No reason specified
  1 = Key has been compromised
  2 = Key is superseded
  3 = Key is no longer used
  Q = Cancel
(Probably you want to select 1 here)
Your decision? 1
Enter an optional description; end it with an empty line:
>
Reason for revocation: Key has been compromised
(No description given)
Is this okay? (y/N) y

You need a passphrase to unlock the secret key for
user: "Quan Qiu (Testing GnuPG) <jackqq@gmail.com>"
1024-bit DSA key, ID 9061D35B, created 2008-06-21

ASCII armored output forced.
Revocation certificate created.

Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable.  But have some caution:  The print system of
your machine might store the data and make it available to others!

============================================================

下面为各种用途创建sub keys. 比如, 在家里, 工作场所和便携电脑上的, 用于签名和加密的不同密钥. 这些sub keys可以适当设置有效期限.

F> gpg --edit jackqq

Secret key is available.

pub  1024D/9061D35B  created: 2008-06-21  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
sub  2048g/11DD7B4D  created: 2008-06-21  expires: never       usage: E
[ultimate] (1). Quan Qiu (Testing GnuPG) <jackqq@gmail.com>

Command> addkey
Please select what kind of key you want:
   (2) DSA (sign only)
   (4) Elgamal (encrypt only)
   (5) RSA (sign only)
   (6) RSA (encrypt only)
Your selection? 2
DSA keypair will have 1024 bits.
Key is valid for? (0) 3m
...............................+++++

pub  1024D/9061D35B  created: 2008-06-21  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
sub  2048g/11DD7B4D  created: 2008-06-21  expires: never       usage: E
sub  1024D/5B0E7472  created: 2008-06-21  expires: 2008-09-19  usage: S
[ultimate] (1). Quan Qiu (Testing GnuPG) <jackqq@gmail.com>

Command> addkey
Please select what kind of key you want:
   (2) DSA (sign only)
   (4) Elgamal (encrypt only)
   (5) RSA (sign only)
   (6) RSA (encrypt only)
Your selection? 4
What keysize do you want? (2048)
Key is valid for? (0) 3m
...........................+++++^^^

pub  1024D/9061D35B  created: 2008-06-21  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
sub  2048g/11DD7B4D  created: 2008-06-21  expires: never       usage: E
sub  1024D/5B0E7472  created: 2008-06-21  expires: 2008-09-19  usage: S
sub  2048g/CB36A1C8  created: 2008-06-21  expires: 2008-09-19  usage: E
[ultimate] (1). Quan Qiu (Testing GnuPG) <jackqq@gmail.com>

Command>quit
Save changes? (y/N) y

============================================================

然后就可以为各种用途导出钥匙链了. 用--export-secret-subkeys选项导出的私钥钥匙链里的primary key是无效的, 从而保证了它的安全. 在修改不同用途的钥匙链时, 可以用passwd命令设置不同的passphrase, 然后去掉多余的 sub keys.

F> mkdir home office laptop
F> cd office
F> gpg --export-secret-subkeys --no-comments > secring.gpg
F> copy %GNUPGHOME%\pubring.gpg .
F> gpg --homedir . --edit jackqq

Secret key is available.

gpg: ./trustdb.gpg: trustdb created
pub  1024D/9061D35B  created: 2008-06-21  expires: never       usage: SC
                     trust: unknown       validity: unknown
sub  2048g/11DD7B4D  created: 2008-06-21  expires: never       usage: E
sub  1024D/5B0E7472  created: 2008-06-21  expires: 2008-09-19  usage: S
sub  2048g/CB36A1C8  created: 2008-06-21  expires: 2008-09-19  usage: E
sub  1024D/6C06E245  created: 2008-06-21  expires: 2008-12-18  usage: S
sub  2048g/5CBC7406  created: 2008-06-21  expires: 2008-12-18  usage: E
sub  1024D/903CF7E7  created: 2008-06-21  expires: 2009-06-21  usage: S
sub  2048g/084E750C  created: 2008-06-21  expires: 2009-06-21  usage: E
[unknown] (1). Quan Qiu (Testing GnuPG) <jackqq@gmail.com>

Command> addkey
Secret parts of primary key are not available.
gpg: Key generation failed: secret key not available

Command> passwd
Secret parts of primary key are not available.

You need a passphrase to unlock the secret key for
user: "Quan Qiu (Testing GnuPG) <jackqq@gmail.com>"
2048-bit ELG-E key, ID 11DD7B4D, created 2008-06-21

Enter passphrase:
Enter the new passphrase for this secret key.
Enter passphrase:
Repeat passphrase:

Command> key 1
Command> key 5
Command> key 6
Command> key 7
Command> key 8

pub  1024D/9061D35B  created: 2008-06-21  expires: never       usage: SC
                     trust: unknown       validity: unknown
sub* 2048g/11DD7B4D  created: 2008-06-21  expires: never       usage: E
sub  1024D/5B0E7472  created: 2008-06-21  expires: 2008-09-19  usage: S
sub  2048g/CB36A1C8  created: 2008-06-21  expires: 2008-09-19  usage: E
sub* 1024D/6C06E245  created: 2008-06-21  expires: 2008-12-18  usage: S
sub* 2048g/5CBC7406  created: 2008-06-21  expires: 2008-12-18  usage: E
sub* 1024D/903CF7E7  created: 2008-06-21  expires: 2009-06-21  usage: S
sub* 2048g/084E750C  created: 2008-06-21  expires: 2009-06-21  usage: E
[unknown] (1). Quan Qiu (Testing GnuPG) <jackqq@gmail.com>

Command> delkey
Do you really want to delete the selected keys? (y/N) y

pub  1024D/9061D35B  created: 2008-06-21  expires: never       usage: SC
                     trust: unknown       validity: unknown
sub  1024D/5B0E7472  created: 2008-06-21  expires: 2008-09-19  usage: S
sub  2048g/CB36A1C8  created: 2008-06-21  expires: 2008-09-19  usage: E
[unknown] (1). Quan Qiu (Testing GnuPG) <jackqq@gmail.com>

Command> quit
Save changes? (y/N) y

============================================================

别忘了发布公钥.

F> gpg --keyserver keyserver.ubuntu.com --send-keys 9061D35B

============================================================

把这个私钥钥匙链, 也就是secring.gpg, 复制到相应的地方导入即可.

C> set GNUPGHOME=
C> gpg --import F:\office\secring.gpg

更新一下公钥, 因为私钥中没有保存revuid的信息.

C> gpg --keyserver keyserver.ubuntu.com --refresh-keys

如果还没信任过这个key, 现在可以设置信任.

C> gpg --edit-key jackqq

Command> trust
pub  1024D/9061D35B  created: 2008-06-21  expires: never       usage: SC
                     trust: unknown       validity: unknown
sub  1024D/5B0E7472  created: 2008-06-21  expires: 2008-09-19  usage: S
sub  2048g/CB36A1C8  created: 2008-06-21  expires: 2008-09-19  usage: E
[ unknown] (1). Quan Qiu (Testing GnuPG) <jackqq@gmail.com>

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y

pub  1024D/9061D35B  created: 2008-06-21  expires: never       usage: SC
                     trust: ultimate      validity: unknown
sub  1024D/5B0E7472  created: 2008-06-21  expires: 2008-09-19  usage: S
sub  2048g/CB36A1C8  created: 2008-06-21  expires: 2008-09-19  usage: E
[ unknown] (1). Quan Qiu (Testing GnuPG) <jackqq@gmail.com>
Please note that the shown key validity is not necessarily correct
unless you restart the program.

Command> quit





    摘要:My PGP key: KeyID: 88A1880E Fingerprint: 7295 6509 7643 544B AB36 3C04 A2BD 6E5D 88A1 880E     (全文共6230字)——点击此处阅读全文


2008年05月24日

Windows Platform SDK 中的 winnt.h 中有一个宏 RTL_NUMBER_OF,这个宏可以得到数组中元素的个数。

它有两种实现,看其中一种:

extern "C++"
template <typename T, size_t N>
char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];

#define RTL_NUMBER_OF_V2(A) (sizeof(*RtlpNumberOf(A)))

按照 winnt.h 中的注释所述, RtlpNumberOf 只是个声明,无需定义,借助模板的声明就达到了取个数的目的,而且还只接受数组不接受指针。通过 C++ 的 template 实现,发挥了 C++ 的类型检查的功能。

关于 template 能自动推断被引用的数组的大小这个特性,见 Thinking in C++ Vol 2 第5章 Templates in Depth 中的 Type deduction of function template arguments 小节。

今天终于搞明白了。 :-)



2008年05月13日

首选当然是bookr。官方已经很久没维护了,还只支持1.5核心,下载应用程序框架和字库之后,还应该从这里下载支持3.XX的主程序(在我的3.71 M33-4上测试通过)。

但是,bookr 对大图片很不感冒,速度奇慢。看扫描的pdf基本必宕机。所以不如干脆转成图片格式一张张看吧。参考这里,方法如下, (win32 cmd, 依赖 Ghostscript 和 ImageMagick)

gswin32 -dSAFER -dBATCH -dNOPAUSE -r300 -sDEVICE=png16m ^
-dGraphicsAlphaBits=4 -dTextAlphaBits=4 ^
-sOutputFile="book.%04d.png" -f "book.pdf"

for %i in (*.png) do @(
echo %i
convert %i -negate -resize 800 -quality 80 %~ni.jpg
)

rem EOF



2008年05月05日

把你的计算机时钟调到“2038年1月20日”,看看会有多少程序挂掉?

这两天遇到的就是这样的一个问题。一台机器中恶意程序了,一开机就不停地有程序挂掉,当然都是那些恶意的程序。手工清理掉它们之后,用户报告说还有问题,比如Photoshop不能启动、诺顿杀毒 (Symantec AntiVirus) 不能启动等,另外他们注意到一个现象,就是系统时间被改成了2058年。

转天我去,经过一阵奋战,实在没发现那两个程序的出错之处,也没再发现其它的恶意程序。安全模式也不行。正当我准备放弃时,用户又提醒了我系统日期的问题。我在安全模式下把日期改过来,重新启动。嘿嘿,问题解决了。

此时,我才想起来一件事:2037年问题。给人家解释了一通,总之就是和千年虫类似的问题啦,听起来蛮恐怖的哈。回来自己又测试了一下,企业版诺顿确实会在2038年之后挂掉。

最后更正一下,回来再查时才发现,原来是“2038年问题”。