陪玩app原始碼,加密演算法中金鑰生成和讀取一覽

云豹科技-苏凌霄發表於2024-07-06

陪玩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原始碼,加密演算法中金鑰生成和讀取一覽, 更多內容歡迎關注之後的文章

相關文章