2007年12月4日星期二

JavaSecurity_007:SAML 介绍 (摘录+整理)

SAML:Secure Assertion Markup Language 安全性断言标记语言。
SAML 是一种基于XML开发的用来在互联网上交换安全信息的框架。它可以实现不同的安全服务系统之间的互操作性,它提供了一种机制使得可以在不同的安全服务系统之间交换认证和授权信息。但它本身并不定义新的认证与授权的机制,它只是定义了用于安全服务之间传输安全信息的交换机制。
目前,SAML主要被用来解决SSO(单点登陆)和Web服务安全问题。
所谓安全性断言,即判定用户身份的语句。断言不容怀疑,无需证明。在SAML中,发布断言的站点叫“源站点”,接收断言并信任该断言的站点叫“ 目标站点”。

由于“目标站点”无条件地信任“源站点”发出的断言,因此必须要保障站点之间的通信安全。SAML使用了SSL和X.509,不仅加密了站点之间的通信,还保证了站点之间的身份验证。

应用场景实例说明
在本示例场景中,用户使用用户名和口令登录源站点。然后,用户希望无需再次验证即可访问目标站点。
第4步中的SAML请求,将使用HTTP SOAP消息格式从目标站点到源站点发送。
发送的消息类似于:

返回的消息类似于:
其中断言部分类似于:
案例发展:为了进一步提高安全性,公司决定使用指纹验证,如果在每个站点都安装同样的指纹验证设备,公司显然要多投资。同时,应用程序提供商不得不权衡提供该支持的成本和不提供该支持可能丢失客户的风险。而通过SAML,只需改变源站点的验证方式,目标站点不做任何改动,目标站点甚至不知道源站点的验证方式改变了,因为断言信息没有发生任何变化。

JavaSecurity_006:SSL 介绍 (摘录+整理)

SSL:Secure Sockets Layer。
SSL是用于对TCP/IP数据流进行加密的协议,同时还包括了身份认证(X.509证书)和数据完整性校验(消息验证码)等内容。
TLS (Transport Layer Security) 也是用于传输层加密的协议,一般认为TLS1.0 与SSL3.1相当。SSL可以用在任何面向连接的通信,用在HTTP上,就是HTTPS。
当我们与一个网站建立https连接时,我们的浏览器与Web Server之间要经过一个握手的过程来完成身份鉴定与密钥交换,从而建立安全连接。具体过程如下:

  1. 用户浏览器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送到服务器。

  2. 服务器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送给浏览器,同时发给浏览器的还有服务器的证书。
    如果配置服务器的SSL需要验证用户身份,还要发出请求要求浏览器提供用户证书。

  3. 客户端检查服务器证书,如果检查失败,提示不能建立SSL连接。如果成功,继续。

  4. 客户端浏览器为本次会话生成pre-master secret,并将其用服务器公钥加密后发送给服务器。

  5. 如果服务器要求鉴别客户身份,客户端还要再对另外一些数据签名后并将其与客户端证书一起发送给服务器。

  6. 如果服务器要求鉴别客户身份,则检查签署客户证书的CA是否可信。
    如果不在信任列表中,结束本次会话。
    如果检查通过,服务器用自己的私钥解密收到的pre-master secret,并用它通过某些算法生成本次会话的master secret。

  7. 客户端与服务器均使用此master secret生成本次会话的会话密钥(对称密钥)。
    在双方SSL握手结束后传递任何消息均使用此会话密钥。
    这样做的主要原因是对称加密比非对称加密的运算量低一个数量级以上,能够显著提高双方会话时的运算速度。

  8. 客户端通知服务器此后发送的消息都使用这个会话密钥进行加密。并通知服务器客户端已经完成本次SSL握手。

  9. 服务器通知客户端此后发送的消息都使用这个会话密钥进行加密。并通知客户端服务器已经完成本次SSL握手。

  10. 本次握手过程结束,会话已经建立。双方使用同一个会话密钥分别对发送以及接受的信息进行加、解密。

参考文献:
1. 《配置Tomcat 4使用SSL
2. 《Java安全性编程指南》第9章 译者 庞南 管和昌 陈立志

JavaSecurity_005:图解Windows系统中安装/卸载CA证书

1. 安装
首先要创建一个自签名的根数字证书,详细步骤参考《keytool 使用指南》中的1. 创建密钥库,3.导出/导入数字证书。之后,步骤如下:
双击.cer文件,显示

“该CA根证书没受信任...”,说明这是一个自签名的根数字证书。

点击“安装证书”

点击“下一步”

