java 安全(一)

 Java语言本身嵌入了安全特性。比如 java 的类装载机制,就使得外部定义的可疑的与jdk 内置的类同名的类是不被加载的。这里主要是看了下java官方的安全性教程,记录下过程。通过使用 jdk本身提供的tools 和 api 接口来做 数字签名、证书、已经定义密匙库等 已达到安全校验的目的。使得远程加载的 jar包 和 文档 是可信任的。


假设,susan 是提供放,ray 是接受方。现在就通过 签名机制保障双方的数据传输的正确性


1: 提供方 Susan 定义自己的服务实现,编译并打包成 jar包,已备传输使用


import java.io.*;

public class Count {
    public static void countChars(InputStream in) throws IOException
    {
        int count = 0;

        while (in.read() != -1)
            count++;

        System.out.println("Counted " + count + " chars.");
    }

    public static void main(String[] args) throws Exception
    {
        if (args.length >= 1)
            countChars(new FileInputStream(args[0]));
        else
            System.err.println("Usage: Count filename");
    }
}


假设 打包结果如下:

jar cvf Count.jar Count.class


2:生成密钥库

keytool -genkey -alias signFiles -keypass kpi135 -keystore susanstore -storepass ab987c

这里会提示你输入 Distinguished-Name 属性。
然后会 产出一个密钥库的文件:susanstore 。密钥库里面记录的是一条条的 公钥/私钥 的对。

-alias signFiles 制定了引用密钥库的密钥的别名。
-keypass kpi135  访问密钥的秘密
-keystore susanstore 密钥库的名字
-storepass ab987c  访问密钥库的秘密

3:对提供服务的jar包进行签名

jarsigner -keystore susanstore -signedjar sCount.jar Count.jar signFiles

这里通过前面生成的 密钥库来进行签名  sCount.jar 是签名生成的jar包。这里会提示密码输入才能够使用 signFiles密钥对 jar包进行签名
store password (ab987c) and the private key password (kpi135).


4:导出公钥证书已备接受 jar 放(ray)验证使用

keytool -export -keystore susanstore -alias signFiles -file SusanJones.cer
这里也会提示密码输入password (ab987c)
然后生成一个 公钥证书 SusanJones.cer


对于接受方 Ray 来说,如果 制定安全管理的话,会提示没有权限的异常现象

D:/study/security>java -Djava.security.manager -cp sCount.jar Count C:/TestData/data
Exception in thread "main" java.security.AccessControlException: access denied (java.io.FilePermission C:/TestData/data read)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
        at java.security.AccessController.checkPermission(AccessController.java:546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.SecurityManager.checkRead(SecurityManager.java:871)
        at java.io.FileInputStream.<init>(FileInputStream.java:100)
        at java.io.FileInputStream.<init>(FileInputStream.java:66)
        at Count.main(Count.java:48)

如果Ray需要使得程序能够正常的访问本地文件,那么他需要导入  Susan 提供的公钥证书,并指定访问权限

1: 导入 Susan 提供的 公钥证书

keytool -import -alias susan -file SusanJones.cer -keystore raystore
将 Susan 提供的 公钥证书 导入到Ray 本地的 密钥库 raystore
这里会列出 证书的有效期 和 证书指纹: 通过比对 证书指纹 来验证 Susan 提供的 签名jar包是否可信任。
Susan 可以通过下面的命令来输入 证书指纹:
keytool -printcert -file SusanJones.cer

2: 指定访问权限 Susan 签名过的jar包的访问权限
raypolicy 文件内容如下:

keystore "file:/D:/study/security/ray/raystore", "jks";

grant signedBy "susan" {
  permission java.io.FilePermission "D://study//security//testdata//*", "read";
};

这里指定 了 Susan 提供的签名的文件具备访问 D://study//security//testdata// 目录下文件的 读权限


下面Ray可以验证签名的文件的可信任度了。
java -Djava.security.manager -Djava.security.policy=raypolicy -cp sCount.jar Count D:/study/security/testdata/data

这里有两种方式: 一种是通过命令行参数 如上面的命令 -Djava.security.policy=raypolicy
另外一种是通过 java 的权限制定文件中设置 权限文件:
 jre.home/lib/security/java.security
添加权限文件:  policy.url.3=file:D:/study/security/raypolicy

新安全平台中对足够信任度的代码放宽了限制,要获得充分信任须通过代码签名来实现,若我们对某一签名团体足够信任,比如SUN,那么具有该团体签名的代码将被给予充分信任。一个基本的思路大致为,代码发布者创建私钥/公钥对,然后利用私钥对发布代码进行签名,代码使用方在获得代码发布者提供的公钥后对代码进行验证,确认代码确为该提供者提供以及在发布后未经非法修改。这其中存在一些潜在的危险,既是公钥是否是该代码发布者提供的,恶意用户可能替换掉合法的公钥,这会导致用户将给与恶意用户发布的代码以充分信任,目前的常见做法是通过一些权威的证书机构来发布证书而不是公钥,代码发布者被证书发布机构认证合格后,可以将自己的公钥交付证书发布机构,证书发布机构再通过私钥加密该公钥,从而生成证书序列。这样替换公钥的可能性就变得微乎其微。不过世上无绝对安全之事,通过证书机构发布的证书也不是绝对安全的途径。


参考 http://java.sun.com/docs/books/tutorial/security/toolsign/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值