《java 程序设计之网络编程 》

42
Java 程程程程程程程程程程程程程程程程程程 程程程程[email protected] 程程程程

Upload: edythe

Post on 17-Mar-2016

89 views

Category:

Documents


6 download

DESCRIPTION

《Java 程序设计之网络编程 》. 教学课件. 重庆大学计算机学院 电子邮件: [email protected]. 第 16 章 Java 安全技术. 主要内容. 16.1 安全基本知识 16.2 Java 的安全模型 16.3 Java 的密码学结构. 16.1 安全基本知识. 攻击,保护 密码学 , 机密性 , 认证 ,证书 完整性 , 认可性 审计和日志 , 安全策略和访问控制. 主要内容. 16.1 安全基本知识 16.2 Java 的安全模型 16.3 Java 的密码学结构. 16.2 Java 的安全模型. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 《Java 程序设计之网络编程 》

《 Java 程序设计之网络编程》

重庆大学计算机学院 电子邮件: [email protected]

教学课件

Page 2: 《Java 程序设计之网络编程 》

第 16 章 Java 安全技术

Page 3: 《Java 程序设计之网络编程 》

主要内容 16.1 安全基本知识 16.2 Java 的安全模型 16.3 Java 的密码学结构

Page 4: 《Java 程序设计之网络编程 》

16.1 安全基本知识 攻击,保护 密码学 ,机密性 ,认证 ,证书 完整性 ,认可性 审计和日志 ,安全策略和访问控制

Page 5: 《Java 程序设计之网络编程 》

主要内容 16.1 安全基本知识 16.2 Java 的安全模型 16.3 Java 的密码学结构

Page 6: 《Java 程序设计之网络编程 》

16.2 Java 的安全模型 安全模型的演化 Java2 安全模型 Java2 的安全划分 应用程序安全性 小程序安全性 J2SDK 安全工具 Java 小程序的安全部署

Page 7: 《Java 程序设计之网络编程 》

最初安全模型为沙箱模型 JVM

Valuable Resources (files,etc)

SandBox

Remote CodeLocal code

为从开放的网络中获取的非信任代码的提供了一个受限制的运行环境。沙箱模型的实质是本地代码对重要的系统资源(如文件系统)有全部的访问权限,而下载的远程代码(例如 Applet )则不被信任并且仅能访问沙箱里提供的有限资源

Page 8: 《Java 程序设计之网络编程 》

JDK 1.1 安全模型 JVM

Valuable Resources (files,etc)

SandBox

Remote CodeLocal code

使用数字签名服务,可以用与 Java 编写的本地程序类似的方式对待可信的 Applet

Page 9: 《Java 程序设计之网络编程 》

JDK1.2 中的新安全体系结构

JVM

Valuable resources(files,etc)

PD PD Sandbox

Security policy

Class loader

Local or remote code

ProtectionDomain 是在策略数据库中指定的,授予 CodeSource 的 Permission 的聚合体。通过 ClassLoader 装入到 JVM 的每个类文件被分配给一个 ProtectionDomain 。

Page 10: 《Java 程序设计之网络编程 》

Java2 安全模型 BootstrapClass files

SystemClass files

UserClass files

Bytecode Verifier

BootstrapClassLoader

SystemClassLoader ClassLoader

SecurityManager Protection Domains

AccessController

Operating System , Hardware

CodeSource(URL,Certificates)

Permissions

keystore

Page 11: 《Java 程序设计之网络编程 》

Java2 安全模型 Java 安全主要建立在 Java 运行时环境的三个方面: ByteCode Verifier (字节码验证器)、 Security Manager (安全管理器)以及 ClassLoader (类装入器)。 代码验证( Bytecode Verifier )

确保所下载的代码被恰当地格式化,字节码(“ Java 虚拟机”指令)没有违反语言或虚拟机的安全限制(如,无非法数据转换),没有执行指针寻址,内部堆栈不能溢出或下溢,以及字节码指令将拥有正确的类型参数。

Page 12: 《Java 程序设计之网络编程 》