选择“根据证书类型,自动选择下一步”

点击“完成”

点击“是(Y)”




2. 卸载步骤
启动IE浏览器,点击“工具”-->“Internet 选项”,选择“内容”选项卡,点击“证书”

选择“受信任的根证书颁发机构”,找到“Ma Ping”,点击“删除”

2007年12月3日星期一

JavaSecurity_004: keytool 使用指南

1. 创建密钥库
密钥库是存放密钥和数字证书的文件。
使用非交互模式创建密钥库如下:
keytool -genkey -dname "CN=Ma Ping,OU=JavaNeverDie,O=Tsinghua University,L=CY,ST=Beijing,C=CN" -alias pma -keyalg RSA -keysize 1024 -keystore pmakeystore -keypass javaneverdie -storepass javaneverdie -validity 365

-dname 参数说明:
CN:Common Name 姓氏名字。
OU:Organization Unit 组织单位名称。
O:Organization 组织名称。
L:Locality 城区名称。
ST:State 省份名称。
C:Country 国家代码。

以上操作创建了一个公钥和一个私钥,同时创建了一个数字证书,证书中包含该公钥和该公钥对应的主体("CN=Ma Ping,OU=JavaNeverDie,O=Tsinghua University,L=CY,ST=Beijing,C=CN")

2. 查看密钥库
keytool -list -v -keystore pmakeystore -storepass javaneverdie
或查看某一条条目:keytool -list -v -keystore pmakeystore -storepass javaneverdie -alias pma
输出如下:

Keystore 类型: jks
Keystore 提供者: SUN

您的 keystore 包含 1 输入

别名名称: pma
创建日期: 2009-6-19
输入类型:KeyEntry
认证链长度: 1
认证 [1]:
Owner: CN=Ma Ping, OU=JavaNeverDie, O=Tsinghua University, L=CY, ST=Beijing, C=CN
发照者: CN=Ma Ping, OU=JavaNeverDie, O=Tsinghua University, L=CY, ST=Beijing, C=CN
序号: 4a3b3ba7
有效期间: Fri Jun 19 15:17:59 CST 2009 至: Sat Jun 19 15:17:59 CST 2010
认证指纹:
MD5: 68:29:7F:C7:F2:E6:61:0B:DE:27:D7:54:C0:B6:06:6C
SHA1: EA:F3:A8:1E:35:FD:24:25:F7:47:08:49:C6:E1:A1:1A:75:23:C1:59


*******************************************
*******************************************

3. 导出/导入数字证书
3.1 导出
keytool -export -keystore pmakeystore -storepass javaneverdie -alias pma -file pma.cer
由于数字证书中不包含私钥,因此不需要条目的密码。
用上面的命令导出的文件是二进制的,不利于公布证书,可以使用参数-rfc(即BASE64编码),将证书内容编码。
keytool -export -keystore pmakeystore -storepass javaneverdie -alias pma -file pma_rfc.cer -rfc
文件内容如下:
-----BEGIN CERTIFICATE-----
MIICWDCCAcECBEo7O6cwDQYJKoZIhvcNAQEEBQAwczELMAkGA1UEBhMCQ04xEDAOBgNVBAgTB0Jl
aWppbmcxCzAJBgNVBAcTAkNZMRwwGgYDVQQKExNUc2luZ2h1YSBVbml2ZXJzaXR5MRUwEwYDVQQL
EwxKYXZhTmV2ZXJEaWUxEDAOBgNVBAMTB01hIFBpbmcwHhcNMDkwNjE5MDcxNzU5WhcNMTAwNjE5
MDcxNzU5WjBzMQswCQYDVQQGEwJDTjEQMA4GA1UECBMHQmVpamluZzELMAkGA1UEBxMCQ1kxHDAa
BgNVBAoTE1RzaW5naHVhIFVuaXZlcnNpdHkxFTATBgNVBAsTDEphdmFOZXZlckRpZTEQMA4GA1UE
AxMHTWEgUGluZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAjds1LLWeN0ceBwIgetR1TEGk
O3BF5JpDPLTgvqRFi07bhYIJ2FFpAE/d8bbEeJ4b7f+6p94VqLGLNuFrbgqobPr4Tk79WZ6jp71e
1jEB0dczJqk860+JkWWCze7mtvr9yqOd7CbegL5GD6An5A5A4lrb6XGQo8b6MDhUeLpOtu0CAwEA
ATANBgkqhkiG9w0BAQQFAAOBgQAt7CUMIv26B1yo23b26LqDMmXn6AiIsc+Fy5XHmppXwDPZ7uw+
lwDPRd9PvtT7wXUQYh6WfGFkIegQWK5JU/H+BflCykVvw1n+umAPYizhq8IW/sygqSPazqClnJOJ
a+phvponaKE8y1jiWdwzq6Muu+tMF0/m0+GZD5Sd1H5dmQ==
-----END CERTIFICATE-----

