Maglumat alyşmagyň howpsuzlygy häzirki zaman programmalarynyň iň möhüm aýratynlyklaryndan biridir. Gadymy döwürlerden bäri adamlar mekir usullary oýlap tapypdyrlar, bu bolsa adamzadyň ösmegi bilen kriptografiýanyň tutuş ylmyna öwrülipdir. Elbetde, Java bir gapdala durmady we döredijilere Java Kriptografiýa Arhitekturasyny (JCA) hödürledi. Bu syn, nähili işleýändigi barada ilkinji düşünje bermeli.
Munuň manysy näme
Resminamalaryň aýdyşy ýaly " Java platformasy içerki üpjün edijileriň birnäçesini öz içine alýar ". Javaagny, Java platformasy içerki prowaýderleriň toplumyny üpjün edýär, zerur bolsa giňeldip bolar. Muny özüňiz görüp bilersiňiz:
Kodda şeýle bolup biler:
Bu ýagdaýda gaýtalanmazlyk üçin başga bir re modeimi ulanmaly - Cipher Block Chaining (CBC). Bu re Inim, Başlangyç wektory (IvParameterSpec synpy bilen görkezilýär) düşünjesini hödürleýär. Şeýle hem bu re modeimiň kömegi bilen iň soňky bloky döretmegiň netijesi indiki birini döretmek üçin ulanylar:
Indi muny kod bilen ýazalyň:
Oveokarda taraplaryň maglumat alyşýandygyny gördük. JCA-da berlen bu özara täsir üçin standart interfeýs ýokmy? Görnüşi ýaly. Geliň, oňa seredeliň.
Sözbaşy
Wagtynda syýahat etmegi teklip edýärin. Biziň öňümizde Gadymy Rim. Biziň öňümizde bolsa serkerdelerine habar iberýän Gaýus uliuliý Sezar bar. Geliň, bu habardaky zatlary göreliň:"ЕСКЕУГЬГМХИФЯ Е УЛП"
? Java Online Compiler-i açalyň, mysal üçin: repl.it
class Main {
public static void main(String[] args) {
String code = "ЕСКЕУГЬГМХИФЯ Е УЛП";
for (char symbol : code.toCharArray()) {
if (symbol != ' ') {
symbol = (char) (symbol - 3);
}
System.out.print(symbol);
}
}
}
Biziň öňümizde Sezar Şifriniň iň ýönekeý durmuşa geçirilmegi. Gadymy rim taryhçysy Suetoniusyň “On iki Sezaryň durmuşy” atly eserine görä, Sezaryň generallaryna habarlary şifrlemegi hut şu. Kriptografiýa ýaly bir zadyň ulanylmagyna iň gadymy salgylanmalaryň biri . "Kriptografiýa" sözi gadymy grek sözlerinden "gizlenen" we "ýazmak" sözlerinden gelip çykýar. gizlinlik usullarynyň ylymy. Java-yň kriptografiýa üçin öz goldawy bar we oňa Java Kriptografiýa arhitekturasy (JCA) diýilýär . Düşündirişi Oracle-dan resmi resminamalarda tapyp bilersiňiz - " Java Kriptografiýa Arhitekturasy (JCA) ". JCA-nyň kömegi bilen haýsy mümkinçiliklere eýe bolýandygymyzy görmegiňizi maslahat berýärin.
![Java kriptografiýa arhitekturasy: Ilkinji giriş - 3](https://cdn.javarush.com/images/article/f16acbfe-a661-4817-bc9a-1663d4501d74/original.jpeg)
J.C.A.
Öň öwrenişimiz ýaly, Java kriptografiýa bilen işlemek üçin Java kriptografiýa arhitekturasyny (JCA) hödürleýär. Bu arhitekturada API (ýagny belli bir interfeýs toplumy) we üpjün edijiler (olary durmuşa geçirýän) bar:![Java kriptografiýa arhitekturasy: Ilkinji giriş - 4](https://cdn.javarush.com/images/article/d197e3a6-3ee3-4d27-928e-58ebf6d2c408/1024.jpeg)
import java.security.Provider;
import java.security.Security;
class Main {
public static void main(String[] args) {
Provider[] providers = Security.getProviders();
for (Provider p : providers) {
System.out.println(p.getName());
}
}
}
Üçünji tarap üpjün edijini hasaba almak gaty aňsat. Mysal üçin: Security.addProvider(new BouncyCastleProvider());
Bu mysal iň meşhur prowaýderleriň biri - BouncyCastle-ni birleşdirýär . Thisöne bu synda üçünji tarap kitaphanalary bolmazdan diňe esasy gurallary ulanarys. Esasy resminamamyz: " Java kriptografiýa arhitekturasy (JCA) ". JCA-nyň işleýşine düşünmek, şol JCA-nyň işjeň ulanylýan tehnologiýalaryna has aňsat düşünmäge kömek eder. Mysal üçin: HTTPS (" HTTP-den HTTPS-e " serediň).
![Java kriptografiýa arhitekturasy: Ilkinji giriş - 5](https://cdn.javarush.com/images/article/0cf266c7-9cb0-45ba-9d05-2c25a7be716b/1024.jpeg)
MessageDigest
JCA resminamalarynda agzalan ilkinji zat MessageDigest. Umuman aýdanyňda, rus dilinde Digest birmeňzeş bolar - siňdiriş “gysgaça” manysyna laýyk gelýär. Cryöne kriptografiýada siňdiriş hash jemidir. Şeýle hem iňlis dilinde “Digest” -iň “digest” hökmünde terjime edilip bilinjekdigini aňsatlyk bilen ýadyňyzdan çykaryp bilersiňiz. Has giňişleýin maglumatlary JCA resminamalarynda " MessageDigest " bölüminde tapyp bilersiňiz. Resminamalaryň aýdyşy ýaly, MessageDigest digest ýa-da hash diýilýän kesgitli ölçegli netijäni döredýär. Haşing bir taraplaýyn funksiýa, ýagny bir zady ýuwan bolsak, netijeden (ýagny hashden) asyl çeşmesini alyp bilmeris. Iföne birmeňzeş obýektler ýuwulsa (mysal üçin, birmeňzeş nyşanlaryň setirleri), onda olaryň hasy gabat gelmeli. Resminamalarda aýdylyşy ýaly, şeýle hash käwagt maglumatlaryň “barlagy” ýa-da “sanly barmak yzy” hem diýilýär. Hasing dürli algoritmleri ulanyp amala aşyrylyp bilner. Elýeterli algoritmleri " JDK 8 üçin Java kriptografiýa arhitekturasynyň standart algoritm adynyň resminamalary " resminamasynda görüp bilersiňiz . Geliň, ýuwuň we hasy konsola çap edeliň:import javax.xml.bind.DatatypeConverter;
import java.security.*;
public class Main {
public static void main(String[] args) {
try {
MessageDigest digester = MessageDigest.getInstance("SHA-512");
byte[] input = "Secret string".getBytes();
byte[] digest = digester.digest(input);
System.out.println(DatatypeConverter.printHexBinary(digest));
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException(e);
}
}
}
Hasirlemek, meselem, parol saklananda peýdaly bolup biler. Girizilen parolyň hashini ozal saklanan hasa garşy barlap bolýandygy sebäpli. Haşlar gabat gelýän bolsa, parol hem gabat gelýär. Has ygtybarly ýuwmak üçin “duz” düşünjesi ulanylýar. Duz “SecureRandom” synpyny ulanyp amala aşyrylyp bilner . Iýmit siňdiriş usulyny ýerine ýetirmezden ozal, "duz" goşmagy suratlandyralyň:
byte[] salt = new byte[16];
SecureRandom.getInstanceStrong().nextBytes(salt);
digester.update(salt);
Emma hash bir taraplaýyn funksiýa. Emma şifrlemek we açarlamak isleseňiz näme etmeli?
![Java kriptografiýa arhitekturasy: Ilkinji giriş - 6](https://cdn.javarush.com/images/article/7fc1178f-c80c-4f5b-9a21-812f45504d18/1024.jpeg)
Simmetrik açar kriptografiýasy
Simmetrik şifrlemek, şifrlemek we şifrlemek üçin şol bir açary ulanýan şifrlemekdir. Simmetrik şifrlemäni ulanmak üçin açar gerek. Ony almak üçin KeyGenerator ulanýarys . Mundan başga-da, bize şifr ( Cipher ) aňladýan synp gerek bolar . JCA resminamalarynda “ Şifr obýektini döretmek ” bölüminde aýdylyşy ýaly , Şifr döretmek üçin diňe bir algoritm däl, eýsem setirde “üýtgeşme” hem görkezilmeli. Üýtgetme beýany şeýle görünýär: "algoritm / re / im / padding":- Algoritm : bu ýerde “ Şifrlemek (şifrlemek) algoritmleri ” üçin adaty atlara seredýäris . AES-i ulanmak maslahat berilýär.
- Reodeim : şifrlemek tertibi. Mysal üçin: ECB ýa-da CBC (bu barada biraz soňrak gürleşeris)
- Indentasiýa / bölmek : Maglumatlaryň her topbagy aýratyn kodlanýar. Bu parametr näçe blokyň 1 blok hökmünde sanalýandygyny kesgitleýär.
"AES/ECB/PKCS5Padding"
. .Agny, şifrlemek algoritmi AES, şifrlemek tertibi ECB (Elektron kod kitaby üçin gysga), blok ölçegi PKCS5Padding. PKCS5Padding, bir blokyň ululygynyň 2 baýtdygyny (16 bit) aýdýar. Elektron kod kitabyny şifrlemek tertibi, her blokyň yzygiderli şifrlemesini öz içine alýar:
![Java kriptografiýa arhitekturasy: Ilkinji giriş - 7](https://cdn.javarush.com/images/article/05234cac-36e5-4a9a-a34e-a751bf9a70e3/1024.jpeg)
import javax.xml.bind.DatatypeConverter;
import javax.crypto.*;
import java.security.Key;
public class Main {
public static void main(String[] args) throws Exception {
String text = "secret!!secret!!secret!!secret!!";
// Generate new key
KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(256);
Key key = keygen.generateKey();
// Encrypt with key
String transformation = "AES/ECB/PKCS5Padding";
Cipher cipher = Cipher.getInstance(transformation);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encrypted = cipher.doFinal(text.getBytes());
System.out.println(DatatypeConverter.printHexBinary(encrypted));
// Decrypt with key
cipher.init(Cipher.DECRYPT_MODE, key);
String result = new String(cipher.doFinal(encrypted));
System.out.println(result);
}
}
Eger ýerine ýetirsek, gaýtalanmagyna garaşarys, sebäbi 32 simwoly belledik Bu simwollar 16 bitden 2 blokdan ybarat:
![Java kriptografiýa arhitekturasy: Ilkinji giriş - 8](https://cdn.javarush.com/images/article/f6c33a57-014a-41a4-9ca0-47f5d2ee76b4/1024.jpeg)
![Java kriptografiýa arhitekturasy: Ilkinji giriş - 9](https://cdn.javarush.com/images/article/19a3fe6c-1a1a-4de7-916a-9859506f2655/1024.jpeg)
import javax.xml.bind.DatatypeConverter;
import javax.crypto.*;
import java.security.*;
import javax.crypto.spec.IvParameterSpec;
public class Main {
public static void main(String[] args) throws Exception {
// Initialization Vector
SecureRandom random = SecureRandom.getInstanceStrong();
byte[] rnd = new byte[16];
random.nextBytes(rnd);
IvParameterSpec ivSpec = new IvParameterSpec(rnd);
// Prepare key
KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(256);
Key key = keygen.generateKey();
// CBC
String text = "secret!!secret!!secret!!secret!!";
String transformation = "AES/CBC/PKCS5Padding";
Cipher cipher = Cipher.getInstance(transformation);
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] enc = cipher.doFinal(text.getBytes());
System.out.println(DatatypeConverter.printHexBinary(enc));
// Decrypt
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
String result = new String(cipher.doFinal(enc));
System.out.println(result);
}
}
Görşümiz ýaly, netijede gaýtalanýan şifr bloklaryny göremzok. Şol sebäpli ECB rejimi maslahat berilmeýär, sebäbi gaýtalanmalary görmäge we bu bilimleri şifrlemek üçin ulanmaga mümkinçilik berýär. ECB we CBC hakda has giňişleýin maglumat üçin materialy okamagyňyzy maslahat berýärin: “ Elektron kod kitabynyň tertibi ”. Emma simmetrik şifrlemekde aç-açan bir mesele bar - açary nädip şifrleneninden şifrlenen adama geçirmeli. Bu ýolda bu açary saklap bolýar, soň bolsa maglumatlary saklamak mümkin bolar. Asimmetrik şifrlemek bu meseläni çözmek üçin döredildi.
![Java kriptografiýa arhitekturasy: Ilkinji giriş - 10](https://cdn.javarush.com/images/article/8e7d8a58-c813-4434-bf78-b3c7c58c7292/original.jpeg)
Asimmetrik şifrlemek
Asimmetrik şifrlemek ýa-da köpçülige açyk kriptografiýa, jübüt açary ulanýan şifrlemek usulydyr: şahsy açar (hemmelerden gizlin saklanýar) we açyk açar (hemmeler üçin elýeterli). Bu aýralyk, gizlin açary howpsuz saklamak bilen bir hatarda maglumat alyşýan taraplaryň arasynda açar aç-açan alyş-çalyş etmek üçin zerurdyr. Esasy jübüt döredilende, KeyGenerator indi bize ýeterlik däl, bize KeyPairGenerator gerek . Bir mysala seredeliň:import javax.crypto.*;
import java.security.*;
public class Main {
public static void main(String[] args) throws Exception {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(1024);
KeyPair keyPair = generator.generateKeyPair();
// Encrypt with PRIVATE KEY
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] data = cipher.doFinal("Hello!".getBytes());
// Decrypt with PUBLIC KEY
cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
byte[] result = cipher.doFinal(data);
System.out.println(new String(result));
}
}
Asimmetrik şifrlemek ulanylanda, elmydama KeyPair-den bir açary şifrlemek üçin, beýlekisini bolsa şifrlemek üçin ulanýandygymyza düşünmek möhümdir. Emma Şifrlemegiň maksady, diňe alyjynyň ony şifrläp biljekdigi; açyk açar bilen kodlanýar we diňe şahsy açar bilen şifrlenýär.
![Java kriptografiýa arhitekturasy: Ilkinji tanyşlyk - 11](https://cdn.javarush.com/images/article/47f718fc-9a00-436f-a2fc-bd181e25f42c/original.jpeg)
Sanly gol
Aboveokarda görşümiz ýaly, açar açaryny bilip, diňe şahsy açaryň eýesi şifrlemek üçin maglumatlary iberip bilersiňiz. Asagny, asimmetrik şifrlemegiň düýp manysy, her kim şifrlemekdir, ýöne diňe okaýarys. Ters prosedura hem bar - gol synpy tarapyndan görkezilen sanly gol . Sanly gol aşakdaky algoritmleri ulanyp biler: " Gol algoritmleri ". JCA resminamalary bu ikisine has içgin göz aýlamagy teklip edýär: DSAwithMD5 we RSAwithMD5 DSA ýa-da RSA-dan gowy zat we olaryň tapawudy näme, şu ýerde okap bilersiňiz: " Şifrlenen faýl geçirişleri üçin haýsy iň oňat işleýär - RSA ýa-da DSA? " Ora-da bu ýerdäki çekişmeleri okaň: " SSH tanamak açarlary üçin RSA vs. DSA ". Şeýlelikde, sanly gol. Bize öňküsi ýaly “KeyPair” we täze “Signature” synpy gerek bolar. Şu wagta çenli onlaýn düzüjilerde synagdan geçiren bolsaňyz, aşakdaky mysal olar üçin birneme kyn bolup biler. Mysalym diňe şu ýerde işledi: rextester.com . Gerekli sapaklary import edýäris:import javax.crypto.*;
import java.security.*;
Şeýle hem esasy usuly ýazarys:
public static void main(String[] args) throws Exception {
// Generate keys
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
SecureRandom random = SecureRandom.getInstanceStrong();
generator.initialize(2048, random);
KeyPair keyPair = generator.generateKeyPair();
// Digital Signature
Signature dsa = Signature.getInstance("SHA256withRSA");
dsa.initSign(keyPair.getPrivate());
// Update and sign the data
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] data = cipher.doFinal("Hello!".getBytes());
dsa.update(data);
byte[] signature = dsa.sign();
// Verify signature
dsa.initVerify(keyPair.getPublic());
dsa.update(data);
boolean verifies = dsa.verify(signature);
System.out.println("Signature is ok: " + verifies);
// Decrypt if signature is correct
if (verifies) {
cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
byte[] result = cipher.doFinal(data);
System.out.println(new String(result));
}
}
Sanly gol şeýle işleýär. Sanly gol gyzykly mowzuk. Bu mowzukdaky hasabata seretmegiňizi maslahat berýärin:
![Java kriptografiýa arhitekturasy: Ilkinji tanyşlyk - 12](https://cdn.javarush.com/images/article/3cab9610-ad30-40ab-bf11-541c3a22090a/1024.jpeg)
![Java kriptografiýa arhitekturasy: Ilkinji tanyşlyk - 13](https://cdn.javarush.com/images/article/7c98eab3-a01e-4fb1-8687-d962b899446c/original.jpeg)
Esasy ylalaşyk
Java kriptografiýa arhitekturasy möhüm gural bilen tanyşdyrýar - Esasy şertnama teswirnamadyr. KeyAg ylalaşygy synpy bilen görkezilýär . JCA resminamalarynda aýdylyşy ýaly, bu protokol birnäçe tarapa taraplaryň arasynda gizlin maglumatlary paýlaşmazdan şol bir kriptografiki açary kesgitlemäge mümkinçilik berýär. Geň görünýärmi? Soňra bir mysala seredeliň:// 1. Одна из сторон (Алиса) генерирует пару ключей. Encoded публичный ключ отдаёт.
KeyPairGenerator generator = KeyPairGenerator.getInstance("DH");
KeyPair aliceKeyPair = generator.generateKeyPair();
byte[] alicePubKeyEncoded = aliceKeyPair.getPublic().getEncoded();
// 2. Другая сторона (например, Боб) получает открытый ключ Алисы
KeyFactory bobKeyFactory = KeyFactory.getInstance("DH");
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(alicePubKeyEncoded);
PublicKey alicePubKey = bobKeyFactory.generatePublic(x509KeySpec);
// Параметры, которые использовала Алиса при генерации ключей
DHParameterSpec dhParamFromAlicePubKey = ((DHPublicKey)alicePubKey).getParams();
// Создаёт свою пару ключей. Отдаёт свой Encoded открытый ключ
KeyPairGenerator bobKpairGen = KeyPairGenerator.getInstance("DH");
bobKpairGen.initialize(dhParamFromAlicePubKey);
KeyPair bobKeyPair = bobKpairGen.generateKeyPair();
byte[] bobPubKeyEncoded = bobKeyPair.getPublic().getEncoded();
Теперь, у Алисы есть открытый ключ Боба, а у Боба есть открытый ключ Алисы. What дальше?
Как сказано в documentации JCA, у нас есть инструмент KeyAgreement, https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#KeyAgreement который позволяет установить одинаковые ключи шифрования без необходимости обмениваться секретной информацией (т.е. без обмена private key). Соглашение выглядит следующим образом:
// 3. Соглашение по протоколу Диффи-Хеллмана (Diffie–Hellman, DH)
KeyAgreement aliceKeyAgree = KeyAgreement.getInstance("DH");
aliceKeyAgree.init(aliceKeyPair.getPrivate());
// Алиса на основе ключа боба и своего private key создаёт общий shared ключ
KeyFactory aliceKeyFactory = KeyFactory.getInstance("DH");
x509KeySpec = new X509EncodedKeySpec(bobPubKeyEncoded);
PublicKey bobPubKey = aliceKeyFactory.generatePublic(x509KeySpec);
aliceKeyAgree.doPhase(bobPubKey, true);
byte[] aliceSharedSecret = aliceKeyAgree.generateSecret();
SecretKeySpec aliceAesKey = new SecretKeySpec(aliceSharedSecret, 0, 16, "AES");
// Боб на основе ключа Алисы и своего private key создаёт общий shared ключ
KeyAgreement bobKeyAgree = KeyAgreement.getInstance("DH");
bobKeyAgree.init(bobKeyPair.getPrivate());
bobKeyAgree.doPhase(alicePubKey, true);
byte[] bobSharedSecret = bobKeyAgree.generateSecret();
SecretKeySpec bobAesKey = new SecretKeySpec(bobSharedSecret, 0, 16, "AES");
// Общий ключ у Алисы и Боба одинаков
System.out.println("Shared keys are equals: " + Arrays.equals(aliceSharedSecret, bobSharedSecret));
Далее Боб и Алиса, используя общий ключ, про который больше никто не знает, обмениваются зашифрованными данными:
// 4. Боб шифрует сообщение для Алисы
Cipher bobCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
bobCipher.init(Cipher.ENCRYPT_MODE, bobAesKey);
byte[] ciphertext = bobCipher.doFinal("Hello, Alice!".getBytes());
// Передаёт Алисе параметры, с которыми выполнялась шифровка
byte[] encodedParamsFromBob = bobCipher.getParameters().getEncoded();
// 5. Алиса принимает сообщение и расшифровывает его
AlgorithmParameters aesParams = AlgorithmParameters.getInstance("AES");
aesParams.init(encodedParamsFromBob);
Cipher aliceCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
aliceCipher.init(Cipher.DECRYPT_MODE, aliceAesKey, aesParams);
byte[] recovered = aliceCipher.doFinal(ciphertext);
System.out.println(new String(recovered));
Bu mysal JCA resminamalaşdyryş mysalyndan alyndy: " 2 Tarapyň arasynda Diffie-Hellman açar alyş-çalşygy ". Esasy şertnama protokolyny ulanyp, Java Kriptografiýa arhitekturasynda asimmetrik şifrlemegiň takmynan görnüşi. Asimmetrik şifrlemek barada has giňişleýin maglumat üçin maslahat berilýän wideolar:
![Java kriptografiýa arhitekturasy: Ilkinji tanyşlyk - 14](https://cdn.javarush.com/images/article/1318d366-a118-466a-865f-1cf33ecb033d/original.jpeg)
Şahadatnamalar
Dogrusy, desert üçin henizem möhüm zat ýok - şahadatnamalar. Adatça, jdk bilen girizilen açar düwmesiniň kömegi bilen şahadatnamalar döredilýär. Has giňişleýin maglumatlary, meselem, şu ýerden okap bilersiňiz: " Java düwme buýrugyny ulanyp, öz-özüňe gol çekilen SSL şahadatnamasyny döretmek ". Şeýle hem gollanmalary Oracle-dan okap bilersiňiz. Mysal üçin, şu ýerde: " Serwer şahadatnamasyny döretmek üçin düwme düwmesini ulanmak ". Mysal üçin, “Tutorialspoint Java Online Compiler” -i ulanalyň :import sun.security.tools.keytool.CertAndKeyGen;
import sun.security.x509.*;
import java.security.cert.*;
import java.security.*;
// Compiler args: -XDignore.symbol.file
public class Main {
public static void main(String[] args) throws Exception {
CertAndKeyGen certGen = new CertAndKeyGen("RSA", "SHA256WithRSA", null);
// generate it with 2048 bits
certGen.generate(2048);
PrivateKey privateKey = certGen.getPrivateKey();
X509Key publicKey = certGen.getPublicKey();
// prepare the validity of the certificate
long validSecs = (long) 365 * 24 * 60 * 60; // valid for one year
// enter your details according to your application
X500Name principal = new X500Name("CN=My Application,O=My Organisation,L=My City,C=DE");
// add the certificate information, currently only valid for one year.
X509Certificate cert = certGen.getSelfCertificate(principal, validSecs);
// Public Key from Cert equals Public Key from generator
PublicKey publicKeyFromCert = cert.getPublicKey();
System.out.println(publicKeyFromCert.equals(publicKey));
}
}
Görşümiz ýaly, şahadatnama köpçülige açar bermek mümkinçiligini berýär. sun.security
Bu usulyň kemçiligi bar - töwekgelçilikli hasaplanýan ulanýarys , sebäbi ... bu paket köpçülige açyk Java API-iň bir bölegi däl. Şonuň üçin düzülende parametrini görkezmeli - XDignore.symbol.file
. Başga bir ýol bar - şahadatnama el bilen döretmek. Zyýanly tarapy, resminama berilmedik içerki API ulanýar. Şeýle-de bolsa, bu hakda bilmek peýdalydyr. Iň bolmanda, RFC-2459 spesifikasiýasynyň nähili ulanylýandygy aýdyň görünýär: “ Internet X.509 Jemgyýetçilik açary infrastrukturasy ”. Ine bir mysal:
// 1. Генерируем пару ключей
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(4096);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 2. Определяем данные сертификата
// Определяем срок действия сертификата
Date from = new Date();
Date to = new Date(from.getTime() + 365 * 1000L * 24L * 60L * 60L);
CertificateValidity interval = new CertificateValidity(from, to);
// Определяем subject name, т.е. Name того, с чем ассоциирован публичный ключ
// CN = Common Name. Через точку с запятой могут быть указаны также другие атрибуты
// См. https://docs.oracle.com/cd/E24191_01/common/tutorials/authz_cert_attributes.html
X500Name owner = new X500Name("cn=Unknown");
// Уникальный в пределах CA, т.е. Certificate Authority (тот, кто выдаёт сертификат) номер
BigInteger number = new BigInteger(64, new SecureRandom());
CertificateSerialNumber serialNumber = new CertificateSerialNumber(number);
// Определяем алгоритм подписи сертификата
AlgorithmId algorithmId = new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);
CertificateAlgorithmId certificateAlgorithmId = new CertificateAlgorithmId(algorithmId);
// 3. По подготовленной информации создаём сертификат
X509CertInfo info = new X509CertInfo();
info.set(X509CertInfo.VALIDITY, interval);
info.set(X509CertInfo.SERIAL_NUMBER, serialNumber);
info.set(X509CertInfo.SUBJECT, owner);
info.set(X509CertInfo.ISSUER, owner);
info.set(X509CertInfo.KEY, new CertificateX509Key(keyPair.getPublic()));
info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3));
info.set(X509CertInfo.ALGORITHM_ID, certificateAlgorithmId);
// 4. Подписываем сертификат
X509CertImpl certificate = new X509CertImpl(info);
certificate.sign(keyPair.getPrivate(), "SHA256withRSA");
// 5. Проверка сертификата
try {
// В случае ошибки здесь будет брошено исключение. Например: java.security.SignatureException
certificate.verify(keyPair.getPublic());
} catch (Exception e) {
throw new IllegalStateException(e);
}
![Java kriptografiýa arhitekturasy: Ilkinji giriş - 15](https://cdn.javarush.com/images/article/b327b810-a68c-4ec3-b90b-8ab3211ae217/1024.jpeg)
Açar dükany (KeyStore)
Iň soňky gürleşmek isleýän zadym, KeyStore diýilýän açar we şahadatnama dükany. Şahadatnamalary we açarlary yzygiderli öndürmegiň gymmat we manysyzdygy düşnüklidir. Şonuň üçin olary nädip howpsuz saklamaly. Munuň üçin bir gural bar - KeyStore. Esasy dükan, " KeyManagement " bölüminde JCA resminamalarynda beýan edilýär . Onuň bilen işlemek üçin API gaty düşnüklidir. Ine kiçijik mysal:KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
String alias = "EntityAlias";
java.security.cert.Certificate[] chain = {certificate};
keyStore.setKeyEntry(alias, keyPair.getPrivate(), "keyPassword".toCharArray(), chain);
// Загрузка содержимого (Private Key + Certificate)
Key key = keyStore.getKey(alias, "keyPassword".toCharArray());
Certificate[] certificateChain = keyStore.getCertificateChain(alias);
// Сохранение KeyStore на диск
File file = File.createTempFile("security_", ".ks");
System.out.println(file.getAbsolutePath());
try (FileOutputStream fos = new FileOutputStream(file)) {
keyStore.store(fos, "keyStorePassword".toCharArray());
}
Mysaldan görnüşi ýaly, ilki load
KeyStore üçin ýerine ýetirilýär. Emma biziň ýagdaýymyzda ilkinji atributyny null diýip kesgitledik, ýagny KeyStore üçin çeşme ýok. Diýmek, KeyStore mundan beýläk tygşytlamak üçin boş döredilýär. Ikinji parametr hem ýok, sebäbi täze KeyStore döredýäris. KeyStore-ni bir faýldan ýükleýän bolsak, bu ýerde parol görkezmeli bolarys (dükan diýilýän KeyStore usulyna meňzeýär).
GO TO FULL VERSION