2006年04月19日

ASCII表

ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符
0 NUT 32 (space) 64 @ 96
1 SOH 33 65 A 97 a
2 STX 34 66 B 98 b
3 ETX 35 # 67 C 99 c
4 EOT 36 $ 68 D 100 d
5 ENQ 37 % 69 E 101 e
6 ACK 38 & 70 F 102 f
7 BEL 39 , 71 G 103 g
8 BS 40 ( 72 H 104 h
9 HT 41 ) 73 I 105 i
10 LF 42 * 74 J 106 j
11 VT 43 + 75 K 107 k
12 FF 44 , 76 L 108 l
13 CR 45 - 77 M 109 m
14 SO 46 . 78 N 110 n
15 SI 47 / 79 O 111 o
16 DLE 48 0 80 P 112 p
17 DCI 49 1 81 Q 113 q
18 DC2 50 2 82 R 114 r
19 DC3 51 3 83 X 115 s
20 DC4 52 4 84 T 116 t
21 NAK 53 5 85 U 117 u
22 SYN 54 6 86 V 118 v
23 TB 55 7 87 W 119 w
24 CAN 56 8 88 X 120 x
25 EM 57 9 89 Y 121 y
26 SUB 58 : 90 Z 122 z
27 ESC 59 ; 91 [ 123 {
28 FS 60 < 92 \ 124 |
29 GS 61 = 93 ] 125 }
30 RS 62 > 94 ^ 126 ~
31 US 63 ? 95 127 DEL
 
NUL VT 垂直制表 SYN 空转同步
SOH  标题开始 FF   走纸控制 ETB  信息组传送结束
STX  正文开始 CR   回车 CAN  作废
ETX  正文结束 SO   移位输出 EM   纸尽
EOY  传输结束 SI    移位输入 SUB  换置
ENQ  询问字符 DLE  空格 ESC  换码
ACK  承认 DC1  设备控制1 FS   文字分隔符
BEL  报警 DC2  设备控制2 GS   组分隔符
BS   退一格 DC3  设备控制3 RS   记录分隔符
HT   横向列表 DC4  设备控制4 US   单元分隔符
LF   换行 NAK  否定 DEL  删除
 
键盘常用ASCII码
ESC键 VK_ESCAPE (27)
回车键: VK_RETURN (13)
TAB键: VK_TAB (9)
Caps Lock键: VK_CAPITAL (20)
Shift键: VK_SHIFT ($10)
Ctrl键: VK_CONTROL (17)
Alt键: VK_MENU (18)
空格键: VK_SPACE ($20/32)
退格键: VK_BACK (8)
左徽标键: VK_LWIN (91)
右徽标键: VK_LWIN (92)
鼠标右键快捷键:VK_APPS (93)

Insert键: VK_INSERT (45)
Home键: VK_HOME (36)
Page Up: VK_PRIOR (33)
PageDown: VK_NEXT (34)
End键: VK_END (35)
Delete键: VK_DELETE (46)

方向键(←): VK_LEFT (37)
方向键(↑): VK_UP (38)
方向键(→): VK_RIGHT (39)
方向键(↓): VK_DOWN (40)

F1键: VK_F1 (112)
F2键: VK_F2 (113)
F3键: VK_F3 (114)
F4键: VK_F4 (115)
F5键: VK_F5 (116)
F6键: VK_F6 (117)
F7键: VK_F7 (118)
F8键: VK_F8 (119)
F9键: VK_F9 (120)
F10键: VK_F10 (121)
F11键: VK_F11 (122)
F12键: VK_F12 (123)

Num Lock键: VK_NUMLOCK (144)
小键盘0: VK_NUMPAD0 (96)
小键盘1: VK_NUMPAD0 (97)
小键盘2: VK_NUMPAD0 (98)
小键盘3: VK_NUMPAD0 (99)
小键盘4: VK_NUMPAD0 (100)
小键盘5: VK_NUMPAD0 (101)
小键盘6: VK_NUMPAD0 (102)
小键盘7: VK_NUMPAD0 (103)
小键盘8: VK_NUMPAD0 (104)
小键盘9: VK_NUMPAD0 (105)
小键盘.: VK_DECIMAL (110)
小键盘*: VK_MULTIPLY (106)
小键盘+: VK_MULTIPLY (107)
小键盘-: VK_SUBTRACT (109)
小键盘/: VK_DIVIDE (111)

Pause Break键: VK_PAUSE (19)
Scroll Lock键: VK_SCROLL (145)

晚上在看Salman A. Baset和Henning Schulzrinne写的《An Analysis of the Skype Peer-to-Peer Internet Telephony Protocol》。因为Skype的通讯协议是不公开的,而且通讯内容是加过密的,这两位完全在实验的基础上对Skype的通讯机制进行分析,分析结果很有参考价值。

通过分析得出的结论主要有三个:
1、Skype的通话质量较MSN和Yahoo的即时通信工具要好;
2、可以无缝的在NATs和防火墙后使用;
3、安装使用起来确实非常简单。

skype_network.gif

Skype与以往MSN等IM工具最大的不同在于基除了用户登录,其余工作基本不依赖中央服务器,Skype在穿透防火墙通讯时完全使用了Peer to Peer,而没用到中央服务器。上图中的小黑点是客户端,大黑点是超级节点(用于为其它客户端提供登录踏板及广播服务),灰色的点是Skype的登录服务器。
用户下载安装完Skype后,Skype客户端会发送一段HTTP 1.1的请求到中央服务器,告诉它我装完了一个什么样的版本:

GET /ui/0/97/en/installed HTTP/1.1
User-Agent: Skype™ Beta 0.97
Host: ui.skype.com
Cache-Control: no-cache

服务器会返回一个200 OK的信息:

HTTP/1.1 200 OK
Date: Tue, 20 Apr 2004 04:51:39 GMT
Server: Apache/2.0.47 (Debian GNU/Linux) PHP/4.3.5
mod_ssl/2.0.47 OpenSSL/0.9.7b
X-Powered-By: PHP/4.3.5
Cache-control: no-cache, must revalidate
Pragma: no-cache
Expires: 0
Content-Length: 0
Content-Type: text/html; charset=utf-8
Content-Language: en

客户端会进行登录初始化工作,这一步工作包含很多内容,针对三种不同类型的网络情况有三种不同的登录方式:
1、直接有公众网的IP
2、在内部网,可以通过TCP访问外部网络
3、在内部网,但只能通过有限的几个端口(例如80和443)访问外部网络

Skype在登录的时候会先使用UDP请求HC中的IP,如果不行,就用TCP请求HC中的IP及端口,如果还不行,就用TCP请求HC中的IP及80端口,如果又不行,就再请求HC中的IP及443端口。如果这时候还不行,那就登录不了了。整个过程中传输的数据量大概在8k-10k,持续的时间在3至35秒。

1、端口
在Skype的连接属性对话框中可以设置监听的端口号,在安装的时候Skype会随机的选择一个端口作为监听的端口,这一点与HTTP协议等不同,Skype没有默认的服务端口。同时,它还会打开对80和443端口的监听。80是常见的HTTP服务默认端口,而443则是HTTPS服务的默认端口。
2、主机列表(HC,Host Cache)
这里的主机指的是可以提供踏板及广播服务的Super Node(SN)。通常它被存储在注册表里的:HKEY_CURRENT_USER / SOFTWARE / SKYPE / PHONE / LIB / CONNECTION / HOSTCACHE 中.一般情况下,运行两天后,HC中会有约200个机器地址及对应的端口号。

3、编解码器
要能语音通信,编解码器当然少不了。Global IP Sound在他的网站上专用明它为Skype提供点对点语音通讯软件:Global IP Sound provides voice processing software to Skype’s peer-to-peer voice-communications software.Skype应该是使用了他们的编解码器实现的语音通讯。

4、好友列表
当你换了一台计算机的时候可能会发现Skype上的好友列表没了,不要奇怪,Skype的好友列表没有保存在服务器上,而是保存在本地的注册表中,当然,是加过密的。

5、加密
Skype使用AES加密标准。

6、NAT与防火墙
Skype应该是使用了STUN和TURN协议来检测所处的NAT及防火墙环境。Skype定期的刷新这些信息,这些信息也是存储在注册表中的。与另外一个点对点文件共享系统Kazza不同,普通客户端无法阻止自己成为Super Node(SN),就是说它随时可能被征用成为别人登录服务和广播服务的提供者,就是类似于BT中的种子提供者的角色。

Skype的功能主要可以分为:初始化,登录,用户搜索,呼叫建立与终止,媒体传输和状态消息。

1、初始化
第一次安装后,Skype会发送一段HTTP 1.1的请求给中央服务器,包括关键字"installed"以及所装Skype的版本号。以后的每次登录Skype都会向中央服务器发送一小段包含关键字"getlatestversion"的HTTP 1.1请求,检查是否有新版本的Skype。

2、登录
登录可能是Skype最重要的功能。在这个过程中,Skype终端到登录服务器上验证用户名密码,广播他在上线给好友及其它的点,检查NAT和防火墙的类型,发现拥有公网IP地址的在线Skype节点,这些新发现的节被用于在所在Super Node无法使用后继续保持本机与Skype网络的连接。

登录的过程我们前面已经讲过,先用UDP连,然后是TCP,然后TCP到80,然后TCP到443,行的话就连上了,不行的话就显示无法登录。连接的对象是保存在本机中Host Cache中的。

登录服务器的IP是80.160.91.11,nslookup记录显示它的域名是:ns14.inet.tele.dk和ns15.inet.tele.dk,dk是丹麦的国家定级域名。

安装完第一次登录时,HC被初始化,里面包含7对IP与端口,而且基本总是这7个IP和端口,即使包含超过7对,这7对也在其中。当用户安装后第一次登录时,Skype通过其中的一对IP和端口建立TCP连接。

这7个IP-端口对,以及这些IP对应的主机名是:
IP address:port Reverse lookup result
66.235.180.9:33033 sls-cb10p6.dca2.superb.net
66.235.181.9:33033 ip9.181.susc.suscom.net
80.161.91.25:33033 0×50a15b19.boanxx15.adsl-dhcp.tele.dk
80.160.91.12:33033 0×50a15b0c.albnxx9.adsl-dhcp.tele.dk
64.246.49.60:33033 rs-64-246-49-60.ev1.net
64.246.49.61:33033 rs-64-246-49-61.ev1.net
64.246.48.23:33033 ns2.ev1.net
可以看到上述的主机分别属于4个ISP,其中Superb , Suscom, ev1.net是美国的ISP。

参考资料:
《An Analysis of the Skype Peer-to-Peer Internet Telephony Protocol》

DAN KEGEL 原著 sunkinglang译
Peer-to-peer是一种网络形式,基于它,网络中的计算机可以直接沟通,而不需要一台中央服务器。这种技术通常被应用在多玩家在线游戏,例如Activision的战网,以避免处理服务器数据流所引起的延迟与消耗,但这种联网形式常常会碰到网络地址解析的问题(NAT)。本文中,我将描述解决这些问题的方法。使用这种技术的产品现在已经能在一些商业性NAT中正确运行了。

背景

互联网是基于32位IP地址的,这意味着互联网理论上最大电脑数目约为四万亿。由于IP地址使用方式的无效性,实际的数量会少得多。实际上,互联网过不了多久就会将IP地址用完。