安全管理器( SecurityManager ) SecurityManager 在尝试执行文件 I/O 和网络 I/O 、创建新的 ClassLoader 、操作线程或线程组、启动底层平台(操作系统)上的进程、终止“ Java 虚拟机”、将非 Java 库(本机代码)装入到 JVM 、完成某种类型的系统操作以及将某种类型的类装入到 JVM 中时激发运行时访问控制机制。 例如, Java Applet 沙箱严格地将所下载的 Applet 约束到被认为是比较安全的有限的运行环境中。

Page 13: 《Java 程序设计之网络编程 》

权限( Permission ) 一个权限允许代码执行的一个特定的操作,权限可以是特别具体的,也可以是一般化的。 一个权限由三个部分组成:类型,名称和操作。类型是必须的,它是实现了 Permission接口的特定的类

permission java.security.AllPermission; permission java.lang.RuntimePermission "stopThread"; permission java.io.FilePermission "/tmp/foo", "read";

Page 14: 《Java 程序设计之网络编程 》

代码源( Code Sources ) 代码源包含类的从哪里装载的位置信息和对类签名信息。一般情况下,这个位置被表示成一个 URL 。如果代码被签名,那么代码源里面包含了关于签名者的信息。类可以基于代码源被赋予一定的权限。 保护域( Protection Domains )

是赋予代码源的权限的集合。可以通过策略文件定义。

Page 15: 《Java 程序设计之网络编程 》

策略文件( Policy files ) 策略文件是一个控制沙箱的管理元素。 一个策略文件可以包含一个或者多个条目来定义一个保护域。 每个条目是赋予代码源的权限声明。 一般有两个策略文件,一个全局策略文件,一个用户相关策略文件。 全局策略文件影响 Java 虚拟机种的所有的实例。 策略文件是一个文本文件,可以直接进行编辑。也可以用 Java 提供的编辑工具 policyTool 进行编辑。

Page 16: 《Java 程序设计之网络编程 》

密钥库( Keystores ) 通过代码签名可以赋予代码更多的执行自由度。 如果你确信正在执行的代码来自一个可信的组织,你可以允许它访问本地磁盘文件,或者使用打印机等。 被签名的代码依赖于公钥证书,证书被保存在密钥库中。开发者可以使用密钥库中的证书对代码进行签名; 一般用户或者系统管理员可以在执行已签名的代码时参考密钥库发现是谁的签名。

Page 17: 《Java 程序设计之网络编程 》

访问控制器( AccessController ) 访问关键系统资源时,是否允许或者拒绝,具体结果决定于策略文件的配置。 把一段代码标记为具有一定的特权,影响后续的访问判断。 获取当前调用上下文的一个快照,来自不同上下文的访问控制判断可以参照被保存的上下文。 做特殊安全检查

Page 18: 《Java 程序设计之网络编程 》

Java2 的策略配置文件SecurityManager security = System.getSecurityManager(); if (security != null) { security. checkPermission (Permission perm ); }如果这个请求被允许, checkPermission 不返回任何值;如果被拒绝,抛出异常 SecurityException 。 grant signedBy "signer_names", codeBase "URL" { permission permission_class_name "target_name", "action", signedBy "signer_names";};

Page 19: 《Java 程序设计之网络编程 》

应用程序安全性 在不使用 SecurityManager 的情况下 使用 SecurityManager 的情况 修改策略配置文件

Page 20: 《Java 程序设计之网络编程 》

小应用程序安全性通过程序说明在命令行中用 AppletViewer 执行Appletviewer writeFile.html

Page 21: 《Java 程序设计之网络编程 》

J2SDK 安全工具 keytool – 管理密钥库和证书 jarsigner – 产生和验证 Java 签名 policytool – 图形化的方式管理策略文件。

Page 22: 《Java 程序设计之网络编程 》

Keytool 1 )创建公 /私钥对; 2 )发出证书请求到认证权威( CA ) 3 )从认证权威导入证书回复 4)指明属于其他组织的公钥是受信任的。 Keytool目前能够处理符合 X.509 标准的证书。JSSE( Java Secure Socket Extension , JSSE ) 1.0.2 以后的版本可以支持 pkcs12 。

Page 23: 《Java 程序设计之网络编程 》

Keytool 参数 参数 描述

-genkey  产生一个密钥对 ( 一个公钥关联一个私钥 ) 