3.2 导入
首先要把 CA证书导入到密钥库中,然后再把该CA签发的证书导入到同一个密钥库中,构成完整的证书链。
keytool -import -keystore pmakeystore -storepass javaneverdie -alias ca -file ca.cer
keytool -import -keystore pmakeystore -storepass javaneverdie -alias pma -file pma_signed.cer
查看keystore时,会发现条目ca是trustedCertEntry,因为CA证书不包含私钥。
观察CA签发的证书,依然是条目pma(因为公钥前后没有发生改变),但签发者已经变成该CA,而不是原先的自签名。

4. 查看数字证书
keytool -printcert -file pma.cer

5. 删除指定条目/修改指定条目的口令
keytool -delete -keystore pmakeystore -storepass javaneverdie -alias pma
keytool -keypasswd -keystore pmakeystore -storepass javaneverdie -alias pma

问题1:如何向CA申请证书签名
(1)创建自签名的证书
创建过程参考 1. 创建密钥库。
(2)创建Certificate Signing Request(CSR)证书签发请求文件
keytool -certreq -keystore pmakeystore -storepass javaneverdie -alias pma -file pma.csr
由于任何人都可以创建数字证书,要想检查某个数字证书是否真实可靠,需要由权威机构来验证:即权威机构用自己的私钥对证书进行数字签名。
这样的权威机构称为CA(Certification Authorities),如Verisign、Thawte。
(3)访问CA站点,输入申请者信息
http://www.verisign.com,详细步骤略。
最终应该获得该CA的根证书getcacert和该CA签发的证书(从email中拷贝,保存为.cer文件)。
(4)导入该CA的根证书getcacert和该CA签发的证书
导入过程参考 3. 导出/导入数字证书。

2007年12月2日星期日

JavaSecurity_003: 主要安全法案一览 (摘录+整理)

1. Sarbanes-Oxley Act 萨班斯·奥克斯利法案
起源于美国安然公司倒闭后引起的美国股市剧烈动荡,投资人纷纷抽逃资金。为防止和保证上市公司财务丑闻不再发生,由美国参议员Sarbanes 和美国众议员Oxley联合提出了一项法案,该法案即以他们的名字命名。
Sarbanes Oxley主要包括以下几个方面的内容:
(1)成立独立的公众公司会计监察委员会,监管执行公众公司审计职业

(2)要求加强注册会计师的独立性(3)要求加大公司的财务报告责任(4)要求强化财务披露义务
(5)加重了违法行为的处罚措施
(6)增加经费拨款,强化美国证券交易委员会(SEC)的监管职能(7)要求美国审计总署加强调查研
2. Health Insurance Portability and Accountability Act 健康保险携带和责任法案
HIPAA是美国前总统克林顿签署的法案,该法案对多种医疗健康产业都具有规范作用,包括交易规则、医疗服务机构的识别、从业人员的识别、医疗信息安全、医疗隐私、健康计划识别、 第一伤病报告、病人识别等。该法案的主要目标如下:
(1)保证劳动者在转换工作时,其健康保险可以随之转移;
(2)保护病人的病例记录等个人隐私;
(3)促进国家在医疗健康信息安全方面电子传输的统一标准。
HIPAA将安全标准分为四类,以保护信息系统的保密性、一致性和可用性:(1)管理流程(Administrative Procedures) 建立和落实安全策略;(2)物理防护(Physical Safeguards) 描述如何保护计算机系统实体以及相关的环境和设备,免受自然灾害或人为破坏;(3)技术安全服务(Technical Security Services) 描述对数据访问的保护和监控;(4)技术安全机制(Technical Security Mechanisms) 在网络中保护信息和限制数据访问的机制。
对于违反HIPAA安全条例的行为,可以处以最高为25万美元的罚款和最长为10年的监禁。
3. Gramm Leach Bliley Act 格雷姆-里奇-比利雷法
GLB Act就是1999年的金融现代化法案,它是在美国颁布的一项法律,用于控制金融机构处理个人信息的方式,这项法案包括三部分:财产保密条例、安全措 施条例、托辞供应。其中财产保密条例,用于管制对私人财产信息的搜集和泄露;安全措施条例,用于保证财政机构必须实现对私人信息的安全保护;托辞供应用于 禁止使用不正当的托辞访问私人信息。GLB Act还要求金融机构给顾客一个书面的保密协议,以说明他们的信息共享机制。
4. SB-1386 Act 加利福尼亚违反安全信息法
SB-1386指的是加利福尼亚违反安全信息法,它是一部加州州法,要求维护个人信息的组织在个人信息的安全遭到损害时通知个人。这个法案规定,如果包含个人数据的数据库发生了安全突破,相应组织必须通知为其维护信息的每个人。

