码迷,mamicode.com
首页 > 编程语言 > 详细

【Java安全技术探索之路系列:Java可扩展安全架构】之二:JCA(一):Java加密服务

时间:2015-06-15 16:28:41      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:jca   架构   

作者:郭嘉
邮箱:allenwells@163.com
博客:http://blog.csdn.net/allenwells
github:https://github.com/AllenWell

一 JCA加密服务

通过定义加密服务的类型和功能,JCA可以提供各种加密算法的支持,加密服务包括对消息摘要和数字签名的支持。

整个JCA结构如下图所示:

技术分享

1.1 JCA加密服务提供者

加密服务提供者是一个包含一组实现加密服务的API包,作为J2SE复合包的一部分,JCA框架包含一个名为SUN的默认提供者实现,该实现提供了以下功能:

  • 数字签名算法(DSA)和消息摘要算法(MD5和SHA1)的实现
  • DSA密钥对生成器
  • DSA算法参数生成器和管理器
  • DSA密钥工厂,提供公钥和私钥之间的转换
  • X.509证书路径构造器和验证器
  • X.509证书工厂和证书撤销列表
  • JKS密钥库的实现

1.2 JCA加密服务引擎

引擎是加密服务的抽象表示,这里的加密服务不包含具体的算法实现,加密服务通常和特定的算法相关联。它主要包含以下功能:

  • 提供加密操作:数字签名、消息摘要
  • 生成或提供加密资料:如加密操作需要的饿密钥或参数
  • 生成和管理数据对象:如证书、证书数据库、密钥数据库

1.3 JCA加密服务算法

算法是引擎的具体实现

二 JCP编程模型

2.1 消息摘要

使用MD5计算消息摘要

        try
        {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] testdata = { 1, 2, 3, 4, 5 };
            md5.update(testdata);
            byte[] myhash = md5.digest();
        }
        catch (NoSuchAlgorithmException e)
        {
        }

使用SHA-1计算消息摘要

        try
        {
            MessageDigest sha = MessageDigest.getInstance("SHA-1");
            byte[] testdata = { 1, 2, 3, 4, 5 };
            sha.update(testdata);
            byte[] myhash = sha.digest();
        }
        catch (NoSuchAlgorithmException e)
        {
        }

2.2 密钥对的生成

密钥用接口java.security.Key表示,该接口提供了3种方法:

  • getAlgorithm()返回密钥算法;
  • getEncoded()返回以字节数组形式返回原始编码格式的密钥;
  • getFormat()返回密钥的编码格式。

DSA算法和DH算法生成公私钥对

    try
        {
            // 1024一bit Digital Signature Algorithm(DSA) key pairs
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
            keyGen.initialize(1024);
            KeyPair keypair = keyGen.genKeyPair();
            PrivateKey privateKey = keypair.getPrivate();
            PublicKey publicKey = keypair.getPublic();
            // 576-bit DiffieHellman key pair
            keyGen = KeyPairGenerator.getInstance("DH");
            keyGen.initialize(576);
            keypair = keyGen.genKeyPair();
            privateKey = keypair.getPrivate();
            publicKey = keypair.getPublic();
        }
        catch (java.security.NoSuchAlgorithmException e)
        {
        }

2.3 数字签名的生成

数字签名技术是使用公钥加密技术生成的,发送方用私钥对消息签名,而接收方用公钥对消息进行解密,从而接收方能验证消息的来源或签名者,从而确保消息的完整性和真实性。

私钥签名

            try
            {
                byte[] testdata = { 1, 2, 3, 4, 5 };
                Signature dsig = Signature.getInstance(privateKey
                        .getAlgorithm());
                dsig.initSign(privateKey);
                dsig.update(testdata);
                byte[] signedData = dsig.sign();
            }
            catch (SignatureException e)
            {
            }
            catch (InvalidKeyException e)
            {
            }
            catch (NoSuchAlgorithmException e)
            {
            }

公钥验证

            try
            {
            Signature publicDsig =     Signature.getInstance(publicKey.getAlgorithm());
            publicDsig.initVerify(publicKey);
            publicDsig.update(signedData);
            boolean result = publicDsig.verify(signatureToVerify);
            }
            catch(SignatureException e)
            {
            }
            catch (InvalidKeyException e)
            {
            }
            catch (NoSuchAlgorithmException e)
            {
            }

【Java安全技术探索之路系列:Java可扩展安全架构】之二:JCA(一):Java加密服务

标签:jca   架构   

原文地址:http://blog.csdn.net/allenwells/article/details/46504383

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!