java中的秘钥工厂KeyFactory

一、概述

该类位于java.security包下,声明:public class
KeyFactory extends Object

密钥工厂用于将密钥Key 类型的不透明加密密钥)转换成密钥规范(底层密钥材料的透明表示),反之亦然。

密钥工厂是双向的。也就是说,它们允许根据给定的密钥规范(密钥材料)构建不透明的密钥对象,也允许获取以恰当格式表示的密钥对象的底层密钥材料。

对于同一个密钥可以存在多个兼容的密钥规范。例如,可以使用 DSAPublicKeySpecX509EncodedKeySpec 指定 DSA 公钥。密钥工厂可用于兼容密钥规范之间的转换。

以下是一个如何使用密钥工厂根据其编码实例化 DSA 公钥的示例。假定 Alice 收到了 Bob 的数字签名。Bob 也向她发送其公钥(以编码的格式)来验证他的签名。然后 Alice 执行以下操作:

 X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey);
 KeyFactory keyFactory = KeyFactory.getInstance("DSA");
 PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec);
 Signature sig = Signature.getInstance("DSA");
 sig.initVerify(bobPubKey);
 sig.update(data);
 sig.verify(signature);

二、构造方法

protected KeyFactory(KeyFactorySpi keyFacSpi,Provider provider, String algorithm)  创建一个 KeyFactory 对象。
参数:keyFacSpi - 代理 provider - 提供者 algorithm - 与此 KeyFactory 关联的算法名称
三、方法详细
1、public static KeyFactory getInstance(String algorithm) throws NoSuchAlgorithmException 返回转换指定算法的 public/private 关键字的 KeyFactory 对象
此方法从首选 Provider 开始遍历已注册安全提供者列表。返回一个封装 KeyFactorySpi 实现的新 KeyFactory 对象,该实现取自第一个支持指定算法的 Provider。 注意,可以通过 Security.getProviders() 方法获取已注册提供者列表。
参数:algorithm - 请求密钥算法的名称。
返回:新的 KeyFactory 对象。
抛出: NoSuchAlgorithmException - 如果没有 Provider 支持指定算法的 KeyFactorySpi 实现。
2、public static KeyFactory getInstance(String algorithm,String provider) throws NoSuchAlgorithmException,NoSuchProviderException 返回转换指定算法的 public/private 关键字的 KeyFactory 对象。 返回一个封装 KeyFactorySpi 实现的新 KeyFactory 对象,该实现取自指定提供者。指定提供者必须在安全提供者列表中注册。 注意,可以通过 Security.getProviders() 方法获取已注册提供者列表。
参数:
algorithm - 请求密钥算法的名称。有关标准算法名称的信息,请参阅 Java Cryptography Architecture API Specification & Reference中的附录 A。
provider - 提供者的名称。
返回:
新的 KeyFactory 对象。
抛出:
NoSuchAlgorithmException - 如果不能从指定提供者获得指定算法的 KeyFactorySpi 实现。
NoSuchProviderException - 如果指定提供者未在安全提供者列表中注册。
IllegalArgumentException - 如果提供者的名称为 null 或空。
3、public static KeyFactory getInstance(String algorithm, Provider provider) throws NoSuchAlgorithmException
返回转换指定算法的 public/private 关键字的 KeyFactory 对象。 返回一个封装 KeyFactorySpi 实现的新 KeyFactory 对象,该实现取自指定 Provider 对象。注意,指定 Provider 对象无需在提供者列表中注册。
参数:
algorithm - 请求密钥算法的名称。有关标准算法名称的信息,请参阅 Java Cryptography Architecture API Specification & Reference中的附录 A。
provider - 提供者。
返回:
新的 KeyFactory 对象。
抛出:
NoSuchAlgorithmException - 如果不能从指定 Provider 对象获得指定算法的 KeyFactorySpi 实现。
IllegalArgumentException - 如果指定提供者为 null。
4、public final Provider getProvider() 返回此密钥工厂对象的提供者。
5、public final String getAlgorithm() 获取与此 KeyFactory 关联的算法的名称。 
6、public final PublicKey generatePublic(KeySpec keySpec) throws InvalidKeySpecException
根据提供的密钥规范(密钥材料)生成公钥对象。
参数:
keySpec - 公钥的规范(密钥材料)。
返回:
公钥。
抛出:
InvalidKeySpecException - 如果给定的密钥规范不适合此密钥工厂生成公钥。
7、public final PrivateKey generatePrivate(KeySpec keySpec) throws InvalidKeySpecException 根据提供的密钥规范(密钥材料)生成私钥对象。
参数:
keySpec - 私钥的规范(密钥材料)。
返回:
私钥。
抛出:
InvalidKeySpecException - 如果给定的密钥规范不适合此密钥工厂生成私钥。
8、public final <T extends KeySpec> T getKeySpec(Key key, Class<T> keySpec) throws InvalidKeySpecException 返回给定密钥对象的规范(密钥材料)。keySpec 标识应接受返回密钥材料的规范类。例如,它可能是 DSAPublicKeySpec.class,指示密钥材料应该返回到 DSAPublicKeySpec 类的一个实例中。 
参数:
key - 密钥。
keySpec - 应接受返回密钥材料的规范类。
返回:
请求规范类实例中的底层密钥规范(密钥材料)。
抛出:
InvalidKeySpecException - 如果请求的密钥规范不适合给定密钥,或无法处理给定密钥(例如,给定密钥具有不能识别的算法或格式)。
9、public final Key translateKey(Key key) throws InvalidKeyException 将提供者可能未知或不受信任的密钥对象转换成此密钥工厂对应的密钥对象。
参数:
key - 提供者未知或不受信任的密钥对象。
返回:
已转换的密钥。
抛出:
InvalidKeyException - 如果此密钥工厂无法处理给定密钥。
时间: 2024-10-10 22:34:36