5.Homeland Security Presidential Directive-12 美国国土安全总统指示12
HSPD-12

参考文献:
1. 《
什么是Sarbanes Oxley

JavaSecurity_002:密码学的基本概念

从古到今,人们为了保护数据想尽了各种各样的办法,所有的办法无非都是要解决以下问题:
当数据从A传到B的时候,需要保证:
(1)数据的保密性:只有B可以读取这个数据。
(2)数据的完整性:B能够确认数据在传输过程中,没有被修改过。以及发生纠纷时,A能够确认B自己是否修改过数据。
(3)数据发送者身份的确定性(数据的不可否认性):B能够确认数据的确是A发送过来的。

1. 古代如何加密数据
常用加密方法:替代和置换/移位。
典型案例:
(1)凯撒密码。
(2)“日升昌”票号的票据防伪。

2. 密钥
一个很长的二进制数,56位即2的56次方。56位已经被破解,128位相对安全些。

3. 对称密钥
加密和解密使用同样的密钥。

3.1 对称密钥的特点
(1)加密算法和解密算法是公开的,协议是安全的。
(2)加密算法足够强大,仅依靠密文不可能译出明文。
(3)安全性依赖于密钥的安全性,而不是算法的安全性。

3.2 对称加密算法:Blowfish、DES、DESede、HmacMD5、HmacSHA1
(1)DES:DES是Data Encryption Standard 数据加密标准。密钥长度为64位,56位有效。
是目前最常用的对称加密算法,但安全性较差。
(2)DESede:改进型DES算法。密钥长度112位或168位。

3.3 对称密钥的缺点
(1)密钥很长,携带不方便,容易被窃取。
(2)如何把密钥从信息提供方A传递给信息接收方B。
(3)密钥的发放数量随着参与者人数的增长而增长,密钥容易流失。

4. 非对称密钥
加密和解密使用不同的密钥。
信息接收方B事先生成一对密钥,一个用于加密,称为公钥,一个用于解密,称为私钥。B将公钥对外公布,不论是谁都可以使用这个公钥,将信息加密发送给B。
由于公钥只能用于加密,而且公钥加密的信息只能用私钥解密,因此不怀好意的人即使知道了公钥也不能解密信息。

4.1 非对称密钥的特点
(1)加密算法和解密算法是公开的,协议是安全的。
(2)加密算法足够强大,仅依靠密文不可能译出明文。
(3)安全性依赖于私钥的安全性,而不是公钥或算法的安全性。
(4)双方不需要事先专门约定用于加密和解密的密钥,解决了密钥分发问题。

4.2 非对称加密算法:RSA、DSA
(1)RSA:由Ron Rivest, Adi Shamir 和Leonard Adleman 在1978年提出了的算法(以此三人姓名的首字母命名)。密钥长度为512~2048位。是目前最常用的非对称加密算法。
(2)DSA:Digital Signature Algorithm 数字签名算法。

4.3 非对称密钥的缺点
(1)运算复杂,速度缓慢。

5. 结合对称密钥和非对称密钥的长处
使用对称密钥加密数据,使用非对称密钥加密对称密钥。
例如:A创建公钥和私钥对,公开公钥;B创建对称密钥,使用A的公钥加密对称密钥,并传递给A;A收到后,使用私钥解密,之后A和B之间就可以使用对称密钥加密数据进行通信了。

6. 使用数据摘要验证数据的完整性
消息摘要:对原始数据按照一定算法计算得到的结果,长度通常固定为16或20个字节。算法可以保证,不同的原始数据,计算出来的结果不同。
因此,消息摘要可以看作是原始数据的指纹。可以用来验证数据在传递过程中是否被篡改。