因为可用的IP地址越来越少,一种被称为网络地址解析或箭称NAT的技术被开发出来,它允许以一个IP地址来代表整个网络的电脑。

一个NAT处在公用互联网与它所服务的网络之间,重写数据中IP头部的IP地址和端口号以使所有的包看上去都象从一个NAT设备的公用IP地址发来(或到它去)的,而不是发自(往)实际的源或者目标。

NAT如今已经在小型家庭-办公室路由被普遍租用,也在很多软件中被用户使用以连接几台PC到一个唯一的电缆MODEM。它甚至被一些ISP使用。

(NAT不是唯一可能的解决办法,代理服务器也被普遍使用,但需要更多的配置,有时还需要要定制的客户端软件。而最终,我们都将转换到IPv6,它将使用128位地址,可以解决已有的及所有的问题,但那将在很久后才会普及。

某些协议是非NAT友好的


一些应用程序将IP和端口号隐藏在它们的数据包中发送,NAT不能正确重写它们,所以当你想在NAT网络内使用那些程序的话,它们将不会正确运行。

一些NAT,由于安全原因,只允许从已经发送过数据去的外部地址接收数据。这意味着处于不同NAT后的两个人不能以通常的方式建立连接。

解决办法


希望NAT友好的Peer-to-peer(点对点)协议必须明确:其所嵌入数据包的任何地址在通过NAT时都可能变得无效,因此需要补救。一个可行的方法如下:

两点之间所有的数据流都通过一个单一的UDP端口。存在着一个不处于任何NAT之后的地址服务器,用户首先与地址服务器连接,并发送他们认为拥有的IP地址;服务器标记该地址和它在UDP头部所看到的地址。然后服务器将两个地址都送往其它点。这样,所有人都知道其它人的地址。

为打开点对点的连接,所有的旧(结)点发送一个UDP包到新的(结)点,且新(结)点发送一个UDP包到每一个老(结)点。因为无人知道开始它们是否处于同一个NAT之后,第一个包往往被同时送往公有和私有地址。

这导致每个人的NAT为UDP数据流的通过打开一个双向的洞。一旦第一个响应从每个(结)点返回,发送者就知道使用哪个返回地址,并能停止向两个地址发送数据。

兼容性需求


基于和超越基本的NAT RFC,一个想支持这个技术的NAT设备必须有以下要求的属性:

>>NAT不允许改变被数据流使用的UDP端口号。
如果一个处于NAT之后的主机从一个单一的UDP口发送了一系列的包,被NAT接棒后的包也必须表现为来自同一主机和UDP口。

RFC蓝图


我正在拟订这项技术RFC蓝图更为详细的细节。如果你感兴趣,请与我联系。

兼容性测试结果


我正在测试实现几个NAT通讯的兼容性。这里是部分结果:

已知的NAT实现的兼容性


>>NAT1000:完全兼容。感谢Nevod技术人员早期所帮助做的兼容性测试。无任何东西需要改变;这项技术与他们的NAT一起运行很稳定。Nevod已经不再存在了,它已被微软兼并。
>>Win98 SE包含的网络联接共享软件,起源于NAT1000,所以一定运行良好。
>>SYGATE:完全兼容。
>>NAT32:1999年1月5号公布的BETA测试版完全兼容。现在公布的版本也应该完全兼容。
>>LINUX IP Masquerading(LINUX IP伪装):2.2.1版本内核和后续版本可以正常运行。请到http://juanjox.linuxhq.com/?寻找早期2.1版本的补丁。2.0版本的补丁见Glenn Lamb的页面:http://home.indyramp.com/lists/masq/msg03024.html
ftp://ftp.netcom.com/pub/mu/mumford/loose-udp-2.0.36.patch.gz
Glenn的端口使之拥有一个配置时选项CONFIG_IP_MASQ_LOOSE_UDP,这是一个很好的举措。
>>WinNAT:当前版本工作正常。

NAT实现即将可兼容的


>>Arescom Apex 1100 ISDN路由:Arescom在1999年1月针对此问题发布了一个固件补丁;也许现在已经并入其标准固件里了,但我还没有证实。
>>Vicomsoft Softrouter Plus:Vicom曾公布过一个版本以解决这个问题,但我还没有机会来测试一下。注意:为使这个实现正常运行,你必须把网关设备上除指向内部以太适配器外的所有本地TCP绑定禁止。在使用Vicom的安装助手之前请阅读其文档。

未知是否兼容的


>>Cisco IOS有一内置的NAT兼容特性,也许有用也许不然。
>>我们已经测试了我们手上所有能得到的WIN32软件。但还没有测试嵌入到许多小型家庭办公路由中的NAT,也没有测试外置的NAT如SonicWall等。

不兼容的


>>所有的纯代理服务器解决办法,如WINGATE2或者PPPShar,都不能正常运行。

使用这项技术的软件


以下软件包是已知的支持在NAT后操作的:
>>Civilization: Call To Power
>>Heavy Gear 2

讨论区


我想听到其它开发者对于这项技术的想法,以及Masq如何被重写以正确复用UDP端口。加入NAT-peer-games(http://onelist.com/viewarchive.cgi?listname=nat-peer-games)邮件列表让我们一起讨论。

实施问题


在测试SYGATE和近期NAT1000版本时,我遇到一些实施方面的问题。当运行网关的机器是通过MODEM与INTERNET联接的话所有一切均正常。但如果网关机器是通过以太网与INTERNET联接的话,客户端不能访问那个外部以太网上的其它主机。看上去就象那台网关送出来的包完全被外部以太网上的其它主机丢弃了。然而路由器不会丢弃数据,所以与远程主机联接没有问题。想了解更多信息,请到my Usenet post(http://www.dejanews.com/getdoc.xp?AN=427631763)获取。

我倾向于相信这是硬件原因,但谁知道呢…

链接

>>IETF Working Group on NAT:
http://www.ietf.org/html.charters/nat-charter.html
新的RFC草图和邮件列表。其中一个文档
http://www.ietf.org/internet-drafts/draft-ietf-nat-protocol-issues-01.txt
提到这项技术;搜索关键词“Activision”

>>NAT页面:
http://www.uq.edu.au/~gadmacka/the-nat-page/
列出了一些可行的NAT实现

>>LINUX IP伪装:
http://www.indyramp.com/masq/
都是关于NAT实现的LINUX之Masq。

>>MASQ邮件列表的可查询索引:
http://www.mail-archive.com/masq@tori.indyramp.com/

>>LINUX IP NAT论坛:
http://serf.csn.tu-chemnitz.de/HyperNews/get/linux-ip-nat.html
NAT论文,老式的不支持的LINUX NAT实现和一个讨论区。多半为了历史兴趣。

NAT原理简介

NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。如图:

附图

  简单地说,NAT就是在局域网内部网络中使用内部地址,而当内部节点要与外部网络进行通讯时,就在网关(可以理解为出口,打个比方就像院子的门一样)处,将 内部地址替换成公用地址,从而在外部公网(internet)上正常使用,NAT可以使多台计算机共享Internet连接,这一功能很好地解决了公共 IP地址紧缺的问题。通过这种方法,您可以只申请一个合法IP地址,就把整个局域网中的计算机接入Internet中。这时,NAT屏蔽了内部网络,所有 内部网计算机对于公共网络来说是不可见的,而内部网计算机用户通常不会意识到NAT的存在。如图2所示。这里提到的内部地址,是指在内部网络中分配给节点 的私有IP地址,这个地址只能在内部网络中使用,不能被路由(一种网络技术,可以实现不同路径转发)。虽然内部地址可以随机挑选,但是通常使用的是下面的 地址:10.0.0.0~10.255.255.255,172.16.0.0~172.16.255.255, 192.168.0.0~192.168.255.255。NAT将这些无法在互联网上使用的保留IP地址翻译成可以在互联网上使用的合法IP地址。而全 局地址,是指合法的IP地址,它是由NIC(网络信息中心)或者ISP(网络服务提供商)分配的地址,对外代表一个或多个内部局部地址,是全球统一的可寻 址的地址。

附图

  NAT 功能通常被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中。比如Cisco路由器中已经加入这一功能,网络管理员只需在路由器的IOS中设 置NAT功能,就可以实现对内部网络的屏蔽。再比如防火墙将WEB Server的内部地址192.168.1.1映射为外部地址202.96.23.11,外部访问202.96.23.11地址实际上就是访问访问 192.168.1.1。另外资金有限的小型企业来说,现在通过软件也可以实现这一功能。Windows 98 SE、Windows 2000 都包含了这一功能。

NAT技术类型

  NAT有三种类型:静态NAT(Static NAT)、动态地址NAT(Pooled NAT)、网络地址端口转换NAPT(Port-Level NAT)。

  其中静态NAT设置起来最为简单和最容易实现的一种,内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址。而动态地址NAT则是在外部网络中定 义了一系列的合法地址,采用动态分配的方法映射到内部网络。NAPT则是把内部地址映射到外部网络的一个IP地址的不同端口上。根据不同的需要,三种 NAT方案各有利弊。

  动态地址NAT只是转换IP地址,它为每一个内部的IP地址分配一个临时的外部IP地址,主要应用于拨号,对于频繁的远程联接也可以采用动态NAT。当远程用户联接上之后,动态地址NAT就会分配给他一个IP地址,用户断开时,这个IP地址就会被释放而留待以后使用。

  网络地址端口转换NAPT(Network Address Port Translation)是人们比较熟悉的一种转换方式。NAPT普遍应用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与 动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的TCP端口号。

  在Internet 中使用NAPT时,所有不同的信息流看起来好像来源于同一个IP地址。这个优点在小型办公室内非常实用,通过从ISP处申请的一个IP地址,将多个连接通 过NAPT接入Internet。实际上,许多SOHO远程访问设备支持基于PPP的动态IP地址。这样,ISP甚至不需要支持NAPT,就可以做到多个 内部IP地址共用一个外部IP地址上Internet,虽然这样会导致信道的一定拥塞,但考虑到节省的ISP上网费用和易管理的特点,用NAPT还是很值 得的。

2006年04月18日

企业的邮件系统正经历着不断地统一和发展的过程中。在管理问题、功能问题和2000年问题的驱动下,不断地涌现出像profs和snads这样基于主机的系统,以及像cc:mail和microsoft mail这样基于lan的系统。当然,internet的空前繁荣,促使了smtp成为了域间邮件路由协议的事实标准。在此同时,几乎无处不在的对pop3和imapv4邮件访问协议的支持,已经将桌面向第三方的客户开放了。而且,随着商业通信中电子邮件的飞速发展,新一类的用户已经开始使用企业邮箱了。企业的it部门也快速地从一个传输通道转变为一个isp,它提供internet邮件服务的支持,这是企业邮件服务的一个重要部分。


统一标准:

  通向世界之路


  尽管smtp/mime在internet领域中的统治地位是无可争议的,但是在欧洲还是存在着x.400的邮件路由机制。而且,美国国防部正在推动defense message system(dms)标准,其中使用了x.400 mta和x.500目录来提高邮件系统的安全性和可靠性。

  同样,smtp的功能也在不断地增加,在增强协议esmtp中加入了对多种语言字符集的支持,8位的mime传输和邮件消息大小的声明等新功能。但是,它仍然缺乏一些在其他邮件传输协议中的功能,例如发送和接收方的通知,邮件重发和取消等等。

  另外一个需要讨论的标准是acap(application configuration access protocol)。它满足imap邮件客户的动态配置需要,从而能够支持漫游的用户。acap提供了一条从特殊客户配置和用户选项到中央管理器的通道。尽管有许多邮件供应商都声称他们能够最终支持acap,但是他们中间的大部分还是计划支持基于web的客户或者基于ldap的客户配置。


目录服务:

  企业的核心


  从nos到邮件供应商,网络现在能够支持多个目录。通过共享公共的用户和配置信息的方法,他们各自的技术已经能够大大地提高每个系统的可扩展性。但是,目录在网络中成为了供应商指定的岛屿。所以,下一步目录标准所要做的就是两种可能:将这些不同的目录合并成为一个单个的企业目录,或者是在每个目录中同步属性的更新过程。

  邮件服务已经成为了企业目录服务的驱动力量。尽管大多数的nos供应商领导着企业目录服务发展,但是邮件系统已经计划发表所有企业的目录白皮书。这些全球的地址簿将提供邮件路由和地址解析、关于用户的组织和交互信息、以及作为邮件安全管理中所使用的数字认证的知识库。


internet邮件:

  全球一个标准


  支持全特性的internet邮件网关到要求推动it部门向isp服务的转化。但是,对internet邮件传输的支持带来了其它的一些严重问题,包括是否应该在防火墙之外发布诸如个人姓名、e-mail地址和其它联系信息的目录信息,是否应该允许整个工作组访问internet邮件。这些问题可能会需要一个企业邮件系统来限制访问internet邮件网关。

  至于用户界面的问题,如果用户依赖于internet邮件,寻址可能是一个主要的问题。在rfc822中规定了一个标准的寻址机制,它是基于dns寻址机制,将邮件传输到指定的邮件服务器上的指定邮箱中。


移动用户:

  下一轮需求


  支持移动用户一直被认为是一个亟待解决的邮件传输功能。尽管桌面用户能够获得连续的高带宽的网络连接,但是移动用户可能需要离线使用的能力和同步文件夹与地址簿的能力。移动用户经常将个人的客户端邮件系统和邮箱数据存放在便携机或膝上机中,所以他们需要相当强大的离线功能。

  漫游用户则可能遭遇到完全不同的问题。他们不仅仅需要和中央邮件服务器同步数据,而且还需要能够从不同的工作站上进行访问。漫游用户的典型特点就是不携带邮件夹,甚至也不携带客户端邮件系统的设置,而且通常通过internet访问企业的邮件服务器。

  大部分基于标准的邮件产品都为离线使用提供了一些典型的特征集。通过缓存共享资源(如地址簿)的局部拷贝,同步个人和共享的文件夹,移动用户就可以离线进行工作了。为了使离线使用更加有效,这个同步协议不仅要快速高效,而且要允许用户在离线的情况下能够进行所有的操作,要能够完全访问邮件的缓存副本、讨论组和日历等。

  在当今的基于客户/服务器的世界中,离线使用是一个相对基本的问题。包括microsoft outlook98, lotus notes和novell groupwise在内的大部分客户端邮件系统,以及基于标准的客户端系统如netscape communicator和qualcomm eudora都能够支持离线使用的功能。事实上,任何一个组件或者internet邮件系统能够下载邮件到客户端的收件箱中,在那里用户能够离线阅读。邮件也能够离线编写,而且每个系统都提供了一个本地的地址簿用来存储公共使用的地址信息。


远程访问:

  漫游到何处


  对于移动用户而言,需要考虑的有三个基本问题:随时随地地访问用户的邮箱和其它的邮件服务,保存接收到的和发送了的邮件,以及获得与普通邮件系统几乎相同的功能。漫游用户如何能够远程地访问一个公共的邮件存储区呢?在目前有两类解决的思路:一个是利用imapv4,另一个是使用web访问。

  尽管在理论上web访问允许任何的浏览器访问一个集中的邮件存储区,但是需要支持所有的客户端能够浏览标准的html界面。包括lotus、microsoft和novell在内的许多专门的邮件服务的供应商都支持某种的web形式来访问用户的邮箱。

  在另一个方面,imapv4提供了丰富的gui应用程序。但是,imapv4缺少一个十分重要的特征,即动态配置。imap的供应商是或者通过ldap在一个目录中存储客户的配置信息和个人的地址簿,或者通过一个独立的客户配置协议acap来进行信息存储。


邮件安全:

  加密和数字签名


  安全的邮件系统大致可以分为下面的三种类型:专用系统(例如entrust)、rsa的s/mimev2和network associates的pretty good privacy(pgp)。尽管所有这些技术都有着相同的工作原理,但是每种方法都采用了不同的认证格式、编码机制和加密算法,从而它们是完全不兼容的。

  尽管像notes或者entrust这样的专用系统发布了他们自己的密钥管理机制,但是s/mime和pgp还是依靠外部的密钥管理系统。90年代初期发布的pgp已经成为了internet上的一个事实标准,但是它也是采用了一种专门认证格式。与pgp不同的是rsa的s/mime使用了工业标准x.509v3的认证格式和相关的公共密钥机制。communicator和ie都支持s/mime,这主要是因为每个公司都能够有权发布rsa的加密算法。

  和现有的应用程序能够无缝衔接;向着规模庞大的企业扩展;相当可观的增值特性;这就是企业邮件供应商将给予的承诺。作为一个更加长远的打算,或许应该等待internet真正标准的到来。



——————————————————————————–

  pki——信任机制的推进者


  高强度的加密算法和数字证书对于保证电子邮件的保密性以及确认发送者的身份非常重要,但仅仅于此,对于实现真正的安全邮件与电子商务还远远不够,还必须建立公用密钥基础设施,即pki(public key infrastructure)。

  pki的内容包括建立数字证书,存储大量的证书和密钥,支持密钥备份和恢复,以及交叉认证机制等等。还能存储证书、撤消清单以及在密钥失效期满后自动更新。

  虽然s/mime支持x.509数字证书,而且pgp也正努力支持x.509,但它们离真正的pki还很远。它们仅仅是一种数据加密格式的标准,并没有标志这对密钥从何处来,怎样去检查证书的撤消清单以及如何进行交叉认证,它们不是pki。

  尽管s/mime和pgp可以支持数字证书并且能够在本地存储一定量的数字证书,但建立pki能带来更好的安全性和认证机制。

  当真正理解pki带来的好处后,就可以开始真正的电子交易了。

随着互联网的全面普及,基于互联网的电子商务也应运而生,并在近年来获得了巨大的发展,成为一种全新的商务模式,被许多经济专家认为是新的经济增长点。
作为一种全新的商务模式,它有很大的发展前途,同时,这种电子商务模式对管理水平、信息传递技术都提出了更高的要求,其中安全体系的构建又显得尤为重要。如何建立一个安全、便捷的电于商务应用环境,对信息提供足够的保护,是商家和用户都十分关注的话题。安全问题己成为电子商务的核心问题。本文将对电子商务安全问题作一个基本的探讨。
1 电子商务模式
现代电子商务技术已经集中于网络商店的建立和运作。网络商店和真实商店在部门结构和功能上没有区别,不同点在于其实现这些功能和结构的方法以及商务运作的方式。
网络商店从前台看是一种特殊的WEB服务器。现代WEB网站的多媒体支持和良好的交互性功能成为建立这种虚拟商店的基础,使得顾客可以像在真实的超级市场一样推着购物车挑选商品,并最后在付款台结账。这也就构成网上商店软件的三大支柱:商品目录、顾客购物车和付款台。好的商品目录可以使顾客通过最简单的方式找到其需要的商品,并可以通过文字说明、图像显示、客户评论等充分了解产品各种信息;商品购物车则衔接商店和个人,客户既可以把他喜欢的商品一个个放到购物车里,也可以从购物车中取出,直到最后付款;付款台是网络交易的最终环节,也是最关键的环节。顾客运用某种电子货币和商店进行交易必须对顾客和商店都是安全可靠的。
在美国,网上商店收取信用卡必须具备三个条件:
1) 需要在美国的某个商业银行中建立一个商业账户。这个账户使你可以进行接收信用卡支付和处理信用卡业务,最终获得资金。
2) 必须为直接商品购买者提供一个符合SSL规范的加密站点用于他们安全地提交自己的信用卡资料,在保证他们提交的信息准确可靠的同时,还必须保证这些资料不被第三方窃取。美中通联通过和美国最大的CA中心Verisign合作建立这种用户可以高度信任的加密站点为客户服务。
3) 购买者提供的信用卡资料将直接被送到专门提供信用卡服务的专业公司(支付网关)进行处理,他们将进行信用卡的验证,转账,最终将资金转入商业账户。美中通联的合作伙伴Cybercash也是美国最为著名的网络支付提供商。不但可以提供VISA,万事达信用卡服务业务,同时也提供American Express, Discover等信用卡的支付以及Digital Cash, Digital Coins, Smart Card等电子货币的结算方式。
而在网络商店的背后,企业首先要具备商品的存储仓库和管理机构;其次要将网络上销售的产品通过邮政或其他渠道投递到顾客手里;第三,企业同样要负责产品的售后服务,这种服务可能是通过网络的,也可能不是。
网络交易通常是一种先交钱后拿货的购物方式。对客户而言,其方便处在于购得的商品会直接投递到自己家里,而难以放心的是在商品到达手中之前并不能确认到自己手中的究竟是什么。因此网络商店的信誉和服务质量实际上是电子商务成功与否的关键。
网络商店必备条件:
商店名称:它就像是注册商标,在网络上称为域名,整个网络世界它是唯一的。一个与您公司名称相关的网络名称可以使顾客更容易记住您的商店。
商店地点:也就是开设您的商店的网络服务器地址,高速的网络连接,就像是把商店开设闹市黄金地段,可以使顾客快速容易地抵达,这对客户的影响是十分关键的。
商店装修:网站的设计对用户来讲自然非常重要,动人的网页就像一流装修的商场,不但吸引顾客,而且增加顾客的信心。
货物摆放:在网上商店中,其反映在如何建立商品的目录结构,提供何种网站导航和搜索功能,以使得用户可以快速、便利地寻找到他需要的商品和相关信息。
购物车:方便灵巧的购物车可以使顾客感觉到受到良好的服务,增加顾客的信心。它是连接商品和付款台的关键环节。
货币结算:支付系统是网络交易的重要环节。在美国和欧洲,信用卡已经成为最普遍的电子交易方式。通过提供必要的个人信用卡资料,商店就可以通过银行计算机网络与顾客进行结算。这也是建立网络商店的必要条件。而且货币结算的安全可靠,不但关系到顾客的切身利益,同时直接关系到您商业经营的安全可靠。
商品盘点更新:对网络商店的日常维护,例如去除销售完的商品,摆上新货等等,是必须经常进行的业务。
库存商品管理:后勤保证是任何商务运作的基础。无论网络商店还是真实商店,货物和货币都是一样真实的,对库存货物的存储和管理也是一样真实的。
商品最终送达用户:网上购物实际上是邮购。最后一个步骤自然是通过邮政或其他系统将货物快速可靠地送达最终用户手中。
售后服务:不言而喻,这同样是现代商品销售的重要环节。而网络技术可以为用户提供24小时不间断的服务,这也是网络商店的优势之一。通常网络商店还要提供30天的退/换货承诺。
因此一个企业在进入电子商务领域时必须考虑如下的问题:
如何申请一个自己的域名?如何设立一个电子商务服务器?服务器如何和Internet连接?如何设计这个网上商店,实现各种功能?谁来设计?谁来维护这个网站?如何实现在线交易?如何安全可靠地进行网络电子货币结算?网上商店和商品库存之间如何协调?如何快速便利地将商品投递到用户手中?售后服务如何进行?


