精华内容
下载资源
问答
  • Java安全组成

    千次阅读 2019-07-27 18:36:27
    Java安全组成:JCA(Java机密体系结构 Java Cryptography Architecture)JCE(Java 加密扩展包 Java Cryptography Extension)JSSE(Java 安全套接字扩展包 Java Secure Sockets Extension)JAAS(Java鉴别与安全...

    Java安全领域由4个部分组成:JCA(Java机密体系结构 Java Cryptography Architecture)、JCE(Java 加密扩展包 Java Cryptography Extension)、JSSE(Java 安全套接字扩展包 Java Secure Sockets Extension)、JAAS(Java鉴别与安全服务 Java Authentication and Authenication Serivce)。
    1、JCA提供基本的加密框架,如证书、数字签名、消息摘要和密钥对产生器。
    2、JCE在JCA的基础上作了扩展,提供了各种加密算法、消息摘要算法和密钥管理等功能。我们已经了解的DES算法、AES算法、RSA算法、DSA算法等就是通过JCE来提供的。有关JCE的实现主要在javax.crypto包(及其子包)中。
    3、JSSE提供了基于SSL(安全套接字层 Secure Sockets Layer)的加密功能。在网络的传输过程中,信息会经过多个主机(很有可能其中一台就被窃听),最终传送给接收者,这是不安全的。这种确保网络通信安全的服务就是由JSSE来提供的。
    4、JAAS提供了在Java平台上进行用户身份鉴别的功能。如何提供一个符合标准安全机制的登录模块,通过可配置的方式集成至各个系统中呢?这是由JAAS来提供的。
    JCA和JCE是Java平台提供的用于安全和加密服务的两组API。它们并不执行任何算法,它们只是连接应用和实际算法实现程序的一组接口。软件开发商可以根据JCE接口(又称安全提供者接口)将各种算法实现后,打包成一个Provider(安全提供者),动态地加载到Java运行环境中。
    根据美国出口限制规定,JCA可出口(JCA和SUN的一些默认实现包含在Java发行版中),但JCE对部分国家是限制出口的。因此,要实现一个完整的安全结构,就需要一个或多个第三方厂商提供的JCE产品,称为安全提供者。BouncyCastle JCE就是其中的一个安全提供者。

    JCA(Java机密体系结构 Java Cryptography Architecture)

    JCA参考链接

    JCE(Java 加密扩展包 Java Cryptography Extension)

    JSSE(Java 安全套接字扩展包 Java Secure Sockets Extension)

    JSSE:使用JDK的以外的扩展包需要修改资源文件并增加相关的内容,这是使用JDK以外的扩展包的方式之一

    JAAS(Java鉴别与安全服务 Java Authentication and Authenication Serivce

    JDK提供的相关的包,类
    Java.security–消息摘要
    javax.crypto–安全消息摘要,消息认证码
    java.net.sll–安全套接字
    第三方提供的Java扩展
    Bouncy Castle
    两种支持方案:配置,调用。
    Commons Codec
    Base64,二进制,十进制,字符集编码
    Url编码/解码



    OSI安全体系介绍

    OSI是Open SystemInterconnect的缩写,意为开放式系统互联。国际标准组织(国际标准化组织)制定了OSI模型。这个模型把网络通信的工作分为7层,分别是物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。1至4层被认为是低层,这些层与数据移动密切相关。5至7层是高层,包含应用程序级的数据。每一层负责一项具体的工作,然后把数据传送到下一层。

    第一层-物理层

    (也即OSI模型中的第一层)在课堂上经常是被忽略的。它看起来似乎很简单。但是,这一层的某些方面有时需要特别留意。物理层实际上就是布线、光纤、网卡和其它用来把两台网络通信设备连接在一起的东西。甚至一个信鸽也可以被认为是一个1层设备。网络故障的排除经常涉及到1层问题。我们不能忘记用五类线在整个一层楼进行连接的传奇故事。由于办公室的椅子经常从电缆线上压过,导致网络连接出现断断续续的情况。遗憾的是,这种故障是很常见的,而且排除这种故障需要耗费很长时间。

    第二层-数据链路层

    运行以太网等协议。请记住,我们要使这个问题简单一些。第2层中最重要的是你应该理解网桥是什么。交换机可以看成网桥,人们现在都这样称呼它。网桥都在2层工作,仅关注以太网上的MAC地址。如果你在谈论有关MAC地址、交换机或者网卡和驱动程序,你就是在第2层的范畴。集线器属于第1层的领域,因为它们只是电子设备,没有2层的知识。第2层的相关问题在本网络讲座中有自己的一部分,因此现在先不详细讨论这个问题的细节。现在只需要知道第2层把数据帧转换成二进制位供1层处理就可以了。

    第三层-网络层

    在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点,确保数据及时传送。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息–源站点和目的站点地址的网络地址。

    如果你在谈论一个IP地址,那么你是在处理第3层的问题,这是“数据包”问题,而不是第2层的“帧”。IP是第3层问题的一部分,此外还有一些路由协议和地址解析协议(ARP)。有关路由的一切事情都在第3层处理。地址解析和路由是3层的重要目的。

    第四层-传输层

    第4层的数据单元也称作数据包(packets)。但是,当你谈论TCP等具体的协议时又有特殊的叫法,TCP的数据单元称为段(segments)而UDP协议的数据单元称为“数据报(datagrams)”。这个层负责获取全部信息,因此,它必须跟踪数据单元碎片、乱序到达的数据包和其它在传输过程中可能发生的危险。理解第4层的另一种方法是,第4层提供端对端的通信管理。像TCP等一些协议非常善于保证通信的可靠性。有些协议并不在乎一些数据包是否丢失,UDP协议就是一个主要例子。

    第五层-会话层

    这一层也可以称为会晤层或对话层,在会话层及以上的高层次中,数据传送的单位不再另外命名,统称为报文。会话层不参与具体的传输,它提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制。如服务器验证用户登录便是由会话层完成的。

    第六层-表示层

    这一层主要解决拥护信息的语法表示问题。它将欲交换的数据从适合于某一用户的抽象语法,转换为适合于OSI系统内部使用的传送语法。即提供格式化的表示和转换数据服务。数据的压缩和解压缩,加密和解密等工作都由表示层负责。

    第七层-应用层

    第7层也称作“应用层”,是专门用于应用程序的。应用层确定进程之间通信的性质以满足用户需要以及提供网络与用户应用软件之间的接口服务如果你的程序需要一种具体格式的数据,你可以发明一些你希望能够把数据发送到目的地的格式,并且创建一个第7层协议。SMTP、DNS和FTP都是7层协议。

    学习OSI模型中最重要的事情是它实际代表什么意思。

    假如你是一个网络上的操作系统。在1层和2层工作的网卡将通知你什么时候有数据到达。驱动程序处理2层帧的出口,通过它你可以得到一个发亮和闪光的3层数据包(希望是如此)。作为操作系统,你将调用一些常用的应用程序处理3层数据。如果这个数据是从下面发上来的,你知道那是发给你的数据包,或者那是一个广播数据包(除非你同时也是一个路由器,不过,暂时不用担心这个问题)。如果你决定保留这个数据包,你将打开它,并且取出4层数据包。如果它是TCP协议,这个TCP子系统将被调用并打开这个数据包,然后把这个7层数据发送给在目标端口等待的应用程序。这个过程就结束了。

    当要对网络上的其它计算机做出回应的时候,每一件事情都以相反的顺序发生。7层应用程序将把数据发送给TCP协议的执行者。然后,TCP协议在这些数据中加入额外的文件头。在这个方向上,数据每前进一步体积都要大一些。TCP协议在IP协议中加入一个合法的TCP字段。然后,IP协议把这个数据包交给以太网。以太网再把这个数据作为一个以太网帧发送给驱动程序。然后,这个数据通过了这个网络。这条线路中的路由器将部分地分解这个数据包以获得3层文件头,以便确定这个数据包应该发送到哪里。如果这个数据包的目的地是本地以太网子网,这个操作系统将代替路由器为计算机进行地址解析,并且把数据直接发送给主机。

    OSI安全体系


    OSI七层网络模型与TCP/IP四层网络模型关系图:
    TCP/IP安全体系
    安全服务和安全机制
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190727180400270.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTIwNTE0OA==,size_16,color_FFFFFF,t

    八类安全机制如下:

    1. 加密机制:加密机制对应数据保密性服务。加密是提高数据安全性的最简便方法。通过对数据进行加密,有效提高了数据的保密性,能防止数据在传输过程中被窃取。常用的加密算法有对称加密算法(例如DES算法)和非对称加密算法(如RSA算法)。
    2. 数字签名机制:数字签名机制对应认证(鉴别)服务。数字签名是有效的鉴别方法,利用数字签名计数可以实施用户身份认证和消息认证,它具有解决手法双方纠纷的能力,是认证(鉴别)服务最核心的技术。在数字签名技术的基础之上,为了鉴别软件的有效性,有产生了代码签名技术。常用的签名算法有RSA算法和DSA算法等等
    3. 访问控制机制:访问控制机制对应访问控制服务。通过预先设定的规则对用户所访问的数据进行限制。通常情况下,首先是通过用户的用户名和口令进行验证,其次是通过用户角色、用户组等规则进行验证,最后用户才能访问相应的限制资源。一般的应用常使用基于用户角色的访问控制方式。
    4. 数据完整性机制:数据完整性机制对应数据完整性服务。数据完整性的作用是为了避免数据在传输过程中受到干扰,同时防止数据在传输过程中被褚篡改,以提高数据传输完整性。通常可以使用单向加密算法对数据加密,生成唯一验证码,用以校验数据完整性。常用的加密算法有MD5和SHA
    5. 认证机制:认证机制对应认证(鉴别)服务。认证的目的在于验证接收方所接收到的数据是否来源于所期望的发送方,通常可以使用数字签名来进行验证。常用算法有RSA算法和DSA算法等。
    6. 业务流填充机制:也称为传输填充机制。业务流填充机制对应数据保密性服务。业务流填充机制通过在数据传输过程中传输随机数的方式,混淆真实的数据,加大数据破解的难度,提高数据的保密性。
    7. 路由控制机制:路由访问机制对应访问控制服务。路由控制机制为数据发送方选择安全网络通信路径,避免发送方使用不安全路径发送数据,提高数据的安全性。
    8. 公证机制:公证机制对应抗否认性服务。公证机制的作用在于解决收发双方的纠纷问题,确保两方利益不受损害。类似于显示生活中,合同双方签署合同的同时,需要将合同的第三份交由第三方公证机构进行公证。

    展开全文
  • Java安全中文版

    热门讨论 2012-07-05 11:44:12
    Java安全》中文版第二版PDF,Java Security,Second Edition 本书系《Java安全》第二版,内容涉及安全管理器、类装载器、存取控制器以及java.security包等。此外还讨论了消息摘要、证书和数字签名,并介绍了如何...
  • Java进阶(三)Java安全通信:HTTPS与SSL

    万次阅读 2015-04-18 19:25:00
    通过一个系统,接触到了Java安全机制,故作一小节,供朋友们参考学习。

        通过一个系统,接触到了Java安全机制,故作一小节,供朋友们参考学习。

     

    1. HTTPS概念

            1)简介   

            HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

     

          2)HTTPS和HTTP的区别

      a. https协议需要到ca申请证书,一般免费证书很少,需要交费。

      b. http是超文本传输协议,信息是明文传输;https 则是具有安全性的ssl加密传输协议。

      c. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

           d. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

     

          3)HTTPS的作用

     

          它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

      a. 一般意义上的https,就是服务器有一个证书。主要目的是保证服务器就是他声称的服务器,这个跟第一点一样;服务端和客户端之间的所有通讯,都是加密的。

      b. 具体讲,是客户端产生一个对称的密钥,通过服务器的证书来交换密钥,即一般意义上的握手过程。

      c. 接下来所有的信息往来就都是加密的。第三方即使截获,也没有任何意义,因为他没有密钥,当然篡改也就没有什么意义了。

      d.少许对客户端有要求的情况下,会要求客户端也必须有一个证书。

    这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码,还有一个CA 认证过的身份。因为个人证书一般来说是别人无法模拟的,所有这样能够更深的确认自己的身份。目前少数个人银行的专业版是这种做法,具体证书可能是拿U盘(即U盾)作为一个备份的载体。

     

    2.SSL简介

      1)简介

      SSL (Secure Socket Layer)为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。

     

      2)SSL提供的服务

      a.认证用户和服务器,确保数据发送到正确的客户机和服务器

      b.加密数据以防止数据中途被窃取

      c.维护数据的完整性,确保数据在传输过程中不被改变。

     

      3) SSL协议的握手过程

      SSL 协议既用到了公钥加密技术又用到了对称加密技术,对称加密技术虽然比公钥加密技术的速度快,可是公钥加密技术提供了更好的身份认证技术。SSL 的握手协议非常有效的让客户和服务器之间完成相互之间的身份认证,其主要过程如下:

      ①客户端的浏览器向服务器传送客户端SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。

      ②服务器向客户端传送SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。

      ③客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。

      ④用户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后传给服务器。

      ⑤服务器用私钥解密“对称密码”(此处的公钥和私钥是相互关联的,公钥加密的数据只能用私钥解密,私钥只在服务器端保留。详细请参看: http://zh.wikipedia.org/wiki/RSA%E7%AE%97%E6%B3%95),然后用其作为服务器和客户端的“通话密码”加解密通讯。同时在SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。

      ⑥客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤⑤中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。

      ⑦服务器向客户端发出信息,指明后面的数据通讯将使用的步骤⑤中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。

      ⑧SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。

     

    3.配置服务器端证书

      为了能实施SSL,一个web服务器对每个接受安全连接的外部接口(IP 地址)必须要有相应的证书(Certificate)。关于这个设计的理论是一个服务器必须提供某种合理的保证以证明这个服务器的主人就是你所认为的那个人。这个证书要陈述与这个网站相关联的公司,以及这个网站的所有者或系统管理员的一些基本联系信息。

      这个证书由所有人以密码方式签字,其他人非常难伪造。对于进行电子商务(e-commerce)的网站,或其他身份认证至关重要的任何商业交易,认证书要向大家所熟知的认证权威(Certificate Authority (CA))如VeriSign或Thawte来购买。这样的证书可用电子技术证明属实。实际上,认证权威单位会担保它发出的认证书的真实性,如果你信任发出认证书的认证权威单位的话,你就可以相信这个认证书是有效的。

      关于权威证书的申请,请参考:http://www.cnblogs.com/mikespook/archive/2004/12/22/80591.aspx

      在许多情况下,认证并不是真正使人担忧的事。系统管理员或许只想要保证被服务器传送和接收的数据是秘密的,不会被连接线上的偷窃者盗窃到。庆幸的是,Java提供相对简单的被称为keytool的命令行工具,可以简单地产生“自己签名”的证书。自己签名的证书只是用户产生的证书,没有正式在大家所熟知的认证权威那里注册过,因此不能确保它的真实性。但却能保证数据传输的安全性。

      用Tomcat来配置SSL主要有下面这么两大步骤:

     

      1)生成证书

      a. 在命令行下执行:

      %Java_home%\bin\keytool -genkey -alias tomcat -keyalg RSA

      在此命令中,keytool是JDK自带的产生证书的工具。把RSA运算法则作为主要安全运算法则,这保证了与其它服务器和组件的兼容性。

    这个命令会在用户的home directory产生一个叫做" .keystore " 的新文件。在执行后,你首先被要求出示keystore密码。Tomcat使用的默认密码是" changeit "(全都是小写字母),如果你愿意,你可以指定你自己的密码。你还需要在server.xml配置文件里指定自己的密码,这在以后会有描述。

      b .你会被要求出示关于这个认证书的一般性信息,如公司,联系人名称,等等。这些信息会显示给那些试图访问你程序里安全网页的用户,以确保这里提供的信息与他们期望的相对应。

      c.你会被要求出示密钥(key)密码,也就是这个认证书所特有的密码(与其它的储存在同一个keystore文件里的认证书不同)。你必须在这里使用与keystore密码相同的密码。(目前,keytool会提示你按ENTER键会自动帮你做这些)。

      如果一切顺利,你现在就拥有了一个可以被你的服务器使用的有认证书的keystore文件。

     

      2) 配置tomcat

      第二个大步骤是把secure socket配置在$CATALINA_HOME/conf/server.xml文件里。$CATALINA_HOME代表安装Tomcat的目录。一个例子是SSL连接器的元素被包括在和Tomcat一起安装的缺省server.xml文件里。它看起来象是这样:

    $CATALINA_HOME/conf/server.xml

     

    < -- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->

     

    < !--

     

    < Connector

     

    port="8443" minProcessors="5" maxProcessors="75"

     

    enableLookups="true" disableUploadTimeout="true"

     

    acceptCount="100" debug="0" scheme="https" secure="true";

     

    clientAuth="false" sslProtocol="TLS"/>

     

    -->

      Connector元素本身,其默认形式是被注释掉的(commented out),所以需要把它周围的注释标志删除掉。然后,可以根据需要客户化(自己设置)特定的属性。一般需要增加一下keystoreFile和keystorePass两个属性,指定你存放证书的路径(如:keystoreFile="C:/.keystore")和刚才设置的密码(如:keystorePass="123456")。关于其它各种选项的详细信息,可查阅Server Configuration Reference。

      在完成这些配置更改后,必须象重新启动Tomcat,然后你就可以通过SSL访问Tomcat支持的任何web应用程序。只不过指令需要像下面这样:https://localhost:8443

     

    4.客户端代码实现

     

      在Java中要访问Https链接时,会用到一个关键类HttpsURLConnection;参见如下实现代码:

     

            // 创建URL对象

            URL myURL = new URL("https://www.sun.com");

     

            // 创建HttpsURLConnection对象,并设置其SSLSocketFactory对象

            HttpsURLConnection httpsConn = (HttpsURLConnection) myURL.openConnection();

     

            // 取得该连接的输入流,以读取响应内容

            InputStreamReader insr = new InputStreamReader(httpsConn.getInputStream());

     

            // 读取服务器的响应内容并显示

            int respInt = insr.read();

            while (respInt != -1) {

                System.out.print((char) respInt);

                respInt = insr.read();

            }

     

      在取得connection的时候和正常浏览器访问一样,仍然会验证服务端的证书是否被信任(权威机构发行或者被权威机构签名);如果服务端证书不被信任,则默认的实现就会有问题,一般来说,用SunJSSE会抛如下异常信息:

     

    ?

    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building 

    ?

    failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

      上面提到SunJSSE,JSSE(Java Secure Socket Extension)是实现Internet安全通信的一系列包的集合。它是一个SSL和TLS的纯Java实现,可以透明地提供数据加密、服务器认证、信息完整性等功能,可以使我们像使用普通的套接字一样使用JSSE建立的安全套接字。JSSE是一个开放的标准,不只是Sun公司才能实现一个SunJSSE,事实上其他公司有自己实现的JSSE,然后通过JCA就可以在JVM中使用。

      关于JSSE的详细信息参考官网Reference:http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html;

      以及Java Security Guide:http://java.sun.com/j2se/1.5.0/docs/guide/security/;

     

      在深入了解JSSE之前,需要了解一个有关Java安全的概念:客户端的TrustStore文件。客户端的TrustStore文件中保存着被客户端所信任的服务器的证书信息。客户端在进行SSL连接时,JSSE将根据这个文件中的证书决定是否信任服务器端的证书。在SunJSSE中,有一个信任管理器类负责决定是否信任远端的证书,这个类有如下的处理规则:

    1)若系统属性javax.net.sll.trustStore指定了TrustStore文件,那么信任管理器就去jre安装路径下的lib/security/目录中寻找并使用这个文件来检查证书。

    2)若该系统属性没有指定TrustStore文件,它就会去jre安装路径下寻找默认的TrustStore文件,这个文件的相对路径为:lib/security/jssecacerts。

    3)若jssecacerts不存在,但是cacerts存在(它随J2SDK一起发行,含有数量有限的可信任的基本证书),那么这个默认的TrustStore文件就是lib/security/cacerts。

     

      那遇到这种情况,怎么处理呢?有以下两种方案:

      1)按照以上信任管理器的规则,将服务端的公钥导入到jssecacerts,或者是在系统属性中设置要加载的trustStore文件的路径;证书导入可以用如下命令:keytool -import -file src_cer_file –keystore dest_cer_store;至于证书可以通过浏览器导出获得;

      2)、实现自己的证书信任管理器类,比如MyX509TrustManager,该类必须实现X509TrustManager接口中的三个method;然后在HttpsURLConnection中加载自定义的类,可以参见如下两个代码片段,其一为自定义证书信任管理器,其二为connect时的代码:

     

     

    package test;
    import java.io.FileInputStream;
    import java.security.KeyStore;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.TrustManagerFactory;
    import javax.net.ssl.X509TrustManager;
    public class MyX509TrustManager implements X509TrustManager {
        /*
         * The default X509TrustManager returned by SunX509.  We'll delegate
         * decisions to it, and fall back to the logic in this class if the
         * default X509TrustManager doesn't trust it.
         */
        X509TrustManager sunJSSEX509TrustManager;
        MyX509TrustManager() throws Exception {
            // create a "default" JSSE X509TrustManager.
            KeyStore ks = KeyStore.getInstance("JKS");
            ks.load(new FileInputStream("trustedCerts"),
                "passphrase".toCharArray());
            TrustManagerFactory tmf =
            TrustManagerFactory.getInstance("SunX509", "SunJSSE");
            tmf.init(ks);
            TrustManager tms [] = tmf.getTrustManagers();
            /*
             * Iterate over the returned trustmanagers, look
             * for an instance of X509TrustManager.  If found,
             * use that as our "default" trust manager.
             */
            for (int i = 0; i < tms.length; i++) {
                if (tms[i] instanceof X509TrustManager) {
                    sunJSSEX509TrustManager = (X509TrustManager) tms[i];
                    return;
                }
            }
            /*
             * Find some other way to initialize, or else we have to fail the
             * constructor.
             */
            throw new Exception("Couldn't initialize");
        }
        /*
         * Delegate to the default trust manager.
         */
        public void checkClientTrusted(X509Certificate[] chain, String authType)
                    throws CertificateException {
            try {
                sunJSSEX509TrustManager.checkClientTrusted(chain, authType);
            } catch (CertificateException excep) {
                // do any special handling here, or rethrow exception.
            }
        }
        /*
         * Delegate to the default trust manager.
         */
        public void checkServerTrusted(X509Certificate[] chain, String authType)
                    throws CertificateException {
            try {
                sunJSSEX509TrustManager.checkServerTrusted(chain, authType);
            } catch (CertificateException excep) {
                /*
                 * Possibly pop up a dialog box asking whether to trust the
                 * cert chain.
                 */
            }
        }
        /*
         * Merely pass this through.
         */
        public X509Certificate[] getAcceptedIssuers() {
            return sunJSSEX509TrustManager.getAcceptedIssuers();
        }
    }
            <span style="color:#3333ff;">// 创建SSLContext对象,并使用我们指定的信任管理器初始化</span>
            TrustManager[] tm = { new MyX509TrustManager() };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            <span style="color:#3333ff;">// 从上述SSLContext对象中得到SSLSocketFactory对象</span>
            SSLSocketFactory ssf = sslContext.getSocketFactory();
            <span style="color:#3333ff;">// 创建URL对象</span>
            URL myURL = new URL("https://ebanks.gdb.com.cn/sperbank/perbankLogin.jsp");
            <span style="background-color: rgb(255, 255, 255);"><span style="color:#3333ff;">// 创建HttpsURLConnection对象,并设置其SSLSocketFactory对象</span></span>
            HttpsURLConnection httpsConn = (HttpsURLConnection) myURL.openConnection();
            httpsConn.setSSLSocketFactory(ssf);
            <span style="color:#3333ff;">// 取得该连接的输入流,以读取响应内容</span>
            InputStreamReader insr = new InputStreamReader(httpsConn.getInputStream());
           <span style="color:#3333ff;"> // 读取服务器的响应内容并显示</span>
            int respInt = insr.read();
            while (respInt != -1) {
                System.out.print((char) respInt);
                respInt = insr.read();
            }

     

     

     

    对于以上两种实现方式,各有各的优点,第一种方式不会破坏JSSE的安全性,但是要手工导入证书,如果服务器很多,那每台服务器的JRE都必须做相同的操作;第二种方式灵活性更高,但是要小心实现,否则可能会留下安全隐患;

     

      参考文献:        

      http://baike.baidu.com/view/14121.htm

     

      http://zh.wikipedia.org/wiki/RSA%E7%AE%97%E6%B3%95

     

      http://blog.csdn.net/sfdev/article/details/2957240

     

      http://blog.csdn.net/cyberexp2008/article/details/6695691

     

    展开全文
  • Java安全架构概览

    万次阅读 2018-01-30 15:38:42
    介绍 Java平台在设计的时候就着重与安全方面,在Java核心设计中,Java语言本身就是类型安全的,并且提供了自动垃圾收集机制,用于增强代码的健壮性,类在加载时...随着平台的成长以及部署范围的扩展,Java安全体系结

    介绍

    Java平台在设计的时候就着重与安全方面,在Java核心设计中,Java语言本身就是类型安全的,并且提供了自动垃圾收集机制,用于增强代码的健壮性,类在加载时需要被验证,用于保证只有合法的Java代码会被执行。

    初始的Java平台创建了一个安全的运行环境,用于执行那些可能不被信任的代码,例如从公共网络上下载下来的Java applets。随着平台的成长以及部署范围的扩展,Java安全体系结构也相应地演变为支持日益增长的一系列服务的集合。到今天,该架构已经是包含了一系列API,工具,常用算法实现,原型以及协议的巨大集合,为开发这提供了全面的用于编写应用的安全框架,也为用户和管理者提供了管理安全应用的工具集合。

    Java安全API涉及的范围很广,加密和公钥基础设施(PKI)接口为开发安全应用程序提供了基础。用于执行身份验证和访问控制的接口使应用程序能够防止未经授权访问受保护的资源。

    API允许算法和其他多个安全服务实现互操作性,服务采用Providers实现,Provider通过标准的接口接入Java平台,这使得应用程序很容易获得安全服务,而不必知道任何有关它们的实现细节。这使开发人员可以专注于如何将安全性集成到应用程序中,而不是如何实际的实现复杂的安全机制。

    Java语言安全性和字节码验证

    Java语言被设计为类型安全且易于使用。它提供了自动内存管理,垃圾收集和对数组的范围检查。这减少了开发人员的整体编程负担,产生更少的细微编程错误,以及更安全,更健壮的代码。另外,Java语言定义了可以分配给Java类,方法和字段的不同访问修饰符,使开发人员能够根据需要限制对其类实现的访问。具体来说,该语言定义了四个不同的访问级别:private,protected,public,如果没有指定,默认为包级别的访问。public被允许给任何人公开访问。 private限制性最强,不允许私有成员(例如方法)之外的任何人访问。 protected修饰符允许访问同一包中的其他类及其任何子类。 包级访问只允许访问相同包中的类。

    编译器将Java程序翻译成与机器无关的字节码表示。运行时会调用字节码验证器来确保在Java运行时中只执行合法的字节码。检查字节码是否符合Java语言规范,并且不要违反Java语言规则或命名空间限制。验证器还检查内存管理违规行为,堆栈下溢或溢出以及非法数据类型转换。一旦这些字节码得到验证,Java运行时就准备好执行这些字节码。

    基础安全架构

    Java平台定义了一系列覆盖主要安全领域的API,包括密码学,公共密钥基础设施,认证,安全通信和访问控制。这些API允许开发人员将安全性轻松集成到应用程序代码中。 他们是围绕以下原则设计的:

    实现独立性
    应用程序不需要自己实现安全性。 相反,他们可以从Java平台请求安全服务。安全服务在Provider(见下文)中实现,通过标准接口接入Java平台。 应用程序可能依靠多个独立的提供者来提供安全功能。
    实现互操作性
    Provider可以跨应用程序进行互操作。 具体而言,应用程序不绑定到特定的提供者,而提供者也不绑定到特定的应用程序。
    算法可扩展性
    Java平台包含许多内置的Provider,这些Provider实现了当今广泛使用的一组基本的安全服务。但是,一些应用程序可能依赖尚未实施的新兴标准或专有服务。 Java平台支持安装实现这些服务的定制提供程序。

    安全提供者

    java.security.Provider 类在Java平台中封装了安全提供者的概念。它指定提供者的名字并列出它实现的安全服务。可以同时配置多个提供程序,并按优先顺序列出。当应用请求安全服务时,选择实现该服务的最高优先级提供者。

    应用程序依靠相关的getInstance方法从底层提供者获取安全服务。例如,消息摘要创建表示提供者可用的一种服务类型。(第4节讨论消息摘要和其他加密服务。)应用程序调用java.security.MessageDigest类中的getInstance方法来获取特定消息摘要算法(如SHA-256)的实现。

    MessageDigest md = MessageDigest.getInstance("SHA-256");

    程序可以通过指定Provider名称来选择性地从特定提供者请求实现,如下所示:

    MessageDigest md = MessageDigest.getInstance("SHA-256", "ProviderC");

    图1和图2说明了用于请求SHA-256消息摘要实现的这些选项。这两张图都显示了三个实现消息摘要算法的Provider。 Provider按照优先顺序从左至右排列(1-3)。 在图1中,应用程序请求SHA-256算法实现而不指定提供者名称。 提供程序按优先顺序搜索,并返回提供该特定算法ProviderB的第一个提供程序的实现。 在图2中,应用程序请求来自特定提供者ProviderC的SHA-256算法实现。 这次,即使具有更高优先顺序的提供者ProviderB也提供了SHA-256实现,但是仍然将返回ProviderC的实现。
    图1 图1 自动搜索Provider

    图2图2 指定特定的Provider

    Oracle的Java平台实现包括许多预先配置的默认提供程序,这些提供程序实现了可供应用程序使用的一组基本安全服务。请注意,Java平台的其他供应商可能会实现封装了基于厂商特定的安全服务。当本文提到内置的默认Provider时,指的是Oracle实现那些Provider。

    以下关于各种安全领域(密码学,认证等)的章节都包括对默认提供者提供的相关服务的描述。 附录C中的表格总结了所有的默认提供者。

    安全配置文件位置

    本文提到的Java安全性的某些方面(包括提供者的配置)可以通过设置安全属性来定制。您可以在安全属性文件中静态设置安全性属性,默认情况下是安装Java™运行时环境(JRE)的目录的lib / security目录中的java.security文件。安全属性也可以通过调用Security类的适当方法(在java.security包中)动态设置。

    本文提到的工具和命令都在〜jre / bin目录中,其中〜jre代表安装JRE的目录。 第5节中提到的cacerts文件在〜jre / lib / security中。

    加解密

    Java密码体系结构是访问和开发Java平台的密码功能的框架。 它包括各种加密服务的API,包括:

    • 消息摘要算法
    • 数字签名算法
    • 对称批量加密
    • 对称流加密
    • 不对称加密
    • 基于密码的加密(PBE)
    • 椭圆曲线密码(ECC)
    • 密钥协商算法
    • 密钥生成器
    • 消息认证码(MAC)
    • (伪)随机数发生器

    出于历史(出口控制)的原因,加密API被组织成两个不同的包。java.security包中包含不受导出控制的类(如Signature和MessageDigest)。 javax.crypto包中包含受控于导出控制的类(如Cipher和KeyAgreement)。

    加解密接口是基于Provider的,允许多个互操作的密码实现。 一些Provider可以用软件执行密码操作; 其他人可以在硬件令牌上执行操作(例如,在智能卡设备上或在硬件密码加速器上)。实现了那些出口限制服务的Provider必须进行数字签名。

    Java平台包括许多最常用的密码算法(包括RSA,DSA和ECDSA签名算法,AES加密算法,SHA-2消息摘要算法和Diffie-Hellman(DH))的内置提供程序。 和椭圆曲线Diffie-Hellman(ECDH)密钥协商算法。大多数内置提供程序都使用Java代码实现加密算法。

    Java平台还包含一个内置提供程序,它作为使用本地PKCS#11(v2.x)的Token。 这个名为SunPKCS11的Provider允许Java应用程序无缝访问兼容于PKCS#11的加密服务。

    在Windows上,Java平台包含一个内置的提供程序,可以充当本地Microsoft CryptoAPI的桥梁。 这个名为SunMSCAPI的Provider允许Java应用程序通过CryptoAPI在Windows上无缝访问加密服务。

    公钥基础设置PKI

    公钥基础设施(PKI)是一个用于框架的术语,该框架能够基于公钥密码术实现安全的信息交换。它允许将身份(人员,组织等)绑定到数字证书,并提供验证证书真实性的方法。 PKI包括密钥,证书,公共密钥加密以及生成和数字签名证书的可信证书颁发机构(CA)。Java平台包括对X.509数字证书和证书撤销列表(CRL)的Provider支持的API,以及符合PKIX的认证路径构建和验证。 与PKI相关的类位于java.security和java.security.cert包中。

    密钥和证书存储

    Java平台通过密钥和证书存储Provider提供密钥和证书的长期持久存储。 具体而言,java.security.KeyStore类表示密钥库,加密密钥和/或可信证书的安全存储库(例如,在证书路径验证期间使用)以及java.security.cert.CertStore类表示 一个证书存储区,一个公共的证书库和和潜在的不受信任的证书库通常是不相关的。 CertStore也可以存储CRL。

    KeyStore和CertStore的实现需要按类型区分。 Java平台包括标准的PKCS11和PKCS12密钥存储类型(它的实现符合RSA的PKCS规范)。它还包含一个称为JKS(代表“Java Key Store”)专用的基于文件的密钥存储类型和一个称为DKS(“Domain Key Store”)的类型,在密钥库集合中代表单独的逻辑密钥库。

    Java平台包含一个特殊的内置JKS密钥存储区cacerts,它包含许多用于众所周知的可信CA的证书。 keytool实用程序能够列出包含在cacerts中的证书(请参阅第10节中的安全功能文档链接)。

    在“加解密”部分(第4节)中提到的SunPKCS11提供程序包含一个PKCS11 KeyStore实现。这意味着位于安全硬件(如智能卡)中的密钥和证书可以通过KeyStore API被Java应用程序访问和使用。请注意,智能卡密钥可能不允许离开设备。 在这种情况下,由KeyStore API返回的java.security.Key对象引用可能仅仅是对键的引用(也就是说,它不包含实际的密钥材料)。 这样的密钥对象只能用于在实际密钥所在的设备上执行密码操作。

    Java平台还包括LDAP证书存储类型(用于访问存储在LDAP目录中的证书)以及位于内存中的证书存储类型集合(用于访问由java.util.Collection对象管理的证书)。

    PKI工具

    有两个内置工具可用于处理密钥,证书和密钥存储区
    keytool 用于创建和管理密钥库. 它可以做到:

    • 创建公钥/私钥对
    • 显示,导入和导出作为文件存储的X.509 v1,v2和v3证书
    • 创建自签名证书
    • 颁发证书(PKCS#10)请求发送到CA
    • 根据证书请求创建证书
    • 导入证书回复(从CA发送证书请求获得)
    • 指定公钥证书为可信
    • 接受密码并将其作为密钥安全地存储

    jarsigner工具用于对JAR文件进行签名,或者对已签名的JAR文件进行签名验证。Java ARchive(JAR)文件格式允许将多个文件捆绑到一个文件中。 通常,JAR文件包含与应用程序相关的类文件和辅助资源。 当你想要对代码进行数字签名时,首先使用keytool来生成或导入适当的密钥和证书到密钥存储区(如果它们不存在的话),然后使用jar工具将代码放入JAR文件中,最后使用 jarsigner工具来签署JAR文件。jarsigner工具访问密钥库以查找签署JAR文件或验证签名JAR文件签名所需的任何密钥和证书。 注意:jarsigner可以选择性地生成包含时间戳的签名。 验证JAR文件签名的系统(例如Java插件)可以检查时间戳并接受签名证书有效时签名的JAR文件,但不是要求证书是最新的。 (证书通常每年到期,期望JAR文件创建者每年重新签署已部署的JAR文件的证书是不合理的。)

    认证

    认证是确定用户身份的过程。 在Java运行时环境的上下文中,识别正在执行的Java程序的用户是一个过程。 在某些情况下,这个过程可能依赖于“加解密”部分(第4节)中描述的服务。

    Java平台提供的API使应用程序可以通过可插入登录模块执行用户身份验证。 应用程序调用LoginContext类(在javax.security.auth.login包中),后者又引用一个配置。 该配置指定要使用哪个登录模块(javax.security.auth.spi.LoginModule接口的实现)来执行实际身份验证。

    由于应用程序只与标准的LoginContext API对话,因此它们可以独立于底层的插件模块。 可以为应用程序插入新的或更新的模块,而无需修改应用程序本身。 图3说明了应用程序和底层登录模块之间的独立性:
    图3身份验证登录模块插入身份验证框架
    图3 身份验证登录模块接入身份验证框架

    需要注意的是,虽然登录模块是可插入的组件,可以配置到Java平台中,但是它们不是通过安全提供程序插入的。 因此,他们不遵循第3节中描述的提供者搜索模型。相反,如上图所示,登录模块是通过自己独特的配置进行管理的。

    Java平台提供了以下内置的LoginModule,全部在com.sun.security.auth.module包中:

    • Krb5LoginModule:使用Kerberos协议进行身份验证
    • JndiLoginModule:使用LDAP或NIS数据库进行用户名/密码认证
    • KeyStoreLoginModule:用于登录到任何类型的密钥库,包括PKCS#11密钥库token

    在建立两个对等体之间的安全通信信道的过程中也可以实现认证。 Java平台提供了许多标准通信协议的实现,将在下一节讨论。

    安全通信

    通过网络传播的数据可以被不是预期收件人的人访问。当数据包括密码和信用卡号码等私人信息时,必须采取措施使数据对未授权方不可理解。确保您将数据发送给适当的参与方也很重要,并且在运输过程中数据没有被有意或无意地修改。

    SSL/TLS

    Java平台提供SSL和TLS协议的API实现,其中包括数据加密,消息完整性,服务器身份验证和可选的客户端身份验证功能。 应用程序可以使用SSL / TLS来通过任何应用程序协议(例如TCP / IP之上的HTTP)在两个对等点之间提供数据的安全通道。

    javax.net.ssl.SSLSocket类表示一个网络套接字,它在正常的流套接字(java.net.Socket)之上封装了SSL / TLS支持。 某些应用程序可能希望使用备用数据传输抽象(例如New-I / O)。 javax.net.ssl.SSLEngine类可用于生成和使用SSL / TLS数据包。

    Java平台还包括支持可插拔(基于Provider)密钥管理器和信任管理器概念的API。 密钥管理器由javax.net.ssl.KeyManager类封装,并管理用于执行身份验证的密钥。 TrustManager类(在同一个包中)封装了一个信任管理器,并根据它所管理的密钥库中的证书决定要信任的人。

    Java平台包含一个实现SSL / TLS协议的内置提供程序:

    • SSLv3
    • TLSv1
    • TLSv1.1
    • TLSv1.2

    SASL

    简单身份验证和安全层(SASL)是一种Internet标准,用于指定客户端和服务器应用程序之间的身份验证和可选安全层的协议。 SASL定义了如何交换认证数据,但是本身不指定数据的内容。 这是一个框架,指定可用的认证数据的内容和语义的特定认证机制。 因特网社区为各种安全级别和部署方案定义了许多标准的SASL机制。

    Java SASL API为使用SASL机制的应用程序定义了类和接口。 它被定义为中立的机制; 使用API的应用程序不需要硬连线到使用任何特定的SASL机制。 应用程序可以根据所需的安全功能选择使用的机制。 该API支持客户端和服务器应用程序。 javax.security.sasl.Sasl类用于创建SaslClient和SaslServer对象。

    提供程序包中提供了SASL机制实现。 每个Provider可以支持一个或多个SASL机制,并通过标准Provider架构进行注册和调用。

    Java平台包含一个实现以下SASL机制的内置提供程序:

    • CRAM-MD5,DIGEST-MD5,EXTERNAL,GSSAPI,NTLM和PLAIN客户端机制
    • CRAM-MD5,DIGEST-MD5,GSSAPI和NTLM服务器机制

    GSS-API 和 Kerberos

    Java平台包含一个具有通用安全服务应用程序编程接口(GSS-API)的Java语言实现的API。 GSS-API为应用程序员提供了在各种底层安全机制上对安全服务的统一访问。 Java GSS-API当前需要使用Kerberos v5机制,而Java平台包含此机制的内置实现。 目前,无法插入其他机制。 注意:第6节中提到的Krb5LoginModule可以与GSS Kerberos机制一起使用。

    Java平台还包含简单和受保护的GSSAPI协商机制(SPNEGO)GSS-API机制的内置实现。

    在两个应用程序可以使用Java GSS-API在它们之间安全地交换消息之前,它们必须建立一个联合安全上下文。 上下文封装了可能包括例如密码密钥的共享状态信息。 这两个应用程序都创建并使用org.ietf.jgss.GSSContext对象来建立和维护构成安全上下文的共享信息。 一旦建立了安全上下文,它就可以用来准备安全的交换消息。

    Java GSS API位于org.ietf.jgss包中。 Java平台还定义了基本的Kerberos类,如位于javax.security.auth.KerberosPrincipal, KerberosTicket, KerberosKey, and KeyTab in the kerberos package.

    访问控制

    Java平台中的访问控制体系结构保护对敏感资源(例如本地文件)或敏感应用程序代码(例如,类中的方法)的访问。 所有的访问控制决策都由一个安全管理器来调度,由java.lang.SecurityManager类表示。 SecurityManager必须安装到Java运行时才能激活访问控制检查。

    Java小应用程序和Java™Web Start应用程序会在安装了SecurityManager的情况下自动运行。 但是,通过java命令执行的本地应用程序默认情况下不会在安装SecurityManager的情况下运行。 为了使用SecurityManager运行本地应用程序,应用程序本身必须通过setSecurityManager方法(在java.lang.System类中)以编程方式设置一个应用程序,或者必须在命令行上使用-Djava.security.manager参数调用命令。

    权限

    当Java代码被类加载器加载到Java运行时时,类加载器会自动将以下信息与该代码关联:

    • 代码从哪里加载
    • 谁签署了代码(如果有的话)
    • 授予代码的默认权限

    无论代码是通过不可信网络(例如,小应用程序)下载还是从文件系统(例如,本地应用程序)加载,该信息都与代码相关联。 加载代码的位置由URL表示,代码签名者由签名者的证书链表示,默认权限由java.security.Permission对象表示。

    自动授予下载代码的默认权限包括将网络连接返回到源自其的主机的能力。 自动授予从本地文件系统加载的代码的默认权限包括从它所来自的目录以及该目录的子目录中读取文件的能力。

    请注意,执行代码的用户身份在class加载时不可用。 如有必要,应用程序代码负责验证最终用户(例如,如第6节所述)。 用户通过身份验证后,应用程序可以通过调用javax.security.auth.Subject类中的doAs方法将该用户与正在执行的代码进行动态关联。

    策略

    如前所述,类加载器为代码授予有限的一组默认权限。 管理员可以通过安全策略灵活地管理额外的代码权限。

    Java平台将安全策略的概念封装在java.security.Policy类中。 在任何给定的时间,只有一个Policy对象安装到Java运行时。 Policy对象的基本职责是确定是否允许访问受保护的资源进行编码(以从何处加载,谁签名以及谁执行它为特征)。 策略对象如何做出这个决定是依赖于实现的。 例如,它可能会咨询包含授权数据的数据库,或者可能会联系其他服务。

    Java平台包含一个默认的Policy实现,它从安全属性文件中配置的一个或多个ASCII(UTF-8)文件中读取授权数据。 这些策略文件包含授予代码的确切权限集合:具体而言,授予从特定位置加载的代码的确切权限集,由特定实体签名并作为特定用户执行。 每个文件中的策略条目必须符合文档化的专有语法,并且可以通过简单的文本编辑器或图形化policytool实用程序进行组合。

    访问控制增强

    Java运行时跟踪程序执行时产生的Java调用堆栈。 当请求访问受保护的资源时,将默认评估整个调用堆栈,以确定是否允许请求的访问。

    如前所述,资源受到SecurityManager的保护。 Java平台和应用程序中对安全敏感的代码通过以下代码保护对资源的访问:

    SecurityManager sm = System.getSecurityManager();
    if (sm != null) {
       sm.checkPermission(perm);
    }

    其中perm是与请求的访问对应的Permission对象。 例如,如果试图读取文件/ tmp / abc,则权限可以如下构造:

    Permission perm = new java.io.FilePermission("/tmp/abc", "read");

    SecurityManager的默认实现将其决定委托给java.security.AccessController实现。 AccessController遍历调用堆栈,并将所请求的权限(例如上面的示例中的FilePermission)与所安装的安全策略中的每个代码元素一起传递给堆栈。 策略根据管理员配置的权限确定是否授予请求的访问权限。 如果访问不被授予,AccessController抛出一个java.lang.SecurityException。

    图4说明了访问控制的执行。 在这个特定的例子中,最初有两个元素在调用栈ClassA和ClassB上。 ClassA调用ClassB中的方法,然后通过创建java.io.FileInputStream的实例来尝试访问文件/ tmp / abc。 FileInputStream构造函数创建一个FilePermission,如上所示,然后将Perm传递给SecurityManager的checkPermission方法。 在这种情况下,只需要检查ClassA和ClassB的权限,所以包括FileInputStream,SecurityManager和AccessController在内的所有系统代码都会自动获得所有权限。

    在这个例子中,ClassA和ClassB具有不同的代码特征 - 它们来自不同的位置并具有不同的签名者。 每个人都可能被授予不同的权限。 如果策略指示两个类都已被授予所需的FilePermission,则AccessController仅授予访问所请求的文件的权限。
    资源访问控制 图4 资源访问控制

    XML签名

    Java XML数字签名API是用于生成和验证XML签名的标准Java API。

    XML签名可以应用于任何类型的数据,XML或二进制数据(请参阅http://www.w3.org/TR/xmldsig-core/)。 结果签名用XML表示。 XML签名可用于保护您的数据并提供数据完整性,消息身份验证和签名者身份验证。

    该API旨在支持W3C XML签名语法和处理推荐标准的所有必需或推荐功能。 该API是可扩展和可插入的,并基于Java加密服务提供程序架构。

    Java XML数字签名API包含六个包:

    • javax.xml.crypto
    • javax.xml.crypto.dsig
    • javax.xml.crypto.dsig.keyinfo
    • javax.xml.crypto.dsig.spec
    • javax.xml.crypto.dom
    • javax.xml.crypto.dsig.dom

    更多相关信息

    其他Java安全性文档可以在网上找到Java SE Security或者是在这本书中。

    注意:从历史上看,随着新类型的安全服务被添加到Java平台(有时最初作为扩展),各种缩写词被用来指代它们。 由于这些首字母缩略词在Java安全性文档中仍在使用,下面解释它们代表的内容:JSSE(Java™安全套接字扩展)是指第7节中描述的SSL相关服务,JCE(Java™密码扩展) 指的是加密服务(第4节),JAAS(Java™认证和授权服务)分别是指在第6节和第8节中介绍的身份验证和基于用户的访问控制服务。

    附录A 类摘要

    表1总结了本文提到的Java安全类和接口的名称,包和用法。

    类/接口名用法
    com.sun.security.auth.moduleJndiLoginModule使用LDAP或NIS执行用户名/密码认证
    com.sun.security.auth.moduleKeyStoreLoginModule根据密钥库登录进行验证
    com.sun.security.auth.moduleKrb5LoginModule使用Kerberos协议执行身份验证
    java.langSecurityException指示安全违规
    java.langSecurityManager管理所有访问控制决定
    java.langSystem安装SecurityManager
    java.securityAccessController默认调用SecurityManager实现访问控制决策
    java.securityDomainLoadStoreParameter存储域密钥库(DKS)的参数
    java.securityKey表示加密密钥
    java.securityKeyStore表示密钥和可信证书的存储库
    java.securityMessageDigest代表消息摘要
    java.securityPermission代表对特定资源的访问
    java.securityPKCS12Attribute支持PKCS12密钥库中的属性
    java.securityPolicy封装安全策略
    java.securityProvider封装安全服务实现
    java.securitySecurity管理安全提供者和安全属性
    java.securitySignature创建并验证数字签名
    java.security.certCertificate代表公钥证书
    java.security.certCertStore代表不相关且通常不受信任的证书的存储库
    java.security.certCRL代表CRL
    javax.cryptoCipher执行加密和解密
    javax.cryptoKeyAgreement执行密钥交换
    javax.net.sslKeyManager管理用于执行SSL / TLS身份验证的密钥
    javax.net.sslSSLEngine生成/使用SSL / TLS数据包,允许应用程序自由选择传输机制
    javax.net.sslSSLSocket表示一个网络套接字,它在正常的流套接字之上封装SSL / TLS支持
    javax.net.sslTrustManager决定谁要信任SSL / TLS交互(例如,基于密钥存储区中的可信证书)
    javax.security.authSubject代表一个用户
    javax.security.auth.kerberosKerberosPrincipal代表Kerberos主体
    javax.security.auth.kerberosKerberosTicket代表Kerberos凭据
    javax.security.auth.kerberosKerberosKey代表Kerberos密钥
    javax.security.auth.kerberosKerberosTab表示Kerberos密钥表文件
    javax.security.auth.loginLoginContext支持可插拔的身份验证
    javax.security.auth.spiLoginModule实现一个特定的认证机制
    javax.security.saslSasl创建SaslClient和SaslServer对象
    javax.security.saslSaslClient作为客户端执行SASL身份验证
    javax.security.saslSaslServer作为服务器执行SASL认证
    org.ietf.jgssGSSContext封装GSS-API安全上下文,并通过上下文提供可用的安全服务

    附录B 工具摘要

    表2总结了本文提到的工具。

    工具用法
    jar创建Java归档(JAR)文件
    jarsigner在JAR文件上签名并验证签名
    keytool创建和管理密钥库
    policytool创建和编辑策略文件以用于默认策略实施

    Windows平台上还有三个与Java平台相关的与Kerberos相关的工具。 这些功能自动成为Solaris和Linux操作环境的相同名称的工具提供。
    表3总结了Kerberos工具。

    工具用法
    kinit获取并缓存Kerberos票证授予票据
    klist列出本地Kerberos凭证缓存和密钥表中的条目
    ktab管理存储在本地Kerberos密钥表中的名称和服务密钥

    附录C 内置Provider

    Oracle的Java平台实现包括许多内置的提供程序包。 有关详细信息,请参阅Java™ Cryptography Architecture Oracle Providers Documentation.

    展开全文
  • Java Error 应用程序已被Java安全阻止

    千次阅读 2019-02-09 12:26:45
    Java Error 应用程序已被Java安全阻止
                   

    我的Java版本是Java 8 Update 31打开Oracle E-Business Suite报Java安全性错误:

    错误内容:
    应用程序已被Java安全阻止

    出于安全原因,应用程序现在必须满足“高”或“非常高”安全设置的要求或属于“例外站点”列表的一部分才能允许运行。
    原因:您的安全设置已阻止自签名的应用程序运行


    解决方法:
    Java版本8,可以将此应用程序的 URL 添加到“例外站点”列表,该列表位于 Java 控制面板的“安全”选项卡下,将此应用程序 URL 添加到该列表将允许它在显示某些安全警告后运行。Java版本7的话,可以调整Java安全级别到“中”。然后关闭IE,重新试试。


    参考
     


               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • 本节课程是为后续Java代码审计课程的铺垫课程,本节课程中详细介绍了什么是Java安全代码审计、Java代码审计需要的前置知识等介绍性的内容,同时也给大家介绍了一款专门用于Java代码审计的扫描工具Fortify,该工具在...
  • Java安全管理器——SecurityManager

    千次阅读 2014-08-11 20:11:18
    总的来说,Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性;二是Java语言开发的应用程序的安全性。由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我们考虑。其中第二个...
  • Java Error: 应用程序已被Java安全阻止

    万次阅读 2015-03-02 14:18:45
    我的Java版本是Java 8 Update 31打开Oracle E-Business Suite报Java安全性错误:错误内容:应用程序已被Java安全阻止出于安全原因,应用程序现在必须满足“高”或“非常高”安全设置的要求或属于“例外站点”列表的...
  • Java安全之认证与授权

    万次阅读 2016-10-17 08:57:07
    Java安全之认证与授权Java平台提供的认证与授权服务(Java Authentication and Authorization Service (JAAS)),能够控制代码对敏感或关键资源的访问,例如文件系统,网络服务,系统属性访问等,加强代码的安全性。...
  • java程序是跨平台的,可以运行在windows也可以运行在linux。但是平台不同,平台中的文件权限也是不同的。...本文主要讲讲linux下面的文件的权限和安全性问题,并且探讨一下如何在java程序中考虑文件的安全性。
  • Java安全性编程指南.pdf

    热门讨论 2008-09-11 09:28:54
    Java安全性编程指南.pdf系统介绍java有关安全、加密算法以及详细的实现方法
  • java安全管理器SecurityManager入门

    千次阅读 2017-11-05 08:19:20
     这是一篇对Java安全管理器入门的文章,目的是简单了解什么是SecurityManager,对管理器进行简单配置,解决简单问题。  比如在阅读源码的时候,发现这样的代码,想了解是做什么的: SecurityManager security ...
  • java安全编码指南之:基础篇

    万次阅读 2020-08-25 09:54:28
    作为一个程序员,只是写出好用的代码是不够的,我们还需要考虑到程序的安全性。在这个不能跟陌生人说话世界,扶老奶奶过马路都是一件很困难的事情。...所以,安全很重要,今天本文将会探讨一下java中的安全编码指南。
  • java安全沙箱机制介绍

    千次阅读 2015-01-02 19:58:23
    java安全沙箱机制介绍 组成Java沙箱的基本组件如下: ·类加载体系结构 ·class文件检验器 ·内置于Java虚拟机(及语言)的安全特性 ·安全管理器及Java API Java安全模型的前三个部分——类加载体系...
  • Java安全

    千次阅读 2017-12-07 10:21:53
    Java为什么安全?  现今互联网环境中存在各种各种潜在的威胁,所以对于计算机来说,安全特别重要,尤其是当从网络中下载程序并在本地执行的时候;举个例子,Java applets,当通过浏览器访问嵌有这种小java应用的网页...
  • 应用程序已被 Java 安全阻止

    千次阅读 2019-02-20 16:42:27
    1.在使用IE过程中,遇到这样错误,“应用程序已被 Java 安全阻止”: 2.解决办法,打开控制面板,点击程序: 3.点击【Java(32位)】: 4.进入【Java控制面板】的【安全】选项卡,点击【编辑站点列表】: 5...
  • java安全编码指南之:死锁dead lock

    万次阅读 2020-10-01 08:44:36
    java中为了保证共享数据的安全性,我们引入了锁的机制。有了锁就有可能产生死锁。 死锁的原因就是多个线程锁住了对方所需要的资源,然后现有的资源又没有释放,从而导致循环等待的情况。 通常来说如果不同的线程对...
  • java安全性编程

    千次阅读 2014-10-12 09:41:08
    java安全性编程其实也是略带了点防御性编程的意思在里面,其实java作为一门编程语言,相对C,c++,本身算比较安全的,跟C,C++这种偏底层的编程语言比,java少了显示的指针调用,少了程序上的内存释放,回收,这些...
  • java安全编码指南之:声明和初始化

    万次阅读 2020-09-06 08:56:11
    java对象和字段的初始化过程中会遇到哪些安全性问题呢?一起来看看吧。 初始化顺序 根据JLS(Java Language Specification)中的定义,class在初始化过程中,需要同时初始化class中定义的静态初始化程序和在该类中...
  • 1.定义当类被加载到虚拟机中,校验器检查通过,Java平台的第二种安全机制就会启动,这个机制就是安全管理器,它是控制具体操作是否允许执行的操作。它的安全策略建立了...2.Java平台安全性 java安全管理器这里主...
  •    Java安全模式的重点在于保护最终用户不受从网上下载的破坏性程序的干扰。为达到这个目的,Java提供了一个专用的运行Java程序的沙箱。Java程序在它的沙箱内可做任何事情,但出此边界就不
  • Java安全框架—Shiro

    万次阅读 2010-01-26 18:24:00
    Apache 的孵化器项目Shiro其前身是JSecurity,是一个强大,灵活的java安全框架。用于简洁地处理身份验证,授权,企业多个系统会话管理,加密服务等。  其系统框架如下: Shiro的目标是成为一个最全面的,也是最...
  • java安全编码指南之:Mutability可变性

    万次阅读 2020-09-03 09:20:15
    mutable(可变)和immutable(不可变)对象是我们在java程序编写的过程中经常会使用到的。 可变类型对象就是说,对象在创建之后,其内部的数据可能会被修改。所以它的安全性没有保证。 而不可变类型对象就是说,对象...
  • java安全编码指南之:输入注入injection

    万次阅读 热门讨论 2020-10-12 09:03:44
    注入问题是安全中一个非常常见的问题,今天我们来探讨一下java中的SQL注入和XML注入的防范。
  • java安全编码指南之:对象构建

    万次阅读 2020-09-01 09:29:59
    使用flag变量 使用this或者super 简介 程序员肯定是不缺对象的,因为随时都可以构建一个,对象多了肯定会出现点安全问题,一起来看看在java的对象构建中怎么保证对象的安全性吧。 构造函数的异常 考虑下面的一个例子...
  • java安全编码指南之:方法编写指南

    万次阅读 2020-10-08 09:05:50
    java程序的逻辑是由一个个的方法组成的,而在编写方法的过程中,我们也需要遵守一定的安全规则,比如方法的参数进行校验,不要在assert中添加业务逻辑,不要使用废弃或者过期的方法,做安全检查的方法一定要设置为...
  • java安全机制和数字证书管理

    千次阅读 2013-03-13 12:48:38
    实验一 java安全机制和数字证书的管理 一、实验名称 java安全机制和数字证书的管理   二、实验目的 2.1、了解java的安全机制的架构和相关的知识; 2.2、利用java环境掌握数字证书的管理   三、相关基础...
  • java安全编码指南之:表达式规则

    万次阅读 2020-09-08 09:22:32
    java编写过程中,我们会使用到各种各样的表达式,在使用表达式的过程中,有哪些安全问题需要我们注意的呢?一起来看看吧。 注意表达式的返回值 我们在使用JDK库的时候,一定要注意认真的读一下JDK中方法的含义和它...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,236,408
精华内容 494,563
关键字:

java安全

java 订阅