java中的秘钥工厂KeyFactory的相关文章

关于java keytool生成秘钥库随笔

1.设置java环境变量(忽略) 2.使用keytool生成秘钥库(我也不知道该如何称呼,有人称呼他为证书库,反正知道他是个库就行了)(以下         操作都是在dos下运行的,加-help来查看该命令的参数,比如说生成秘钥库的命令是keytool -genkey,可       以使用keytool -genkey -help来查看genkey的一些参数)  keytool  -genkey -alias test1 -keyalg RSA -keystore  e:/keystoreT

Java中的三种工厂模式

/** * 设计模式之工厂模式,用户创建对象的,通过工厂模式来降低代码的耦合度 * @author  */ //简单工厂模式 public class SimpleFactory{        /**     * 根据不过的String参数 name返回不同的汽车对象name     * @param name     * @return     */    public Car getCar(String name){                /*         * 利用equals

关于linux中的 秘钥认证 ,最清晰解读

所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上.登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来.远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求输入密码,这和之前的ssh账号密码也没有直接关系. 也就是说,如果你已经利用A可以远程免密登录到B,如果 你现在想让C也能能免密登录到B,最简单的方法就是,把A的私钥拷贝到 C就行,然后就可以直接进行免密进行 登录了. 可参考 原文地址:htt

Android中保存静态秘钥实践(转)

本文我们将讲解一个Android产品研发中可能会碰到的一个问题:如何在App中保存静态秘钥以及保证其安全性.许多的移动app需要在app端保存一些静态字符串常量,其可能是静态秘钥.第三方appId等.在保存这些字符串常量的时候就涉及到了如何保证秘钥的安全性问题.如何保证在App中静态秘钥唯一且正确安全,这是一个很重要的问题,公司的产品中就存在着静态字符串常量类型的秘钥,所以一个明显的问题就是如何生成秘钥,保证秘钥的安全性? 现今保存静态秘钥的几种主流通用做法:(参考:Android安全开发之浅谈

UCloud 的安全秘钥 (计蒜客初赛第五场)(待解决)

20.7% 1200ms 262144K 每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下: 首先,定义两个由数字序列组成的秘钥 aa 和 bb 近似匹配(\approx≈) 的关系.aa 和 bb 近似匹配当且仅当同时满足以下两个条件: |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度相等. 对于每种数字 cc,cc 在 aa 

计蒜客-第五场初赛-第二题 UCloud 的安全秘钥(简单)

每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下: 首先,定义两个由数字序列组成的秘钥 aa 和 bb近似匹配(\approx≈) 的关系.aa 和 bb 近似匹配当且仅当同时满足以下两个条件: |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度相等. 对于每种数字 cc,cc 在 aa 中出现的次数等于cc 在 bb 中出现的次数

keytool/JDK 秘钥证书工具用法解析

keytool是一个基于jdk的秘钥证书工具: 在上一篇tomcat集成ssl中,我们使用了keytool生成了.keystore秘钥文件,此篇我们就来介绍下该工具. 先看下前篇的用法 1.keytool生成.keystore,密码及关键信息请自行补足 keytool -genkey -alias tomcat -keyalg RSA -keystore /home/tomcat/.keystore -dname "CN=***,OU=***,O=***,L=SHANGHAI,ST=SH,C=C

2017 计蒜之道 初赛 第五场 UCloud 的安全秘钥(中等)

每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下: 首先,定义两个由数字序列组成的秘钥 aa 和 bb近似匹配(\approx≈) 的关系.aa 和 bb 近似匹配当且仅当同时满足以下两个条件: |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度相等. 对于每种数字 cc,cc 在 aa 中出现的次数等于cc 在 bb 中出现的次数

UCloud 的安全秘钥

UCloud 的安全秘钥(困难) 1200ms 262144K 每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下: 首先,定义两个由数字序列组成的秘钥 aa 和 bb 近似匹配(\approx≍) 的关系.aa 和 bb 近似匹配当且仅当同时满足以下两个条件: |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度相等. 对于每种数字