2 电子商务发展的关键环节
2.1 良好的网络环境
电子商务是在电信网络上发展起来的。因此,先进的计算机网络基础设施和宽松的电信政策就成为发展电子商务的前提。目前,电信服务价格过高,带宽有限,服务不及时或不可靠等因素已经成为发展电子商务的制约因素。加快电信基础设施建设,打破电信市场的垄断,引进竞争机制,保证电信业务公平竞争,促进网络互联,确保为用户提供廉价,高速,可靠的通信服务是良好网络环境的建设目标,也是世界各国面临的共同课题。
我国电信业务长期受到计划经济的影响,独家垄断的局面尚未打破。近年来因特网迅猛发展,电信政策不适应形势的矛盾日益突出。主要表现在:
网络供应商(ISP)租用线路的价格过高,使他们无利可图。一批前期进入这一领域的ISP由于亏损,已经退出。
ISP与电信网络互联,遇到了来自电信部门的阻力,互联费用过高,以各种借口的刁难。
由于电信部门垄断了接入业务,用户接入费用过高,一般都难以承受。也无法选择有良好服务的接入服务商。
为了促进电信市场的开放和协调世界各国的电信政策,世界贸易组织在1997年成功地缔结了基础通信协定。该协定将保证全球电信市场的竞争,加强国家之间的合作。
2.2 公共电子商品导购平台
公共电子商品导购平台,是保证网上电子商务活动顺利完成的物理保证。它主要涉及网络平台建设和企业信息库建设两方面的问题。人们发送到网络上的交易信息,必须准确、迅速地在供应商、流通商、管理部门、银行、交通运输等部门之间传送,这需要各国家、各部门统一信息存储、通讯、处理的标准和协议,具有一个协调一致的导购平台。同时,各企业的商品信息库建设是平台的基础,企业没有与平台标准一致的商品信息库,电子商务就失去了生存的基础。我国的企业信息化程度不高,目前只有少数企业主要是信息技术企业建立了企业商品信息库,这就减缓了我国公共电子商品导购平台的建设。
2.3 企业级电子商务体系
企业级电子商务是电子商务体系的基础。在科技高速发展、经济形势快速变化的今天,人们不再是先生产而后去寻找市场,而是先获取市场信息再组织生产。随着知识经济时代的来临,信息已成为主导全球经济的基础。企业内部信息网络:Intranet,是一种新的企业内部信息管理和交换的基础设施,在网络、事务处理以及数据库上继承了以往的MIS(管理信息系统)成果,而在软件上则引入因特网的通信标准和WWW内容的标准。Intranet的兴起,将封闭的、单项系统的MIS改造为一个开放、易用、高效及内容和形式丰富多彩的企业信息网络,实现企业的全面信息化。企业信息网络应包含生产、产品开发、销售和市场、决策支持、客户服务和支持及办公事务管理等方面。对于大型企业,同时要注意建设企业内部科技信息数据库,如对技术革新、新产品开发、科技档案、科技图书、科技论文、科技成果、能源消耗、原辅材料等各种数据库的建设。当然还要选择一些专业网络和地方网络入网。
2.4 安全认证体系
开展电子商务最突出的问题是要解决网上购物、交易和结算中的安全问题,其中包括建立电子商务各主体之间的信任问题,即建立安全认证体系(CA)问题;选择安全标准(如SET、SSL、PKI等)问题;采用加、解密方法和加密强度问题。其中建立安全认证体系是关键。
网上交易与传统的面对面或书面的交易方式不同,它是通过网络传输商务信息和进行贸易活动的。网上交易的安全问题意味着:
有效性:保证网上交易合同的有效性,防止系统故障、计算机病毒、黑客攻击。
保密性:对交易的内容、交易双方账号、密码不被他人识别和盗取。
完整性:防止单方面对交易信息的生成和修改。
所以,电子商务的安全体系应包括:安全可靠的通信网络,保证数据传输的可靠完整,防止病毒、黑客入侵;电子签名和其他身份认证系统;完备的数据加密系统等等。
2.5 安全支付结算体系
银行业务的电子化,使得电子货币正在逐步取代传统纸币,发挥越来越重要的作用。1996年英国小城斯温登宣布用电子货币取代纸币,信用卡成为一种新的货币形式。随着网上交易的增多,网络银行、数字货币等全新的概念也应运而生。1994年比尔盖茨曾经嘲笑传统的银行是跟不上时代的恐龙。实际上,因特网确实对传统的金融业务提出了挑战。全球大约1000家银行中的500家已经加入互联网,1996年有190万人使用在线银行服务,预计到2000年将有1300万人使用在线银行。无论是完全依赖于网络的银行,还是传统银行利用网络开展银行业务,安全问题都是十分重要的。我国的电子商务的普及,首先要解决网络的安全问题。在金融专网和因特网之间设置支付网关,作为支付结算的安全屏障
2.6 协同作业体系
在电子商务中,所谓协同作业,包括工商、税务、银行、运输、商检、海关、外汇、保险、电信、认证等部门,以及商城、商户、企业、客户等单位按一定规范与程序相互配合,相互衔接,协同工作,共同完成有关电子商务活动。所谓协同作业体系包括:

①有关协同作业部门(不含广大客户)通过专线或IP隧道与电子商城互连;②共同协商制定统一高效的作业规范与程序;③共同制定降低电子商务运行成本的资费政策;④推行实施协同工作(CSCW)。
2.7 法律政策环境
建立一套法律政策体系,保证电子交易双方能按照共同的规则进行交易,对起动、发展电子商务是完全必要的,十分急需的。电子商务是世界性的经济活动,其法律框架也不应局限在一国范围内,而应适用于国际间的贸易往来,联合国国际贸易法委员会(UNCRTRAL)已经完成了一个法律范本,以支持电子商务在国际贸易中的应用。其内容应包括:
电子合同的有效性;
有效的电子文件的规范;
电子签名的合法性和其他身份辨认程序;
知识产权的保护;
商标权和域名的保护;
企业和个人隐私的保护
目前在我国,统一合同法(技术合同、经济合同、对外经济合同统一)即将由全国人大通过后出台,在统一合同法中已承认电子合同与书面合同一样具有合法性,意即可证明买卖成立,但不能解决合同纠纷问题,要解决此问题有两条出路:(1)到法院起诉(无法律依据);(2)通过仲裁解决(要制定协议)。
建立电子商务活动的技术标准也是至关重要的。在电子商务试点阶段,实行税费优惠政策也有利于电子商务的推广。
3 电子商务面临的安全问题
由于电子商务是以计算机网络为基础的,因此它不可避免面临着一系列的安全问题。
(1)信息泄漏
在电子商务中表现为商业机密的泄漏,主要包括两个方面:交易双方进行交易的内容被第三方窃取;交易一方提供给另一方使用的文件被第三方非法使用。
(2)窜改
在电子商务中表现为商业信息的真实性和完整性的问题。电子的交易信息在网络上传输的过程中,可能被他人非法修改、删除或重改,这样就使信息失去了真实性和完整性。
(3)身份识别
如果不进行身份识别,第三方就有可能假冒交易一方的身份,以破坏交易、破坏被假冒一方的信誉或盗取被假冒一方的交易成果等,进行身份识别后,交易双方就可防止相互猜疑的情况。
(4)电脑病毒问题
电脑病毒问世十几年来,各种新型病毒及其变种迅速增加,互联网的出现又为病毒的传播提供了最好的媒介。不少新病毒直接利用网络作为自己的传播途径,还有众多病毒借助干网络传播得更快,动辄造成数百亿美元的经济损失。
(5) 黑客问题
随着各种应用工具的传播,黑客己经大众化了,不像过去那样非电脑高手不能成为黑客。曾经大闹雅虎网站的黑手党男孩就没有受过什么专门训练,只是向网友下载了几个攻击软件并学会了如何使用,就在互联网上大干了一场。
4 电子商务安全因素与安全技术
安全问题是企业应用电子商务最担心的问题,而如何保障电子商务活动的安全,将一直是电子商务的核心研究领域。作为一个安全的电子商务系统,首先必须具有一个安全、可靠的通信网络,以保证交易信息安全、迅速地传递;其次必须保证数据库服务器绝对安全,防止黑客闯入网络盗取信息。
4.1电子商务的安全要素
(1)有效性
EC以电子形式取代了纸张,那么如何保证这种电子形式的贸易信息的有效性则是开展E的前提。EC作为贸易的一种形式,其信息的有效性将直接关系到个人、企业或国家的经济利益和声誉。因此,要对网络故障、操作错误、应用程序错误、硬件故障、系统软件错误及计算机病毒所产生的潜在威胁加以控制和预防,以保证贸易数据在确定的时刻、确定的地点是有效的。
(2)机密性
EC作为贸易的一种手段,其信息直接代表着个人、企业或国家的商业机密。传统的纸面贸易都是通过邮寄封装的信件或通过可靠的通信渠道发送商业报文来达到保守机密的目的。EC是建立在一个较为开放的网络环境上的(尤其Internet是更为开放的网络),维护商业机密是EC全面推广应用的重要保障。因此,要预防非法的信息存取和信息在传输过程中被非法窃取。
(3)完整性
EC简化了贸易过程,减少了人为的干预,同时也带来维护贸易各方商业信息的完整、统一的问题。由于数据输入时的意外差错或欺诈行为,可能导致贸易各方信息的差异。此外,数据传输过程中信息的丢失、信息重复或信息传送的次序差异也会导致贸易各方信息的不同。贸易各方信息的完整性将影响到贸易各方的交易和经营策略,保持贸易各方信息的完整性是EC应用的基础。因此,要预防对信息的随意生成、修改和删除,同时要防止数据传送过程中信息的丢失和重复并保证信息传送次序的统一。
(4)可靠性/不可抵赖性/鉴别
EC可能直接关系到贸易双方的商业交易,如何确定要进行交易的贸易方正是进行交易所期望的贸易方这一问题则是保证EC顺利进行的关键。在传统的纸面贸易中,贸易双方通过在交易合同、契约或贸易单据等书面文件上手写签名或印章来鉴别贸易伙伴,确定合同、契约、单据的可靠性并预防抵赖行为的发生。这也就是人们常说的白纸黑字。在无纸化的EC方式下,通过手写签名和印章进行贸易方的鉴别已是不可能的。因此,要在交易信息的传输过程中为参与交易的个人、企业或国家提供可靠的标识。
(5)即需性
即需性是防止延迟或拒绝服务,即需安全威胁的目的就在于破坏正常的计算机处理或完全拒绝服务。在电子商务中,延迟一个消息或消除它会带来灾难性的后果。例如,你在上午10点向在线的股票交易公司发一个电子邮件委托购买1000股IBM公司的股票,假如这个邮件被延迟了,股票经济商在下午2点半才收到这封邮件,这时股票已经涨了15%,这个消息的延迟就使你损失了交易额的 15%。
(6)身份认证
指交易双方可以相互确认彼此的真实身份,确认对方就是本次交易中所称的真正交易方。认证是证实一个声称的身份或者角色,如用户、机器、节点等是否真实的过程。这一过程为授权和审计所必需,也是实现授权、审计的访问控制过程运行的前提,是计算机网络安全系统不可缺少的组成部分。
(7)审查能力
根据机密性和完整性的要求,应对数据审查的结果进行记录。审查能力是指每个经授权的用户的活动的唯一标识和监控的,以便对其所使用的操作内容进行审计和跟踪。当贸易一方发现交易行对自己不利时否认电子商务行为。例如,某股民以每股12元购买了1000股后,行情发生了变化,每股价格降到了10元,于是该股民否认以前的购买行为。因此,要求系统要有审查能力,使交易的任何一方都不能抵赖已经发生的交易行为。
4.2 电子商务采用的主要安全技术及其标准规范
考虑到安全服务各方面要求的技术方案已经研究出来了,安全服务可在网络上任何一处加以实施。但是,在两个贸易伙伴间进行的EC,安全服务通常是以端到端形式实施的(即不考虑通信网络及其节点上所实施的安全措施)。所实施安全的等级则是在均衡了潜在的安全危机、采取安全措施的代价及要保护信息的价值等因素后确定的。这里将介绍EC应用过程中主要采用的几种安全技术及其相关标准规范。
4.2.1 防火墙技术
(1)防火墙定义
防火墙是在内部网与外部网之间实施安全防范的系统,可被认为是一种访问控制机制,用于确定哪些内部服务允许外部访问,以及允许哪些外部服务访问内部服务。实现防火墙技术的主要途径有:数据包过滤、应用网关和代理服务。
(2)包过滤技术
包过滤技术是在网络层中对数据包实施有选择的通过,依据系统内事先设定的过滤逻辑,检查数据流中每个数据包后,根据数据包的源地址、目的地址、所用的 TCP/ UDP端口与 TCP链路状态等因素来确定是否允许数据包通过。包过滤的核心是安全策略,即过滤算法的设计。包过滤技术速度快、实现方便,但审计功能差。过滤规则的设计存在矛盾关系,过滤规则简单时安全性差,过滤规则复杂则管理困难。
(3)应用网关技术
应用网关技术是建立在网络应用层上的协议过滤,它针对特别的网络应用服务协议,即数据过滤协议,能够对数据包分析并形成相关的报告。应用网关对某些易于登录和控制所有输入输出的通讯环境给予严格的控制,以防有价值的程序和数据被窃取。
(4)代理服务技术
代理服务作用在应用层,用来提供应用层服务的控制。这种代理服务准许网络管理员允诺或拒绝特定的应用程序或一个应用的特定功能。包过滤技术和应用网关是通过特定的逻辑判断来决定是否允许特定的数据包通过的,一旦判断条件满足,防火墙内部网络的结构和运行状态便暴露在外来用户面前,从而引入了代理服务的概念。这一技术使防火墙内外计算机系统应用层的链接由两个终止干代理服务的链接未实现。这就成功地实现了防火墙内外计算机系统的隔离。同时,代理服务还具有实施较强的数据流监控、过滤、记录和报告等功能。代理的CACHE功能可以加速访问,但对干每一种应用服务都必须为其设计一个代理软件模块未进行安全控制,而每一种网络应用服务的安全问题各不相同,分析困难,实现也困难。
(5)防火墙技术的发展
结合上述几种防火墙技术的优点,可以产生通用、高效和安全的防火墙。目前,除了基于以上三种技术的防火墙以外,又出现了许多新技术。如:动态包过滤技术,网络地址翻译技术,加密路由器技术等。防火墙技术将不断向着高度安全性、高度透明化的方向发展。
4.2.2 加密技术
加密技术是EC采取的主要安全措施,贸易方可根据需要在信息交换的阶段使用。目前,加密技术分为两类,即对称加密和非对称加密。
(1) 对称加密/对称密钥加密/专用密钥加密
在对称加密方法中,对信息的加密和解密都使用相同的密钥。也就是说,一把钥匙开一把锁。使用对称加密方法将简化加密的处理,每个贸易方都不必彼此研究和交换专用的加密算法,而是采用相同的加密算法并只交换共享的专用密钥。如果进行通信的贸易方能够确保专用密钥在密钥交换阶段未曾泄露,那么机密性和报文完整性就可以通过对称加密方法加密机密信息和通过随报文一起发送报文摘要或报文散列值来实现。对称加密技术存在着在通信的贸易方之间确保密钥安全交换的问题。此外,当某一贸易方有n个贸易关系,那么他就要维护n个专用密钥(即每把密钥对应一贸易方)。对称加密方式存在的另一个问题是无法鉴别贸易发起方或贸易最终方。因为贸易双方共享同一把专用密钥,贸易双方的任何信息都是通过这把密钥加密后传送给对方的。
数据加密标准(DES)由美国国家标准局提出,是目前广泛采用的对称加密方式之一,主要应用于银行业中的电子资金转账(EFT)领域。DES的密钥长度为56位。三重DES是DES的一种变形。这种方法使用两个独立的56位密钥对交换的信息(如EDI数据)进行3次加密,从而使其有效密钥长度达到112位。RC2和RC4方法是RSA数据安全公司的对称加密专利算法。RC2和RC4不同于DES,它们采用可变密钥长度的算法。通过规定不同的密钥长度,RC2和RC4能够提高或降低安全的程度。一些电子邮件产品(如Lotus Notes和Apple的Open Collaboration Environment)已采用了这些算法。
(2) 非对称加密/公开密钥加密
在非对称加密体系中,密钥被分解为一对(即一把公开密钥或加密密钥和一把专用密钥或解密密钥)。这对密钥中的任何一把都可作为公开密钥(加密密钥)通过非保密方式向他人公开,而另一把则作为专用密钥(解密密钥)加以保存。公开密钥用于对机密性的加密,专用密钥则用于对加密信息的解密。专用密钥只能由生成密钥对的贸易方掌握,公开密钥可广泛发布,但它只对应于生成该密钥的贸易方。贸易方利用该方案实现机密信息交换的基本过程是:贸易方甲生成一对密钥并将其中的一把作为公开密钥向其他贸易方公开;得到该公开密钥的贸易方乙使用该密钥对机密信息进行加密后再发送给贸易方甲;贸易方甲再用自己保存的另一把专用密钥对加密后的信息进行解密。贸易方甲只能用其专用密钥解密由其公开密钥加密后的任何信息。
RSA算法是非对称加密领域内最为著名的算法,但是它存在的主要问题是算法的运算速度较慢。因此,在实际的应用中通常不采用这一算法对信息量大的信息(如大的EDI交易)进行加密。对于加密量大的应用,公开密钥加密算法通常用于对称加密方法密钥的加密。
4.2.3 密钥管理技术
(1) 对称密钥管理
对称加密是基于共同保守秘密来实现的。采用对称加密技术的贸易双方必须要保证采用的是相同的密钥,要保证彼此密钥的交换是安全可靠的,同时还要设定防止密钥泄密和更改密钥的程序。这样,对称密钥的管理和分发工作将变成一件潜在危险的和繁琐的过程。通过公开密钥加密技术实现对称密钥的管理使相应的管理变得简单和更加安全,同时还解决了纯对称密钥模式中存在的可靠性问题和鉴别问题。
贸易方可以为每次交换的信息(如每次的EDI交换)生成唯一一把对称密钥并用公开密钥对该密钥进行加密,然后再将加密后的密钥和用该密钥加密的信息(如EDI交换)一起发送给相应的贸易方。由于对每次信息交换都对应生成了唯一一把密钥,因此各贸易方就不再需要对密钥进行维护和担心密钥的泄露或过期。这种方式的另一优点是即使泄露了一把密钥也只将影响一笔交易,而不会影响到贸易双方之间所有的交易关系。这种方式还提供了贸易伙伴间发布对称密钥的一种安全途径。
(2) 公开密钥管理/数字证书
贸易伙伴间可以使用数字证书(公开密钥证书)来交换公开密钥。国际电信联盟(ITU)制定的标准X.509(即信息技术–开放系统互连–目录:鉴别框架)对数字证书进行了定义该标准等同于国际标准化组织(ISO)与国际电工委员会(IEC)联合发布的ISO/IEC
9594-8:195标准。数字证书通常包含有唯一标识证书所有者(即贸易方)的名称、唯一标识证书发布者的名称、证书所有者的公开密钥、证书发布者的数字签名、证书的有效期及证书的序列号等。证书发布者一般称为证书管理机构(CA),它是贸易各方都信赖的机构。数字证书能够起到标识贸易方的作用,是目前EC广泛采用的技术之一。微软公司的Internet Explorer 5.0和网景公司的Navigator 6.0都提供了数字证书的功能来作为身份鉴别的手段。
(3)密钥管理相关的标准规范
目前国际有关的标准化机构都着手制定关于密钥管理的技术标准规范。ISO与IEC下属的信息技术委员会(JTC1)已起草了关于密钥管理的国际标准规范。该规范主要由3部分组成:第1部分是密钥管理框架;第2部分是采用对称技术的机制;第3部分是采用非对称技术的机制。该规范现已进入到国际标准草案表决阶段,并将很快成为正式的国际标准。
4.2.4认证技术
(1)数字签名
数字签名是公开密钥加密技术的另一类应用。它的主要方式是:报文的发送方从报文文本中生成一个128位的散列值(或报文摘要)。发送方用自己的专用密钥对这个散列值进行加密来形成发送方的数字签名。然后,这个数字签名将作为报文的附件和报文一起发送给报文的接收方。报文的接收方首先从接收到的原始报文中计算出128位的散列值(或报文摘要),接着再用发送方的公开密钥来对报文附加的数字签名进行解密。如果两个散列值相同,那么接收方就能确认该数字签名是发送方的。通过数字签名能够实现对原始报文的鉴别和不可抵赖性。
ISO/IEC JTC1已在起草有关的国际标准规范。该标准的初步题目是信息技术安全技术带附件的数字签名方案,它由概述和基于身份的机制两部分构成。
普通的密钥系统可能存在以下问题:
假冒:第三方C有可能假冒A给B发消息,因为E是公开的。
否认:A可能否认向B发消息。
伪造:B有可能伪造或修改一条从A发来的消息,以对自己有利,事后否认这种行为并声称是A发来的。
这些就要靠数字签名来解决。它的过程是:报文的发送方将报文文本带入到哈希函数生成一个128位的散列值,即消息摘要。消息摘要代表着文件的特征,其值将随着文件的变化而变化。也就是说,不同的文件将得到不同的消息摘要。哈希函数对干发送数据的双方都是公开的。发送方用自己的专用密钥对这个散列值进行加密来形成发送方的数字签名。然后,这个数字签名将作业报文的附件和报文一起发送给报文的接收方。报文的接收方首先从接收到的原始报文中计算出 128位的散列值(消息摘要),接着再用发送方的公开密钥来对报文附加的数字签名进行解密。如果两个散列值相同,那么接收方就能确认该数字签名是发送方的。通过数字签名能够实现对原始报文的鉴别和不可抵赖性。网络传输过程中数据的保密性通过加密和数字签名得到了保证,但每一个用户都有自己的一个甚至两个密钥对,不同用户之间要用公开密钥体系来传递数据,必须首先知道对方的公开密钥。
(2)数字信封
在大批数据加密中所使用的对称密码是随机产生的,而接收方也需要此密码才能对消息进行正确的解密。对称密钥的传递需要加密进行,即发送方用接收方的证书(公钥)加密此对称密钥。这样只有接收方用自己的私钥才能正确地解密此对称密钥,从而正确地解密消息。这种加密传送密钥的方法称为数字信封。数字信封技术可以保证接收方的唯一性。即使信息在传送途中被监听或截获,由干第三方并没有接收方的密钥,也不能对信息进行正确的解密。
(3) 虚拟专用技术
虚拟专用网VPN是用于Internet交易的一种专用网络,它可以在两个系统之间建立安全的信道(或隧道),用于电子数据交换。它与信用卡交易和客户发送定单交易不同。因为在VPN中,双方的数据通信量大得多,而且通信的双方彼此都很熟悉。这意味着可以使用复杂的专用加密和认证技术,只要通信的双方默认即可,没有必要为所有的VPN进行统一的加密和认证。为防止黑客的破坏,现有的或正在开发的数据隧道系统进一步增加VPN的安全性,从而能够保证数据的保密性和可用性。
(4) 证书和证书管理机构CA
证书就是一份文档,它纪录了用户的公开密钥和其他身份信息(如身份证号码或者E-mail地址)以及证书管理机构的数字签名。
证书管理机构是一个受大家信任的第三方机构。用户向CA提交自己的公开密钥和其他代表自己身份的信息,CA验证了用户的有效身份之后,向用户颁发一个经过CA私有密钥签名的证书。
证书和CA的存在使两个贸易方都信任CA并从CA处得到了一个证书,双方可以通过互相交换证书得到对方的公开密钥。由干证书上有CA的数字签名,用户如果有正确的CA的公开密钥,就可以通过数字签名的鉴定来判断从证书中得到的公开密钥是否确实是对方的公开密钥。
4.2.5 Internet电子邮件的安全协议
电子邮件是Internet上主要的信息传输手段,也是EC应用的主要途径之一。但它并不具备很强的安全防范措施。Internet工程任务组(IEFT)为扩充电子邮件的安全性能已起草了相关的规范。
(1) PEM
PEM是增强Internet电子邮件隐秘性的标准草案,它在Internet电子邮件的标准格式上增加了加密、鉴别和密钥管理的功能,允许使用公开密钥和专用密钥的加密方式,并能够支持多种加密工具。对于每个电子邮件报文可以在报文头中规定特定的加密算法、数字鉴别算法、散列功能等安全措施。PEM是通过Internet传输安全性商务邮件的非正式标准。有关它的详细内容可参阅Internet工程任务组公布的RFC
1421、RFC 1422、RFC143 和RFC 1424等4个文件。PEM有可能被S/MIME和PEM-MIME规范所取代。
(2) S/MIME
S/MIME(安全的多功能Internet电子邮件扩充)是在RFC1521所描述的多功能Internet电子邮件扩充报文基础上添加数字签名和加密技术的一种协议。MIME是正式的Internet电子邮件扩充标准格式,但它未提供任何的安全服务功能。S/MIME的目的是在MIME上定义安全服务措施的实施方式。S/MIME已成为产界业广泛认可的协议,如微软公司、Netscape公司、Novell公司、Lotus公司等都支持该协议。
(3) PEM-MIME (MOSS)
MOSS(MIME对象安全服务)是将PEM和MIME两者的特性进行了结合。
4.2.6 Internet主要的安全协议
(1) SSL
SSL(安全槽层)协议是由Netscape公司研究制定的安全协议,该协议向基于TCP/IP的客户/服务器应用程序提供了客户端和服务器的鉴别、数据完整性及信息机密性等安全措施。该协议通过在应用程序进行数据交换前交换SSL初始握手信息来实现有关安全特性的审查。在SSL握手信息中采用了DES、MD5等加密技术来实现机密性和数据完整性,并采用X.509的数字证书实现鉴别。该协议已成为事实上的工业标准,并被广泛应用于Internet和Intranet的服务器产品和客户端产品中。如Netscape公司、微软公司、IBM公司等领导Internet/Internet 网络产品的公司已在使用该协议。
此外,微软公司和Visa机构也共同研究制定了一种类似于SSL的协议,这就是PCT(专用通信技术)。该协议只是对SSL进行少量的改进。
(2) S-HTTP
S-HTTP(安全的超文本传输协议)是对HTTP扩充安全特性、增加了报文的安全性,它是基于SSL技术的。该协议向WWW的应用提供完整性、鉴别、不可抵赖性及机密性等安全措施。目前,该协议正由Internet工程任务组起草RFC草案。
(3) UN/EDIFACT的安全
EDI是EC最重要的组成部分,是国际上广泛采用的自动交换和处理商业信息和管理信息的技术。UN/EDIFACT报文是唯一的国际通用的EDI标准。利用Internet进行EDI已成为人们日益关注的领域,保证EDI的安全成为主要解决的问题。联合国下属的专门从事UN/EDIFACT标准研制的组织–UN/ECE/WP4(即贸易简化工作组)于1990年成立了安全联合工作组(UN-SJWG),来负责研究UN/EDIFACT标准中实施安全的措施。该工作组的工作成果将以ISO的标准形式公布。
在ISO将要发布的ISO 9735(即UN/EDIFACT语法规则)新版本中包括了描述UN/EDIFACT中实施安全措施的5个新部分。它们分别是:第5部分–批式EDI(可靠性、完整性和不可抵赖性)的安全规则;第6部分–安全鉴别和确认报文(AUTACK);第7部分–批式EDI(机密性)的安全规则;第9部分–安全密钥和证书管理报告(KEYMAN);第10部分–交互式EDI的安全规则。
UN/EDIFACT的安全措施主要是通过集成式和分离式两种途径来实现。集成式的途径是通过在UN/EDIFACT报文结构中使用可选择的安全头段和安全尾段来保证报文内容的完整性、报文来源的鉴别和不可抵赖性;
而分离式途径则是通过发送3种特殊的 UN/EDIFACT报文(即AU TCK、KEYMAN和CIPHER来达到保障安全的目的。
(4)安全电子交易规范(SET)
SET向基于信用卡进行电子化交易的应用提供了实现安全措施的规则。它是由Visa国际组织和万事达组织共同制定的一个能保证通过开放网络(包括Internet)进行安全资金支付的技术标准。参与该标准研究的还有微软公司、IBM公司、Netscape公司、RSA公司等。SET主要由3个文件组成,分别是SET业务描述、SET程序员指南和SET协议描述。SET 1.0版已经公布并可应用于任何银行支付服务。
Visa和MasterCard一直在致力于开发使用信用卡进行Internet支付的安全电子交易协议(SET)。该协议干1997年5月正式通过。SET在保留对客户信用卡认证的前提下,又增加了对商家身份的认证。该协议是开放网络环境中的卡支付安全协议,它采用公开密码体制(PK1)和X.509电子证书标准,通过相应软件、电于证书、数字签名和加密等技术,在电于交易环节上提供更大的信任度,更完善的交换信息、更高的安全性和较少的可欺诈性。但是采用SET协议的一些试验结果表明SET在相互操作方面存在一些问题。SET的局限性还在于该协议仅限于使用信用卡方式的支付手段。
5 对电子商务安全的展望
我国应尽快对电子商务的有关细则进行立法,否则就会使该电子商务行业变得混乱,不能成为新的经济增长点。大多数系统都将销售商的服务器和消费者的浏览器间的关系假设为主从关系,这种非对称关系限制了在这些系统中执行复杂的协议,而且不允许用户间进行直接交易。客户的匿名性和隐私尚未得到充分的考虑。
综上所述,电子商务安全技术虽然已经取得了一定的成绩,但是电子商务要真正成为一种主导的商务模式,还必须在安全技术上有更大的突破。

2006年04月17日

1.因为我用的eclipse是3.1.2版本,所以首先下载对应的3个插件emf-sdo-xsd-SDK-2.1.2.zip,GEF-ALL-3.1.1.zip,VE-SDK-1.1.0.1.zip(注意这里一定要对应的使用!)
2.将这3个插件对应的解压
3.这样打开eclipse你就会发现新建那里多了Visual Class
4.接下来配置SWT.
由于运行SWT的程序用到本地库.然后发现D:\eclipse\plugins\下有个org.eclipse.swt.win32.win32.x86_3.1.2.jar,将里面的DLL文件解压出来,放到D:\JAVA\BIN\文件夹下
5.启动eclipse,
添加SWT ToolKit, 菜单Project->Properties 选择左侧的 Java Build Path  选择 右侧的 Libraries 标签页, 点击 Add Library 按钮, 选择 Standard Widget Toolkit(SWT)  点击 Next , 选上 Include support for JFace library  结束.这样就可以使用 SWT/Jface控件了.

实战开始:(摘录)
新建一个项目 file->New->project 出来项目向导, 选择java project.  ->next 输入project Name:Hello  Eclipse自动给你建个workspace 工作文件夹,你的项目都存在这里的,d:\eclipse\workspace  点击结束. 一个新项目建成了.

选中你的project Hello. 选择新建图标按钮, 上端最左侧的. 选择 Visual Class ,点击Next , Source Folder 是缺省的 project folder, package 填入 test, Name 填入 FrmHello  , 展开左侧的 SWT 选择 Shell, 勾选上 public static void main(String[] args), Constructors from superclass, Inherited abstract methods. 结束.

Eclipse自动启动 VE…. 看看那些窗口比较熟悉.. 出现了可视化编辑窗口.

鼠标移到右侧的Palette(竖着的那个)把 一个Label,一个Button, 一个TextArea 放到shell.

选中Label, 在下侧的Properties属性栏可以进行设置, >text 填入Hello World

选中 Button 在下侧的Properties属性栏可以进行设置, >text 填入Click Me.

选中 Button 右键, events->Add Events . 选择Mouse – MouseAdapter ->mouseDown.  相应的代码自动产生.添加如下代码(蓝色部分)

也可进行其他的风格设置, 但是如果JDK版本不对则不能操作.有错

全部代码:

/*

* Created on 2005-4-20

*

* TODO To change the template for this generated file go to

* Window – Preferences – Java – Code Style – Code Templates

*/

package test;

 

 

 

 

 

import org.eclipse.swt.widgets.Label;

import org.eclipse.swt.SWT;

import org.eclipse.swt.widgets.Button;

import org.eclipse.swt.widgets.Text;

/**

* @author w19284

*

* TODO To change the template for this generated type comment go to

* Window – Preferences – Java – Code Style – Code Templates

*/

public class FrmHello { 

 

 

 

 

 

private org.eclipse.swt.widgets.Shell sShell = null; // @jve:decl-index=0:visual-constraint="41,12"

private Label label = null;

private Button button = null;

private Text textArea = null;

/**

*

*/

public FrmHello() {

super();

// TODO Auto-generated constructor stub

}

 

 

 

 

 

public static void main(String[] args) {

/* Before this is run, be sure to set up the following in the launch configuration

* (Arguments->VM Arguments) for the correct SWT library path.

* The following is a windows example:

* -Djava.library.path="installation_directory\plugins\org.eclipse.swt.win32_3.0.0\os\win32\x86"

*/

org.eclipse.swt.widgets.Display display = org.eclipse.swt.widgets.Display.getDefault();

FrmHello thisClass = new FrmHello();

thisClass.createSShell() ;

thisClass.sShell.open();

 

 

 

 

 

while (!thisClass.sShell.isDisposed()) {

if (!display.readAndDispatch()) display.sleep ();

}

display.dispose();

}

 

 

 

 

 

/**

* This method initializes sShell

*/

private void createSShell() {

sShell = new org.eclipse.swt.widgets.Shell();

label = new Label(sShell, SWT.NONE);

button = new Button(sShell, SWT.NONE);

textArea = new Text(sShell, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);

sShell.setText("Shell");

sShell.setBackground(org.eclipse.swt.widgets.Display.getDefault().getSystemColor(org.eclipse.swt.SWT.COLOR_TITLE_BACKGROUND_GRADIENT));

label.setBounds(new org.eclipse.swt.graphics.Rectangle(167,5,96,24));

label.setText("Hello World");

label.setBackground(org.eclipse.swt.widgets.Display.getDefault().getSystemColor(org.eclipse.swt.SWT.COLOR_INFO_BACKGROUND));

label.setFont(new org.eclipse.swt.graphics.Font(org.eclipse.swt.widgets.Display.getDefault(), "Times New Roman", 12, org.eclipse.swt.SWT.BOLD));

button.setBounds(new org.eclipse.swt.graphics.Rectangle(152,34,123,24));

button.setText("Click Me");

button.setFont(new org.eclipse.swt.graphics.Font(org.eclipse.swt.widgets.Display.getDefault(), "Times New Roman", 14, org.eclipse.swt.SWT.NORMAL));

textArea.setBounds(new org.eclipse.swt.graphics.Rectangle(64,70,323,123));

sShell.setSize(new org.eclipse.swt.graphics.Point(451,232));

button.addMouseListener(new org.eclipse.swt.events.MouseAdapter() {

public void mouseDown(org.eclipse.swt.events.MouseEvent e) {

System.out.println("mouseDown()"); // TODO Auto-generated Event stub mouseDown()

textArea.setText(textArea.getText() + "|Hello,Eclipse");

}

});

}

}

好了,大功马上告成.  选择运行图标, toolBar 上的绿色按钮旁边的黑下箭头.选择->run.., 选择左侧的java Application 点击下面的新建.  选择中间Main标签页, Project 选择Hello , Main class: 选择test.FrmHello.  点击 run 按钮.

界面出来了…., 以后你就可以直接点击Run图标,运行这个程序.  点击Click Me 看看TextArea的变化

注意:关闭当前窗体用dispose()就可以了,如果要退出程序,就用System.Exit(0),上面的代码是SWT

以下是我自己的一些代码:

public void keyPressed(java.awt.event.KeyEvent e) {   

                    //KeyPress Events

                    FrmLogin frmlogin=new FrmLogin();

                    //以下设置模式窗口

                    //frmlogin.setModal( true);

                    //以下设置窗口位置

                    frmlogin.setLocation(300,100);

                    frmlogin.show();

                    //以下关闭当前窗口

                    dispose();

                    System.out.print("KeyPressed");
              }

上面的这段代码是用来打开一个新窗口,同时关闭当前窗口

//申明一个JFrame

        FrmHello thisClass = new FrmHello();

        thisClass.setLocation(300,100);

        //初始化表结构

        String[] columnName={"职员ID","职员名称"};

        //设置列标题(表头)

        Vector cname=new Vector(2);

        cname.add(columnName[0]);

        cname.add(columnName[1]);

        //DefaultTableMode需要import javax.swing.table.*;

        DefaultTableModel model=new DefaultTableModel(thisClass.srcdata,cname);

        thisClass.jTable.setModel(model);

        //以下是数据库连接过程

        try

        {

            //注册驱动程序

            Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

            //连接到SQL服务器

            Connection conn = DriverManager.getConnection ("jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=pubs","sa","hz0222");

            //查询表

            Statement st;

            st = conn.createStatement();

            ResultSet rs = st.executeQuery("select * from employee");

            //显示数据集到JTable

            while (rs.next()) {

                Vector rowdata=new Vector(2);

                rowdata.add(rs.getString("emp_id"));

                rowdata.add(rs.getString("fname"));

                //将数据加入到容器,也就是加入到JTable

                thisClass.srcdata.add(rowdata);

            }

            //刷新JTable

            thisClass.jTable.repaint() ;

            thisClass.jTable .updateUI() ;

        }

        catch(ClassNotFoundException ex)

        {

            System.err.print("ClassNotFound:"+ex.getMessage() );

        }

        catch(Exception ex1)

        {

            System.err.print("GError:"+ex1.getMessage() );

        }

        thisClass.show() ;

这段代码是用来初始化连接数据库(MSSQL)使用到了JtableVector

以下是它的引用:

//以下代码是使用JDBC必需的

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

//以下是使用Vector必需的

import java.util.*;

//以下是Swing类库

import javax.swing.JDialog;

import javax.swing.table.*;

import javax.swing.JTable;

import javax.swing.JScrollPane;

//以下引用是使用JOptionPane.showMessageDialog(jButton,

                            result,"Application Exit Now",1);

