陪玩app源码,加密算法中密钥生成和读取一览

陪玩app源码,加密算法中密钥生成和读取一览

密钥生成与读取

密码学随机数
密码学随机数算法在安全场景中使用广泛,如:生成对称密钥、盐、iv等,因此相比普通的随机数算法(如线性同余),它需要更高强度的不可预测性,在Java中,使用SecureRandom来生成更安全的随机数,如下:

public class SecureRandoms {
    public static byte[] randBytes(int len) throws NoSuchAlgorithmException {
        byte[] bytes = new byte[len];
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.nextBytes(bytes);
        return bytes;
    }
}

 

SecureRandom使用了更高强度的随机算法,同时会读取机器本身的随机熵值,如/dev/urandom,因此相比普通的Random,它具有更强的随机性,因此,对于需要生成密钥的场景,该用哪个要拧得清。

对称密钥
在JCA中对称密钥使用SecretKey表示,若要生成一个新的SecretKey,可使用KeyGenerator,如下:

//生成新的密钥
public static SecretKey genSecretKey() {
    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(SecureRandom.getInstance("SHA1PRNG"));
    SecretKey secretKey = keyGenerator.generateKey();
}

 

而如果是从文件中读取密钥的话,则可以借助SecretKeyFactory将其转换为SecretKey,如下:

//读取密钥
public static SecretKey getSecretKey() {
    byte[] keyBytes = readKeyBytes();
    String alg = "AES";
    SecretKey secretKey = SecretKeyFactory.getInstance(alg).generateSecret(new SecretKeySpec(keyBytes, alg));
}

 

非对称密钥
在JCA中,对于非对称密钥,公钥使用PublicKey表示,私钥使用PrivateKey表示,若要生成一个新的公私钥对,可使用KeyPairGenerator,如下:

//生成新的公私钥对
public static void genKeyPair() {
    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
    keyPairGen.initialize(2048);
    KeyPair keyPair = keyPairGen.generateKeyPair();
    PublicKey publicKey = keyPair.getPublic();
    PrivateKey privateKey = keyPair.getPrivate();
}

 

而如果是从文件中读取公私钥的话,一般公钥是X509格式,而私钥是PKCS8格式,分别对应JCA中的X509EncodedKeySpec与PKCS8EncodedKeySpec,如下:

//读取私钥
public static PrivateKey getPrivateKey() {
    byte[] privateKeyBytes = readPrivateKeyBytes();
    PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
    PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(pkcs8EncodedKeySpec);
}

//读取公钥
public static PublicKey getPublicKey() {
    byte[] publicKeyBytes = readPublicKeyBytes();
    X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKeyBytes);
    PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(x509EncodedKeySpec);
}

 

注意,KeyGenerator、KeyPairGenerator与KeyFactory从命名上看起来有点相似,但它们实现的功能是完全不同的,KeyGenerator、KeyPairGenerator用于生成新的密钥,而KeyFactory则用于将KeySpec转换为对应的Key密钥对象。

JCA密钥相关类关系一览,如下:

 

 

以上就是陪玩app源码,加密算法中密钥生成和读取一览, 更多内容欢迎关注之后的文章

posted @ 2024-07-06 09:33  云豹科技-苏凌霄  阅读(3)  评论(0编辑  收藏  举报