更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud,下面我们就来说一说关于java 安全类?我们一起去了解并探讨一下这个问题吧!

java 安全类(详解Java安全)

java 安全类

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud

概念

密钥是加密算法不可缺少的部分。密钥在安全体系中至关重要,正如其名,私密的钥匙,打开安全的大门。密钥分两种:对称密钥和非对称密钥。非对称密钥里又包含公开密钥和私有密钥。

与密钥相关的还有一个概念是证书。证书主要用于鉴别密钥,通常将公开密钥放到证书里传输。

Java的安全体系里,密钥是通过JCE算法包实现的。操作密钥的引擎包含两部分:密钥生成器和密钥工厂。密钥生成器可以创建密钥,而密钥工厂将其进行包装展示到外部。所以对于编写程序来说,创建密钥包括两个步骤:1,用密钥生成器产生密钥;2,用密钥工厂将其输出为一个密钥规范或者一组字节码。

Java实现

Java里将密钥封装了一个接口——Key。非对称密钥有PublicKey和PrivateKey,均实现了该接口。从之前的“安全提供者框架”中的输出结果可以看到,不同的安全提供者提供了很多密钥生成算法,比较典型的是Sun的DSA和RSA以及JCE的Diffie-Hellman算法。

  • 密钥库:也就是上面说的KeyStore,用来管理存放密钥和证书的地方。Java的密钥管理是基于密钥库来构建的。

  • 密钥项:密钥库里存放的是一条条的密钥项。密钥项要么保存一个非对称密钥对,要么保存一个秘密密钥。如果保存的是密钥对,那还可能保存一个证书链。证书链的第一个证书包含公钥。

  • 别名:每个密钥都会可以有个别名,可以理解为密钥项的名字。

  • 标识名:密钥库中的实体的标识名是其完整的X.500名的子集,比如一个DN是 CN=Yu Jia, OU=ALI, O=ALIBABA, L=HZ, ST=ZJ, C=CN

  • 证书项:只包含一个公钥证书,保存的是证书而不是证书链。

  • JKS,JCEKS,PKCS12:密钥库算法,Java默认是JKS,只能保存私钥,要想保存对称密钥的秘密密钥,需要使用JCEKS,这也就是上面代码中提到的KeyStore ks = KeyStore.getInstance("jceks");。可以通过修改java.security文件中的keystore.type=JCEKS来更改默认算法。

  • Keytool

    光是这样,还欠点什么,因为上面的代码放到main函数里还是无法执行,而且也有个疑问,明明是要创建keystore,干嘛还要先load?

    看看KeyStore中store()方法的源码:

    public final void store(OutputStream stream, char[] password)

    未初始化的Keystore是要抛出KeyStoreException的。而初始化动作是在load()方法里做的。那这就奇怪了,第一个keystore难道是自己随便在系统目录里touch的?

    这就引出了keytool工具,这是一个JRE提供的管理工具,方便管理密钥库的。keytool是命令行接口,使用keytool命令可以管理密钥库,具体命令各个参数可以man keytool或者keytool -help了解。

    我这里列出我的程序是如何初始化一个keystore的:

    1,我先生成了一个别名叫做changedi的密钥项,其算法是RSA非对称算法

    zunyuanjys-MacBook-Air:~ zunyuan.jy$ keytool -genkey -alias changedi -keyalg RSA

    2,依照提示输入完成DN后,keystore就创建好了,可以查看一下

    zunyuanjys-MacBook-Air:~ zunyuan.jy$ keytool -list

    3,可以看到,这个库还是JKS的,需要更改为JCEKS,于是做下面的事

    zunyuanjys-MacBook-Air:~ zunyuan.jy$ keytool -keypasswd -alias changedi -storetype jceks

    4,再list时,要选择storetype,因为刚才虽然是修改密码,但是其实核心目的是要更改密钥库类型

    zunyuanjys-MacBook-Air:~ zunyuan.jy$ keytool -list -storetype jceks

    5,运行刚才的程序,写一个对称密钥的秘密密钥进去,作为这个keystore的一个密钥项,再list

    zunyuanjys-MacBook-Air:~ zunyuan.jy$ keytool -list -storetype jceks

    其实上面的例子,在创建第一个密钥项时就可以指定storetype是JCEKS,我这里只是展示一下如何切换密钥库类型。另外在RSA的私钥密钥项在未指定证书的情况下也会生成一个自签名证书。

    回到刚才的代码里,我们看看setKeyEntry的细节:

    public final void setKeyEntry(String alias, Key key, char[] password,

    可以看到,如果是非对称密钥的生产,需要提供一个证书链,否则就抛异常。考虑到这样的情况,我们一般不是做专业的企业级安全。还是keytool搞定好了。

    ,