必需的

import javax.swing.JOptionPane;

到此,终于知道在Eclipse中开发类似普通的Windows GUI应用程序了()

选中你的project Hello. 选择新建图标按钮, 上端最左侧的. 选择 Visual Class ,点击Next , Source Folder 是缺省的 project folder, package 填入 test, Name 填入 FrmHello  , 展开左侧的 SWT 选择 Shell, 勾选上 public static void main(String[] args), Constructors from superclass, Inherited abstract methods. 结束.

Eclipse自动启动 VE…. 看看那些窗口比较熟悉.. 出现了可视化编辑窗口.

鼠标移到右侧的Palette(竖着的那个)把 一个Label,一个Button, 一个TextArea 放到shell.

选中Label, 在下侧的Properties属性栏可以进行设置, >text 填入Hello World

选中 Button 在下侧的Properties属性栏可以进行设置, >text 填入Click Me.

选中 Button 右键, events->Add Events . 选择Mouse – MouseAdapter ->mouseDown.  相应的代码自动产生.添加如下代码(蓝色部分)

也可进行其他的风格设置, 但是如果JDK版本不对则不能操作.有错

全部代码:

/*

* Created on 2005-4-20

*

* TODO To change the template for this generated file go to

* Window – Preferences – Java – Code Style – Code Templates

*/