-import  读取一个证书或者证书链,并存储到密钥库中,同时用一个别名进行标识。-certreq  用 pkcs10产生一个证书签发请求。-export  导出一个和某个别名相关联的证书 -list  打印整个密钥库中的内容,或者打印与某个别名相关联的证书。-storepasswd  修改或指定密钥库的密码-keypasswd  修改或者指定某一个密钥对的访问密码-delete  删除密钥库中的条目。

Page 24: 《Java 程序设计之网络编程 》

KeyTool 应用 D:\>keytool -genkey -alias javafan -keyalg rsa -validity 750 输入 keystore 密码: keystore 您的名字与姓氏是什么? [Unknown]: JavaFan 您的组织单位名称是什么? [Unknown]: Computer Science 您的组织名称是什么? [Unknown]: Chongqing University 您所在的城市或区域名称是什么? [Unknown]: Chongqing 您所在的州或省份名称是什么? [Unknown]: Chongqing 该单位的两字母国家代码是什么 [Unknown]: CN CN=JavaFan, OU=Computer Science, O=Chongqing University, L="Chongqing ", ST=Chon gqing, C=CN 正确吗? [ 否 ]: 是 输入 <javafan>的主密码 (如果和 keystore 密码相同,按回车):

Page 25: 《Java 程序设计之网络编程 》

用 keytool显示证书的内容 D:\> keytool -v -printcert -file javafan.cer Owner: CN=JavaFan, OU=Computer Science, O=Chongqing University, L="Chongqing ",ST=Chongqing, C=CN 发照者: CN=JavaFan, OU=Computer Science, O=Chongqing University, L="Chongqing ", ST=Chongqing, C=CN 序号: 43030437 有效期间: Wed Aug 17 17:32:39 CST 2005 至: Thu Sep 06 17:32:39 CST 2007 认证指纹: MD5: CB:AE:97:24:A9:93:4B:34:E2:3B:95:95:70:E7:70:D5 SHA1 : E3:32:0C:68:24:34:CB:6E:02:BF:ED:E6:D8:C0:29:AE:66:5C:20:DD

Page 26: 《Java 程序设计之网络编程 》

jarsigner Jarsigner 用于给打包后的 Java 程序签名,或者验证签名。 Jarsigner 可以在签名或者验证签名时,访问由 keytool 创建的密钥库。 选项 描述

-storepass  访问密钥库时,指定口令-keypass  指定私钥的保护口令-signedjar  指定需要被签名的 jar 文件 -verify  jar 文件的签名验证 -verbose  控制是否输出签名或者验证过程的详细信息-certs  与 -verify 、 verbose 一起使用,输出包括每个签名证书的信息

Page 27: 《Java 程序设计之网络编程 》

policytool

Java 运行时环境的安全配置文件 {java.home}/lib/security/java.security ( java.home 指安装 Java 运行时环境的目录)中包括两个策略文件: {java.home}/lib/security/java.policy 和 {user.home}/.java.policy ( {user.home}指用户主目录)。 PolicyTool缺省修改第二个文件。

Page 28: 《Java 程序设计之网络编程 》

Java 小程序的安全部署 SimpleScannerApplet 程序检查某个主机上的 TCP端口是否开放,比如用于WWW服务的 80 端口,用于 SMTP 服务的 25 端口等。

Page 29: 《Java 程序设计之网络编程 》

程序运行界面

Page 30: 《Java 程序设计之网络编程 》

制作和部署安全小程序步骤 编制小程序 SimpleScannerApplet 编写 Html 文件 scanner.html 把程序打包成 Jar 文件 获取并安装一个支持RSA 的签名证书。 用该证书对 Jar 文件进行签名 用 sun 的 Html Convert 转换 scanner.html 部署转换后的 html 文件和已经签名的 jar 文件 见程序

Page 31: 《Java 程序设计之网络编程 》

主要内容 16.1 安全基本知识 16.2 Java 的安全模型 16.3 Java 的密码学结构

Page 32: 《Java 程序设计之网络编程 》

16.3 Java 的密码学结构 16.3.1 基本概念 16.3.2 核心类 16.3.3 消息摘要 16.3.4 数字签名 16.3.5 数据加密 /解密

