Bu sayfa salt okunur. Kaynağı görebilirsiniz ama değiştiremezsiniz. Bunun yanlış olduğunu düşünüyorsanız yöneticiye danışın.
Bir veriyi şifrelemek için CmsEnvelopeGenerator veya CmsEnvelopeStreamGenerator sınıfları kullanılmalıdır. Büyük verilerin şifrelenmesi için CmsEnvelopeStreamGenerator sınıfı kullanılmalıdır. CmsEnvelopeGenerator sınıfı bellek üzerindeki bir veriyi şifrelediginden, şifreleyebilecegi dosyanın boyutu JRE'nin bellek sınırı kadardır.
Bir doküman bir kişiye veya daha fazla kisiye şifrelenebilir. Eger şifrelenmis dokümanının şifresi çözülebiliyorsa, bu dokümana yeni alıcılar eklenebilir. Sifreli veri göndermek için, verinin gönderilecegi kişi veya kişilerin sertifikalarının elimizde olması gerekmektedir.
<sxh java;title:Java> CmsEnvelopeStreamGenerator cmsGenerator = new CmsEnvelopeStreamGenerator(plainInputStream ); cmsGenerator.addRecipientInfos(new ECertificate [] {cert}); cmsGenerator.generate(encryptedOutputStream); </sxh> <sxh csharp;title:C#> CmsEnvelopeStreamGenerator cmsGenerator = new CmsEnvelopeStreamGenerator(plainInputStream ); cmsGenerator.addRecipientInfos(new ECertificate [] {cert}); cmsGenerator.generate(encryptedOutputStream); </sxh>
Sifreli verinin çözülmesi için CmsEnvelopeParser veya CmsEnvelopeStreamParser sınıfı kullanılmalıdır. Büyük sifreli verilerin çözülmesi için CmsEnvelopeStreamParser sınıfı kullanılmalıdır.
Sifrelenmis verinin çözülmesi için hangi sertifika için sifrelenmis ise o sertifika ve o sertifikaya ait sifre çözücünün elimizde olması gerekmektedir. Sifre çözücü olarak akıllı kart veya bellek kullanılabilir. Asagıda akıllı kart ile sifreli veriyi çözen örnek kod blogu verilmistir.
<sxh java;title:Java> ByteArrayOutputStream decryptedOutputStream = new ByteArrayOutputStream();
SmartCard sc = new SmartCard(CardType.AKIS); long slot = sc.getSlotList()[0]; long session = sc.openSession(slot); sc.login(session, "12345");
CmsEnvelopeStreamParser cmsParser = new CmsEnvelopeStreamParser(encryptedInputStream); IDecryptorStore decryptor = new SCDecryptor(sc, session); cmsParser.open(decryptedOutputStream, decryptor); </sxh> <sxh csharp;title:C#> MemoryStream decryptedOutputStream = new MemoryStream();
CmsEnvelopeStreamParser cmsParser = new CmsEnvelopeStreamParser(encryptedInputStream); IDecryptorStore decryptor = new SCDecryptor(sc, session); cmsParser.open(decryptedOutputStream, decryptor); </sxh>
Sifreli veri olusturmak için kimin için sifreleme yapılacaksa, o kisinin sifreleme sertifikasının elde edilmesi gerekmektedir. Bunun için kullanılabilecek yöntemlerden bir tanesi dizin sisteminden e-posta adresiyle kullanıcı sertifikasının bulunmasıdır.
Dizin sistemi islemleri ESYA Api kütüphanesinde ESYA Api Infra projesinde bulunmaktadır. Bu proje için " ma3api-infra-….jar"ı edinmeniz gerekmektedir.
Aşağıdaki örnek kod bizim test sistemimizde e-posta adresinden sertifikayı bulan örnek koddur. Kendi sisteminize göre uyarlamanız gerekmektedir.
<sxh java;title:Java> public void testGettingCertificateFromLDAP() throws Exception { ECertificate originalCert=new ECertificate(ugCert.getBytes("ASCII")); ECertificate adcert=readEncCertificatesFromDirectory("yasemin.akturk@ug.net")[0]; } public static ECertificate [] readEncCertificatesFromDirectory(String aEmail) throws ESYAException{
String ip = "10.1.0.15"; int port = 389; String directoryType = DirectoryBase.ACTIVE_DIRECTORY; String user = "esyakm@ug.net"; String pass = "Ugnet.2010"; String searchPoint = "dc=ug, dc=net"; DirectoryInfo di = new StaticDirectoryInfo(ip,port,directoryType,user,pass); SearchDirectory search = new SearchDirectory(di, searchPoint); if(search.isConnected() == false) { System.out.println("Dizine baglanamadi!"); return null; } String tka = search.getTKAbyEmail(aEmail); Object[][] objs = search.getAttributes(tka, DirectoryBase.ATTR_KULLANICISERTIFIKASI); if(objs == null) { System.out.println("kullanici sertifikasi yok 1."); return null; } Object[] certs = objs[0]; if(certs == null) { System.out.println("kullanici sertifikasi yok 2."); return null; } List<ECertificate> encCerts = new ArrayList<ECertificate>(); for (int i = 0; i < certs.length; i++) { byte [] certBytes = (byte[]) certs[i];
ECertificate cert = new ECertificate(certBytes); EKeyUsage keyUsage = cert.getExtensions().getKeyUsage(); if(keyUsage.isDataEncipherment() || keyUsage.isKeyEncipherment()) { encCerts.add(cert); } } return encCerts.toArray(new ECertificate[0]);
} </sxh> <sxh csharp;title:C#> public void testGettingCertificateFromLDAP() { ECertificate originalCert = new ECertificate(ugCert); ECertificate adcert=readEncCertificatesFromDirectory("yasemin.akturk@ug.net")[0]; } public static ECertificate[] readEncCertificatesFromDirectory(String aEmail) {
String ip = "10.1.0.15"; int port = 389; String directoryType = DirectoryBase.ACTIVE_DIRECTORY; String user = "esyakm@ug.net"; String pass = "Ugnet.2010";
String searchPoint = "dc=ug, dc=net"; DirectoryInfo di = new StaticDirectoryInfo(ip, port, directoryType, user, pass);
SearchDirectory search = new SearchDirectory(di, searchPoint);
String tka = search.getTKAbyEmail(aEmail); Object[][] objs = search.getAttributes(tka, DirectoryBase.ATTR_KULLANICISERTIFIKASI);
if (objs == null) { Console.WriteLine("kullanici sertifikasi yok 1."); return null; } Object[] certs = objs[0]; if (certs == null) { Console.WriteLine("kullanici sertifikasi yok 2."); return null; }
List<ECertificate> encCerts = new List<ECertificate>(); for (int i = 0; i < certs.Length; i++) { byte[] certBytes = (byte[])certs[i];
ECertificate cert = new ECertificate(certBytes); EKeyUsage keyUsage = cert.getExtensions().getKeyUsage();
if (keyUsage.isDataEncipherment() || keyUsage.isKeyEncipherment()) { Console.WriteLine("sifreleme sertifikasidir"); encCerts.Add(cert); } }
return encCerts.ToArray();
} </sxh>
Sifrelenmis veriye yeni alıcılar eklenebilir. Bunun için sifreli dokümanın hepsini çözmeye gerek yoktur. Sadece dokümanın sifrelendigi simetrik anahtarı elde edip, yeni alıcı için bu simetrik anahtarı sifreleyip dokümana eklemek gerekmektedir. Simetrik anahtarı elde edebilmek için kütüphaneye bir çözücü verilmelidir. Simetrik anahtarı elde etme islemi dokümanın çözülmesi gibi uzun sürmez.
<sxh java;title:Java> Add first recipient InputStream plainInputStream = new ByteArrayInputStream("test".getBytes()); ByteArrayOutputStream envelopeWithOneRecipient = new ByteArrayOutputStream(); ECertificate cert = new ECertificate(ugCert.getBytes("ASCII")); CmsEnvelopeStreamGenerator cmsGenerator = new CmsEnvelopeStreamGenerator(plainInputStream ); cmsGenerator.addRecipientInfos(new ECertificate [] {cert}); cmsGenerator.generate(envelopeWithOneRecipient); CMS Envelope with one recipient is generated.
//Add a new recipient to envelope
ByteArrayInputStream bais = new ByteArrayInputStream(envelopeWithOneRecipient.toByteArray()); ByteArrayOutputStream envelopeWithTwoRecipient = new ByteArrayOutputStream();
CmsEnvelopeStreamParser cmsParser = new CmsEnvelopeStreamParser(bais); IDecryptorStore decryptor = new SCDecryptor(sc, session); cmsParser.addRecipientInfo(envelopeWithTwoRecipient, decryptor, cert); </sxh> <sxh csharp;title:C#> Add first recipient using (Stream plainInputStream = new MemoryStream(ASCIIEncoding.ASCII.GetBytes("test")), envelopeWithOneRecipient = new MemoryStream()) { MemoryStream envelopeWithOneRecipient = new MemoryStream();
ECertificate cert = new ECertificate(ugCert);
CmsEnvelopeStreamGenerator cmsGenerator = new CmsEnvelopeStreamGenerator(plainInputStream); cmsGenerator.addRecipientInfos(new ECertificate[] { cert }); cmsGenerator.generate(envelopeWithOneRecipient); //CMS Envelope with one recipient is generated.
//Add a new recipient to envelope using (MemoryStream bais = new MemoryStream(((MemoryStream)envelopeWithOneRecipient).ToArray()), envelopeWithTwoRecipient = new MemoryStream()) { //MemoryStream envelopeWithTwoRecipient = new MemoryStream();
CmsEnvelopeStreamParser cmsParser = new CmsEnvelopeStreamParser(bais); IDecryptorStore decryptor = new SCDecryptor(sc, session); cmsParser.addRecipientInfo(envelopeWithTwoRecipient, decryptor, cert);
sc.logout(session); }