package test;

 

 

 

 

 

import org.eclipse.swt.widgets.Label;

import org.eclipse.swt.SWT;

import org.eclipse.swt.widgets.Button;

import org.eclipse.swt.widgets.Text;

/**

* @author w19284

*

* TODO To change the template for this generated type comment go to

* Window – Preferences – Java – Code Style – Code Templates

*/

public class FrmHello { 

 

 

 

 

 

private org.eclipse.swt.widgets.Shell sShell = null; // @jve:decl-index=0:visual-constraint="41,12"

private Label label = null;

private Button button = null;

private Text textArea = null;

/**

*

*/

public FrmHello() {

super();

// TODO Auto-generated constructor stub

}

 

 

 

 

 

public static void main(String[] args) {

/* Before this is run, be sure to set up the following in the launch configuration

* (Arguments->VM Arguments) for the correct SWT library path.

* The following is a windows example:

* -Djava.library.path="installation_directory\plugins\org.eclipse.swt.win32_3.0.0\os\win32\x86"

*/

org.eclipse.swt.widgets.Display display = org.eclipse.swt.widgets.Display.getDefault();

FrmHello thisClass = new FrmHello();

thisClass.createSShell() ;

thisClass.sShell.open();

 

 

 

 

 

while (!thisClass.sShell.isDisposed()) {

if (!display.readAndDispatch()) display.sleep ();

}

display.dispose();

}

 

 

 

 

 

/**

* This method initializes sShell

*/

private void createSShell() {

sShell = new org.eclipse.swt.widgets.Shell();

label = new Label(sShell, SWT.NONE);

button = new Button(sShell, SWT.NONE);

textArea = new Text(sShell, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);

sShell.setText("Shell");

sShell.setBackground(org.eclipse.swt.widgets.Display.getDefault().getSystemColor(org.eclipse.swt.SWT.COLOR_TITLE_BACKGROUND_GRADIENT));

label.setBounds(new org.eclipse.swt.graphics.Rectangle(167,5,96,24));

label.setText("Hello World");

label.setBackground(org.eclipse.swt.widgets.Display.getDefault().getSystemColor(org.eclipse.swt.SWT.COLOR_INFO_BACKGROUND));

label.setFont(new org.eclipse.swt.graphics.Font(org.eclipse.swt.widgets.Display.getDefault(), "Times New Roman", 12, org.eclipse.swt.SWT.BOLD));

button.setBounds(new org.eclipse.swt.graphics.Rectangle(152,34,123,24));

button.setText("Click Me");

button.setFont(new org.eclipse.swt.graphics.Font(org.eclipse.swt.widgets.Display.getDefault(), "Times New Roman", 14, org.eclipse.swt.SWT.NORMAL));

textArea.setBounds(new org.eclipse.swt.graphics.Rectangle(64,70,323,123));

sShell.setSize(new org.eclipse.swt.graphics.Point(451,232));

button.addMouseListener(new org.eclipse.swt.events.MouseAdapter() {

public void mouseDown(org.eclipse.swt.events.MouseEvent e) {

System.out.println("mouseDown()"); // TODO Auto-generated Event stub mouseDown()

textArea.setText(textArea.getText() + "|Hello,Eclipse");

}

});

}

}

