U盾密码学(三)保护一个密码(有读取keystore代码)【重要】

这个密码的特征是防泄漏不妨篡改,所以解决的是U盾密码学【重要】中的第1类问题-公钥加密私钥解密

 

 

用app的公钥加密

这个星球上只有app的私钥能解密

借助app私钥安全的权威性做背书

质疑密码的安全性,就是质疑app私钥的安全性;而私钥的安全性是不适合被质疑的。

 

========================

从 KeyStore 中获取 PublicKey 和 PrivateKey

https://www.cnblogs.com/cjsblog/p/16046084.html

KeyStore(译:密钥存储库) 代表用于加密密钥和证书的存储设施。

KeyStore 管理不同类型的 entry(译:条目)。每种类型的 entry 都实现了 KeyStore.Entry 接口。提供了三个基本的 KeyStore.Entry 实现:

    • KeyStore.PrivateKeyEntry

这种类型的 Entry 持有一个加密PrivateKey,可以选择以受保护的格式存储,以防止未经授权的访问。它还伴随着对应的公钥的证书链。

 

 

私钥和证书链由给定实体用于自我身份验证。这种身份验证的应用程序包括软件分发组织,它们将JAR文件作为发布和/或许可软件的一部分进行签名。

    • KeyStore.SecretKeyEntry

这种类型的 Entry 持有一个加密的SecretKey,它可以选择以受保护的格式存储,以防止未经授权的访问。

    • KeyStore.TrustedCertificateEntry

这种类型的Entry包含一个属于另一方的公钥证书它被称为受信任的证书,因为密钥存储库所有者信任证书中的公钥确实属于证书的主体(所有者)标识的身份。这种类型的Entry可用于对其他方进行身份验证

KeyStore 中的每个 Entry 都由一个“alias”字符串标识。对于私钥及其关联的证书链,这些字符串区分实体对自身进行身份验证的不同方式。例如,实体可以使用不同的证书颁发机构或使用不同的公钥算法对自己进行身份验证。

这里没有指定密钥存储库是否持久,以及密钥存储库使用的机制(如果它是持久的)。

请求KeyStore对象的典型方法包括依赖默认类型和提供特定的KeyStore类型:

    • 依赖默认类型:

KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    • 提供特定的密钥存储库类型:

KeyStore ks = KeyStore.getInstance("JKS");

在访问密钥存储库之前,必须先加载它。

KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());

// get user password and file input stream
char[] password = getPassword();

try (FileInputStream fis = new FileInputStream("keyStoreName")) {
  ks.load(fis, password);
}

为了用上面的方法创建一个空的 KeyStore(密钥存储库),可以传递null作为InputStream参数。

一旦加载了密钥存储库,就可以从密钥存储库中读取现有条目,或者将新条目写入密钥存储库:

KeyStore.ProtectionParameter protParam = new KeyStore.PasswordProtection(password);

// get my private key
KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry("privateKeyAlias", protParam);
PrivateKey myPrivateKey = pkEntry.getPrivateKey();

// save my secret key
javax.crypto.SecretKey mySecretKey;
KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(mySecretKey);
ks.setEntry("secretKeyAlias", skEntry, protParam);

// store away the keystore
try (FileOutputStream fos = new FileOutputStream("newKeyStoreName")) {
   ks.store(fos, password);
}

注意,尽管可以使用相同的密码加载keystore、保护private key entry、保护secret key entry和存储keystore(如上面的示例代码所示),但也可以使用不同的密码或其他保护参数。

更多请参见 java.security.KeyStore

下面,演示一下

首先,生成一个密钥文件

keytool -genkeypair -alias soas -keypass 123456 -keyalg RSA -storepass 123456 -keysize 1024 -validity 3650 -keystore F:/soas.jks

加载keystore

//  创建KeyStore
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
KeyStore ks2 = KeyStore.getInstance("JKS");

//  加载KeyStore
InputStream is = new ClassPathResource("keyStoreName").getInputStream();
ks.load(is, "storepass".toCharArray());

FileInputStream fis = new FileInputStream("keyStoreName");
ks.load(is, "storepass".toCharArray());

//  获取PrivateKey/PublicKey(方式一)
KeyStore.ProtectionParameter protectionParameter = new KeyStore.PasswordProtection("keypass".toCharArray());
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry("alias", protectionParameter);

PrivateKey myPrivateKey = privateKeyEntry.getPrivateKey();
PublicKey myPublicKey = privateKeyEntry.getCertificate().getPublicKey();

System.out.println(myPrivateKey);
System.out.println(myPublicKey);

//  获取PrivateKey/PublicKey(方式二)
PrivateKey myPrivateKey2 = (PrivateKey) ks.getKey("alias", "keypass".toCharArray());
PublicKey myPublicKey2 = ks.getCertificate("alias").getPublicKey();

System.out.println(myPrivateKey2);
System.out.println(myPublicKey2);

 

 

代码

 

posted on 2025-03-16 18:46  silyvin  阅读(24)  评论(0)    收藏  举报