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