Java Cryptography Architecture (JCA) (一)

本文主要介绍Java加密框架(JCA,Java Cryptography Architecture)。Java加密框架主要由java.security和javax.crypto两个包下的API提供服务。


1    加密Java类简介
1.1    Provider
        Provider(java.security.Provider)是Java加密API的关键类。使用Java加密API时,首先需要一个provider。Java SDK自带有一个默认的加密provider,也可以自行指定一个provider。一个常用的provider 是Bouncy Castle。示例代码:
        Security.addProvider(new BouncyCastleProvider());


1.2    Cipher
        Cipher类(javax.crypto.Cipher)表示加密使用的算法。Cipher使用前需要创建和初始化。初始化时,可以初始化为加密模式和解密模式。示例代码:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
cipher.init(Cipher.DECRYPT_MODE, key);
加密和解密数据均使用doFinal方法:
         byte[] cipherText = cipher.doFinal(plainText);


1.3    Keys
1.3.1    Key
        我们使用密钥(Key类,java.security.Key)进行数据的加密和解密。密钥主要有两种:对称密钥(Symmetric keys)和非对称密钥(Asymmetric keys)。对称密钥使用对称加密算法,使用一个密钥进行数据的加解密。非对称密钥使用非对称加密算法,非对称密钥有公私密钥对等类型。
        使用KeyGenerator类来创建密钥或者公私密钥对,示例代码:
加密密钥:
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(keySize);
secretKey = keyGenerator.generateKey();
公私密钥对:
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPair = keyPairGenerator.generateKeyPair();
1.3.2    KeyStore
        KeyStore(java.security.KeyStore)类实际上是一个保存密钥的数据库,可以保存三中类型的密钥:私钥、公钥和证书、加密密钥(Secret keys)。其中,私钥和公钥在非对称加密中使用,证书是证明持有公钥的个体身份的文件。加密密钥在对称加密中使用。


1.4    MessageDigest
        消息摘要(MessageDigest)用于鉴别消息是否真实完整。设想你从别处获取一段加密信息,如何去判别这段信息是否有被篡改过呢?
        一种常见的做法是:在加密前,从消息原文中计算出消息摘要(消息原文的哈希值),与消息密文一起发送给接收方。当接收方拿到消息密文和消息摘要后,他将先解密消息密文得到消息原文,然后计算消息原文得到消息摘要,并与接收到的消息摘要做对比,如果两者一致,则消息几乎就是没有被篡改过的。(这里并不能保证100%没有篡改,但是消息真实的可能性极高)
MessageDigest(java.security.MessageDigest)类用于计算消息摘要。
示例代码:
        MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
        byte[] digest = messageDigest.digest(plainData);


1.5    MAC
        MAC(Message Authentication Code)类似MessageDigest,区别在于MAC还使用密钥对消息摘要进行加密,只有同时获得消息原文和密钥才能验证MAC。
        这个密钥的存在同时保证了防篡改和防伪造,如果没有密钥,那么消息原文和消息摘要可以同时被修改,此时这个消息是被伪造的。
        由于密钥的保密,攻击者虽然可以篡改消息原文,但是却无法生成对应的消息摘要,由此保证了【防篡改】。只要消息摘要不能伪造,那么那么整个消息也不能伪造,保证了【防伪造】。
        所以MAC可以验证消息的完整性【防篡改】以及辨认是否来自于正确的来源【防伪造】。
示例代码:
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec key = KeyUtil.generateSecretKeySpec();
mac.init(key);
macBytes = mac.doFinal(plainData); 


1.6    Signature
Signature(java.security.Signature)类用于数据的数字签名。对消息原文进行哈希映射获得消息摘要,再对消息摘要进行私钥加密便得到数字签名(Signature)。
MAC的特性和数字签名的特性很相近,区别在于MAC只是针对于互相信任的双方(发送方和接收方,只有这两方具有加密密钥);而数字签名不仅仅限于双方,可以一方发送,多方接收(Non-repudiation)。因为数字签名使用非对称加密,公钥可以公开分发给多个人。
示例代码:
    Signature signature = Signature.getInstance("SHA1withRSA");
    signature.initVerify(keyPair.getPublic());
    signature.update(plainData);
    verified = signature.verify(signatureData);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值