Page 33: 《Java 程序设计之网络编程 》

16.3.1 基本概念 Java 密码学结构设计遵循两个原则: (1) 算法的独立性和可靠性; (2) 实现的独立性和相互作用性。 Java 2 中主要的密码学服务有以下几种:

数字签名、消息摘要、加密 /解密 密钥工厂 密钥库创建与密钥管理 算法参数产生、管理 证书工厂

Page 34: 《Java 程序设计之网络编程 》

JDK5.0提供的密码学服务 可以通过修改 {java.home}/lib/security/java.security文件安装密码学服务提供者。缺省情况下, Java 运行时环境已经安装了下面的提供者:

security.provider.1=sun.security.provider.Sun security.provider.2=sun.security.rsa.SunRsaSign security.provider.3=com.sun.net.ssl.internal.ssl.Provider security.provider.4=com.sun.crypto.provider.SunJCE security.provider.5=sun.security.jgss.SunProvider security.provider.6=com.sun.security.sasl.Provider

见程序

Page 35: 《Java 程序设计之网络编程 》

测试程序import java.security.Provider;import java.security.Security;public class GetProviderInfo {public static void main(String[] args) {Provider[] plist = Security.getProviders();

for (int i = 0; i < plist.length; i++) {System.out.println("[" + (i + 1) + "]-Provider name:"+ plist[i].getName());System.out.println("Provider info:" + plist[i].getInfo());}}

}

Page 36: 《Java 程序设计之网络编程 》

16.3.2 核心类 Security , Provider MessageDigest 类 Signature 类 Key , KeyFactory , KeyPair , KeyPairGenerator SecureRandom

Page 37: 《Java 程序设计之网络编程 》

16.3.3 消息摘要 使用 MD5 算法产生消息摘要 也可以使用 SHA1算法 MessageDigest支持MD5和 SHA消息摘要算法。调用 getInstance()方法选择一个合适的算法;调用 update()方法准备数据输入缓冲区; digest()方法产生消息摘要;摘要的长度取决于所选择的算法。使用 MD5 产生 128 位的摘要,使用 SHA产生 160 位的摘要。

Page 38: 《Java 程序设计之网络编程 》

16.3.4 数字签名 Signature 类支持数字签名, getInstance( )方法选择数字签名的算法。 通过指定参数 SHA1withDSA ,可以在 DSA 数字签名算法中使用 SHA-1产生消息摘要。 如果使用 RSA 数字签名算法,可以用 MD5或者SHA-1产生消息摘要,可以由参数 MD2withRSA, MD5withRSA, SHA1withRSA 确定使用的算法。 见程序

Page 39: 《Java 程序设计之网络编程 》

16.3.5 数据加密 /解密 1. 对称密钥

对称加密使用相同的密钥执行加密和解密操作。目前,安全度最高,使用最广泛地就是 AES加密标准。 对称加密的基本过程是:

根据指定算法生成密钥产生器对象; 产生密钥 生成加密引擎对象 向加密引擎初始化需要加密的数据 执行加密操作

对称解密密的基本过程是: 获取密钥 生成解密引擎对象 向解密引擎初始化需要解密的数据 执行解密操作

见程序

Page 40: 《Java 程序设计之网络编程 》

非对称密钥 非对称密钥体系就是加密和解密用不同的密钥,称为密钥对,一个叫公钥,一个叫私钥。公钥是公开的,任何人都可以访问,私钥是保密的,只有密钥的持有能使用。 最典型和使用最普遍的就是 RSA算法。一般用接收者的公钥加密数据,只有接收者用自己的私钥才可以解密。 主要设计到的类有: KeyPairGenerator 和 Cipher.KeyPairGenerator负责产生密钥对, Cipher 作为执行引擎,具体执行加密和解密操作。

Page 41: 《Java 程序设计之网络编程 》

非对称加密解密过程 一般加密处理过程是:

使用 RSA算法产生密钥对 用公钥初始加密引擎 Cipher 向 Cipher传送数据。 执行加密操作。

解密过程是: 用私钥初始解密引擎 Cipher 向 Cipher传送已加密的数据。 执行解密操作。

见程序

Page 42: 《Java 程序设计之网络编程 》