【Java安全技术探索之路系列:Java可扩展安全架构】之二:JCA(一):Java加密服务
时间:2015-06-15 16:26:34
收藏:0
阅读:248
作者:郭嘉
邮箱: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)
{
}
原文:http://blog.csdn.net/allenwells/article/details/46504383
评论(0)