好了,大功马上告成.  选择运行图标, toolBar 上的绿色按钮旁边的黑下箭头.选择->run.., 选择左侧的java Application 点击下面的新建.  选择中间Main标签页, Project 选择Hello , Main class: 选择test.FrmHello.  点击 run 按钮.

界面出来了…., 以后你就可以直接点击Run图标,运行这个程序.  点击Click Me 看看TextArea的变化

注意:关闭当前窗体用dispose()就可以了,如果要退出程序,就用System.Exit(0),上面的代码是SWT

以下是我自己的一些代码:

public void keyPressed(java.awt.event.KeyEvent e) {   

                    //KeyPress Events

                    FrmLogin frmlogin=new FrmLogin();

                    //以下设置模式窗口

                    //frmlogin.setModal( true);

                    //以下设置窗口位置

                    frmlogin.setLocation(300,100);

                    frmlogin.show();

                    //以下关闭当前窗口

                    dispose();

                    System.out.print("KeyPressed");
              }

上面的这段代码是用来打开一个新窗口,同时关闭当前窗口

//申明一个JFrame

        FrmHello thisClass = new FrmHello();

        thisClass.setLocation(300,100);

        //初始化表结构

        String[] columnName={"职员ID","职员名称"};

        //设置列标题(表头)

        Vector cname=new Vector(2);

        cname.add(columnName[0]);

        cname.add(columnName[1]);

        //DefaultTableMode需要import javax.swing.table.*;

        DefaultTableModel model=new DefaultTableModel(thisClass.srcdata,cname);

        thisClass.jTable.setModel(model);

        //以下是数据库连接过程

        try

        {

            //注册驱动程序

            Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

            //连接到SQL服务器

            Connection conn = DriverManager.getConnection ("jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=pubs","sa","hz0222");

            //查询表

            Statement st;

            st = conn.createStatement();

            ResultSet rs = st.executeQuery("select * from employee");

            //显示数据集到JTable

            while (rs.next()) {

                Vector rowdata=new Vector(2);

                rowdata.add(rs.getString("emp_id"));

                rowdata.add(rs.getString("fname"));

                //将数据加入到容器,也就是加入到JTable

                thisClass.srcdata.add(rowdata);

            }

            //刷新JTable

            thisClass.jTable.repaint() ;

            thisClass.jTable .updateUI() ;

        }

        catch(ClassNotFoundException ex)

        {

            System.err.print("ClassNotFound:"+ex.getMessage() );

        }

        catch(Exception ex1)

        {

            System.err.print("GError:"+ex1.getMessage() );

        }

        thisClass.show() ;