6.1 数据摘要算法:MD5、SHA
数据摘要算法也是公开的。
(1)MD5:Message-digest Algorithm 5 信息摘要算法。
我们常常在某些软件下载站点的某软件信息中看到其MD5值,它的作用就在于我们可以在下载该软件后,对下载回来的文件用专门的软件(如Windows MD5 Check等)做一次MD5校验,以确保我们获得的文件与该站点提供的文件为同一文件。
在2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5算法的报告,公布了MD系列算法的破解结果。宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。
(2)SHA:Secure Hash Algorithm 安全散列算法。
共有SHA-1、SHA-224、SHA-256、SHA-384 和SHA-512五种变种。
王小云教授又破解了另一国际密码SHA-1。因为SHA-1在美国等国际社会有更加广泛的应用,密码被破的消息一出,在国际社会的反响可谓石破天惊。换句话说,王小云的研究成果表明了从理论上讲电子签名可以伪造,必须及时添加限制条件,或者重新选用更为安全的密码标准,以保证电子商务的安全。

6.2 实际使用中,如何验证数据的完整性?
例如:当A传送数据给B时,同时将数据摘要传递给B;但这还不够,因为窃取者可以修改原始数据,并重新计算数据摘要。为此,需要给数据摘要进行加密,只有A和B拥有加密的密钥(密钥的分发见“5.结合对称密钥和非对称密钥的长处”)。然后,当A传送数据给B时,同时将加密的数据摘要传递给B,B收到后,就可以计算原始数据的数据摘要,然后加密数据摘要,与A传递过来的加密的数据摘要进行对比,从而验证数据的完整性。

7. 使用数字签名确定数据发送者的身份(数据的不可否认性)
数据摘要并不能确定数据是否是A发送过来的,只能确定是某个拥有同样密钥的人发来的。
使用数字签名可以解决这一问题。原理如下:
发送者使用私钥加密数据摘要(谓之数字签名),接收者使用公钥解密以验证签名是否是某个人的。
之所以对数据摘要签名,而不对原始数据签名,因为非对称加密比较慢,既然数据摘要可以唯一的代表原始数据,长度仅有16到20个字节,对它签名是再合适不过了。

8. 使用数字证书确定公钥的所有者身份
使用数字签名可以确定数据发送者的身份,但是有一个前提必须确认:数据接收方所使用的验证签名的公钥的确是数据发送者的。
使用数字证书可以解决这一问题。
数字证书的主要功能是保存公钥和某个主体(个人或机构)的对应关系。

8.1 数字证书的签发
每个人都可以创建数字证书,宣称某个公钥是某个人或机构所拥有的。用户收到这样的证书时,需要辨别其真伪。这就需要有一个权威的认证中心来帮助我们检查证书的真伪,这个权威中心就是CA (Certification Authorities),例如:Versign、Thawte。在我们的操作系统中,已经安装了这些CA的证书。
鉴定的过程是这样的:CA检查某数字证书,确定可信后,用CA的私钥在证书上签名。用户收到这样的证书后,用CA的公钥进行验证。

参考文献:
1. 《Java安全性编程实例》 徐迎晓 编著。

2007年12月1日星期六

JavaSecurity_001:从“日升昌”票号的票据防伪谈起

自从有了纸币和战争,如何保护数据的安全就成了一个问题。(顺便说一句,《货币战争》我看了,很震惊书里所披露的内容,几乎闻所未闻,这个话题容空再表。)
在计算机出现以前,密码学其实已经成了一门单独的学问。何谓“密码学”,我不是这方面专家,不能给出精确定义,让我们还是从“日升昌”票号的票据防伪谈起吧。
“日升昌”票号采用了一系列的票据防伪方法。
1. 票据采用特殊的纸张,统一的格式。
2. 票据采用了水印技术。
3. 书写票据人固定,笔迹也随之固定。
4. 加盖骑缝章。
5. 密字
(1)“谨防假票冒取,勿忘细视书章”对应12个月。
(2)“堪笑世情薄,天道最公平,昧心图自利,阴谋害他人,善恶终有报,到头必分明”对应一个月中30天。
(3)“生客多察看,斟酌而后行”对应“一二三四五六七八九十”。
(4)“国宝流通”,对应“万千百十”。
(5)为了更加保险,额外增加一个自用密字:“盘查奸诈智,庶几保安守。”
例如:正月一日汇银一千两,在票后附记“谨堪生盘”四个字。
这些密字过一段时间就要更换。
6. 三联单。把一票分为“票根”、“汇票”、“存根”三联。“票根”经由国家邮政系统寄到汇到地分号,待取款人取款时用于核对;“汇票”交给汇款人作为取款依据;“存根”由汇出地票号自存。

所有汇票一经兑付,立即销毁。所以迄今为止,只有一张日升昌票号1860年的汇票存世。