这段代码是用来初始化连接数据库(MSSQL)使用到了JtableVector

以下是它的引用:

//以下代码是使用JDBC必需的

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

//以下是使用Vector必需的

import java.util.*;

//以下是Swing类库

import javax.swing.JDialog;

import javax.swing.table.*;

import javax.swing.JTable;

import javax.swing.JScrollPane;

//以下引用是使用JOptionPane.showMessageDialog(jButton,

                            result,"Application Exit Now",1);

必需的

import javax.swing.JOptionPane;

到此,终于知道在Eclipse中开发类似普通的Windows GUI应用程序了()

2006年04月16日

SWT-Designer是一个Eclipse的插件,用来使用SWT开发用户界面,本文将介绍如何破解这个插件。

在网上有SWT-Designer的破解,注册机是swt.designer.pro.2.keygen.zip,是用来注册swt-designer2.x的,但是其他版本,这个注册机就不一定好用。我试验了多个Eclipse,最后终于在Eclipse2.1.3,Eclipse3.0和Eclipse3.1M4上都能使用SWT-Designer3.x。

操作方法: (Eclipse 3.0, Eclipse 3.1的做法与Eclipse 2.1同。)

1、解压swt.designer.pro.2.keygen.zip后,在Eclipse2.1.3(或者Eclipse3.0)目录下找到swt.jar 和swt-win32-2135.dll(依Eclipse版本而定)2个文件,拷贝到swt.ui.bat所在的目录。

2、修改swt.ui.bat,如这样:

start javaw -cp SWTDesigner_2.0.0_Keygen.jar;swt.jar swtdesigner.keygen.SWTUI


3、执行swt.ui.bat


注意修改

Designer Type :WindowBuilder(SWT and Swing)

Version:3.00 (与你的swt-designer的版本同,如:4.2.1)

然后点击“Generate”按钮。

4、下载

http://www.instantiations.com/swt-designer … v3.0.0_for_Eclipse2.1.zip

解压后 \Designer_v3.0.0_for_Eclipse2.1\plugins 拷贝到\eclipse2.1.3\plugins。

5、启动eclipse2.1.3

6、打开window->Preferences->Designer->License ,点击按钮“Registration and Activation”->使用缺省,“Next” ->随便输入 ,“Next”->输入上面注册机生成的序列号和激活键,“Next”->显示Activation is complete.Thank you.“Finish”。
(注册成功了!!!)

7、没有注册的Designer截图是这样的


8、注册成功后Designer截图,不存在提示了。


7、以后把文件C:\Documents and Settings\Administrator\Instantiations.license拷贝到其他版本的Eclipse目录下都可以。

 

我的环境是:

Designer_v4.2.1_for_Eclipse3.1.zip

Eclipse3.1.1

到这里下载下载其他版本的swt-designer: 

http://www.swt-designer.com/ 

至于注册 可用下面破解 http://www.cjsdn.net/user/download/130052/swt.designer.pro.2.keygen.zip

1、解压swt.designer.pro.2.keygen.zip后,在Eclipse3.1.1(或者Eclipse3.0)目录下找到swt.jar 和swt-win32-××××.dll(依Eclipse版本而定)2个文件,拷贝到swt.ui.bat所在的目录。

2、修改swt.ui.bat,如这样:

start javaw -cp SWTDesigner_2.0.0_Keygen.jar;swt.jar swtdesigner.keygen.SWTUI

注意修改

Designer Type :WindowBuilder(SWT and Swing)

Version:4.0.1 (与你的swt-designer的版本同,如:4.0.1)

然后点击“Generate”按钮。

3.启动eclipse2.1.3

4.打开window->Preferences->Designer->License ,点击按钮“Registration and Activation”->使用缺省,“Next” ->随便输入 ,“Next”->输入上面注册机生成的序列号和激活键,“Next”->显示Activation is complete.Thank you.“Finish”。

(注册成功了!!!)

eclispe想必大家都很熟悉了,一般来说,eclipse插件都是安装在plugins目录下。不过这样一来,当安装了许多插件之后,eclipse变的很大,最主要的是不便于更新和管理众多插件。用links方式安装eclipse插件,可以解决这个问题。
   当前配置XP SP1,eclipse3.0.1

   现在假设我的eclipse安装目录是D:\eclipse,待安装插件目录是D:\plug-in ,我将要安装LanguagePackFeature(语言包)、emf-sdo-xsd-SDK、GEF-SDK、Lomboz这四个插件。

   先把这四个插件程序全部放在D:\plug-in目录里,分别解压。如Lomboz3.0.1.zip解压成Lomboz3.0.1目录,这个目录包含一个plugins目录,要先在Lomboz3.0.1目录中新建一个子目录eclipse,然后把plugins目录移动到刚建立的eclipse目录中,即目录结构要是这样的:D:\plug-in\Lomboz3.0.1\eclipse\plugins

   Eclipse 将会到指定的目录下去查找 eclipse\features 目录和eclipse\plugins 目录,看是否有合法的功能部件和(或)插件。也就是说,目标目录必须包含一个 \eclipse 目录。如果找到,附加的功能部件和插件在运行期配置是将是可用的,如果链接文件是在工作区创建之后添加的,附加的功能部件和插件会作为新的配置变更来处理。


    其它压缩文件解压后若已经包含eclipse\plugins目录,则不需要建立eclipse目录。

    然后在 eclipse安装目录D:\eclipse目录中建立一个子目录links,在links目录中建立一个link文件,比如 LanguagePackFeature.link,改文件内容为  path=D:/plug-in/LanguagePackFeature  即这个link文件要对应一个刚解压后的插件目录。

说明:

 1. 插件可以分别安装在多个自定义的目录中。

 2. 一个自定义目录可以安装多个插件。

 3. link文件的文件名及扩展名可以取任意名称,比如ddd.txt,myplugin都可以。

 4. link文件中path=插件目录的path路径分隔要用\\或是/

 5. 在links目录也可以有多个link文件,每个link文件中的path参数都将生效。

 6. 插件目录可以使用相对路径。

   7. 可以在links目录中建立一个子目录,转移暂时不用的插件到此子目录中,加快eclipse启动。

   8.  如果安装后看不到插件,把eclipse 目录下的configuration目录删除,重启即可

相信大家都使用过MSN,QQ这样的即时聊天类软件,对于它们的好友上线提示功能并不陌生吧?从屏幕右下角弹出一个小界面,慢慢上升,最后消失。我们能不能在自已的程序中也做出相同的功能呢?能!笔者现用JAVA和eclipse的SWT用户界面组件实现这个功能。

  什么是SWT呢?

  SWT原来是eclipse项目组为开发eclipse IDE所编写的图形界面API,运行时,其先判断本机是否有相同的界面元素,如果有则直接调用显示,如没有才进行模拟显示。其运行机制使速度比AWT,SWING快很多。

  了解更多请看:http://www.eclipse.org/swt

  编写思路

  先取得用户屏幕大小,用屏幕高度减去popup界面的高度计算出popup界面在屏幕显示的最高位置(当界面移动到此位置时就停止移动)。


Rectangle area = Display.getDefault().getClientArea();
int upPosition = area.height – 100;


  用屏幕高度加上popup界面的高度就计算出popup界面的初始位置(初始化时不可见,然后慢慢上移到upPosition点后停止移动,再显示若干秒后消失)。


int downPosition = area.height + 100;


  移动位置我们用线程实现,当初始化界面后,调用start()方法运行此线程,在线程中循环判断downPosition的大小是否小于upPosition,如果小于的话说明还未到停止的时候,设置popup界面的边框为downPosition,并暂停10毫秒,如果downPosition大于upPosition的,说明popup界面已移动到了最高位置。调用sleep()暂停5秒钟后关闭界面并退出程序。就这么简单,ok, Let’s go! 下面给出整个程序代码:

  描述:

  (Test为主界面,点击上面的button后,调用Popup在右下角显示像MSN和QQ一样的popup界面。)

  图一为源代码中的实现,图二为修改过后的界面(和QQ的有点像吧。)



图一             图二


  源代码:


// Test.java
//主界面,其中只有一个button,当点击时调用Popup在右下角显示像MSN和QQ一样的popup界面。

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Test {

 public static void main(String[] args) {

  final Display display = new Display();
  Shell shell = new Shell();
  shell.setText("aaa");
  shell.setSize(250, 150);

  final Button button = new Button(shell, SWT.NONE);
  button.setBounds(50, 20, 100, 25);
  button.setText("button");
  //监听button的事件,当用户点击时调用Popup类显示popup界面。
  button.addSelectionListener(new SelectionAdapter() {
   public void widgetSelected(SelectionEvent e) {
    //实例化popup类,构造函数为popup界面中出现的提示信息。
    Popup popup = new Popup("您的好友xxx上线了。");
    popup.start();
   }
  });

  shell.open();

  while (!shell.isDisposed()) {
   if (!display.readAndDispatch()) {
    display.sleep();
   }
  }
  display.dispose();
 }
}

// Popup.java
//实现像MSN,QQ一样的好友上线通知popup

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class Popup extends Thread {

 Shell shell;

 protected int moveStep = 2; //每次移动的pixel
 protected int upPosition; //能移动到的最上面坐标
 protected int downPosition; //当前popup的边框坐标
 protected int leftPosition; //popup左边边框坐标 public Popup(final String message) {

 shell = new Shell(SWT.ON_TOP);
 Text text = new Text(shell, SWT.MULTI | SWT.WRAP);
 text.setBounds(10, 20, 180, 80);
 text.setBackground(shell.getBackground());
 text.setText(message);

 //取屏莫大小
 Rectangle area = Display.getDefault().getClientArea();

 upPosition = area.height – 100;//计算出popup界面在屏幕显示的最高位置
 downPosition = area.height + 100;//计算出popup界面的初始位置
 leftPosition = area.width – 180;

 shell.setSize(180, 100);

 //初始化popup位置
 shell.setLocation(leftPosition, downPosition);

 shell.open();

}

public void run() {

 Display display = shell.getDisplay();
 while (true) {
  try {
   Thread.sleep(10);

   //判断当前位置是否小于能出现的最高位置,小于的话就说明还可以向上移动。
   if ((downPosition – moveStep) > upPosition) {
    display.asyncExec(new Runnable() {
     public void run() {
      shell.setLocation(leftPosition, downPosition- moveStep);
      downPosition -= moveStep;
     }
    });
    //此时已经移动到了最高位置,显示5秒钟后,关闭窗口并退出。
   } else {
    Thread.sleep(5000);
    display.asyncExec(new Runnable() {
     public void run() {
      shell.dispose();
     }
    });
   }
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
}
}


  上面的源程序就完成了图一中的功能,读者可以自行修改,让其界面,功能更强大。