Bu, dökümanın eski bir sürümüdür!
API tarafından desteklenen imza tiplerinden çok kullanılanları hakkında kısa açıklamaları burada bulabilirsiniz. Hangi imzanın size uygun olduğuna karar vermek için “E- imza Profilleri” dökümanını inceleyebilirsiniz. İmza tipleri hakkında daha geniş bilgi için ise “ETSI TS 101 733” dökümanına bakınız.
BES imza, en basit imza türüdür. BES, imza sadece o kişinin imzayı attığını garanti eder. İmza zamanıda belli olmadığından ancak sertifika geçerli iken imza doğrulanabilir. Sertifika iptal edildiğinde veya sertifika süresi dolduğunda imza doğrulanamaz. BES imza içersine zaman bilgisi eklenebilir, eklenen zamanın herhangi bir hukuki yükümlülüğü, kesinliği yoktur. Beyan edilen zaman şeklinde kullanılabilir.
BaseSignedData bs = new BaseSignedData(); bs.addContent(new SignableByteArray("test".getBytes())); //Since SigningTime attribute is optional,add it to optional attributes list List<IAttribute> optionalAttributes = new ArrayList<IAttribute>(); optionalAttributes.add(new SigningTimeAttr(Calendar.getInstance())); HashMap<String, Object> params = new HashMap<String, Object>(); params.put(EParameters.P_CERT_VALIDATION_POLICY, VALIDATION_POLICY); bs.addSigner(ESignatureType.TYPE_BES, cert, signer, optionalAttributes, params);
BaseSignedData bs = new BaseSignedData(); bs.addContent(new SignableByteArray(Encoding.ASCII.GetBytes("test"))); //Since SigningTime attribute is optional,add it to optional attributes list List<IAttribute> optionalAttributes = new List<IAttribute>(); optionalAttributes.Add(new SigningTimeAttr(DateTime.UtcNow)); Dictionary<String, Object> params_ = new Dictionary<String, Object>(); params_[EParameters.P_CERT_VALIDATION_POLICY] = VALIDATION_POLICY; bs.addSigner(ESignatureType.TYPE_BES, cert, signer, optionalAttributes, params_);
İmzanın beyan edilen zamanını almak için aşağıdaki örnek kod kullanılabilir.
byte[] input = AsnIO.dosyadanOKU(BESwithSIGNING_TIME); BaseSignedData bs = new BaseSignedData(input); List<EAttribute> attrs = bs.getSignerList().get(0).getSignedAttribute(SigningTimeAttr.OID); Calendar time = SigningTimeAttr.toTime(attrs.get(0)); System.out.println(time.getTime().toString());
byte[] input = AsnIO.dosyadanOKU(BESwithSIGNING_TIME); BaseSignedData bs = new BaseSignedData(input); List<EAttribute> attrs = bs.getSignerList()[0]. getSignedAttribute(AttributeOIDs.id_signingTime); DateTime? time = SigningTimeAttr.toTime(attrs[0]); Console.WriteLine(time.Value.ToString());
Beyan edilen zamanın kullanımında oluşabilecek kötü senaryo Şekil 17’daki gibidir. İmza atıldığı sırada imzacı sertifikası iptal edilmiştir; yalnız kullanıcı imza zamanı olarak daha önceki bir zamanı beyan etmiştir. Beyan edilen zamana güvenildiği durumda geçersiz olan bu imza doğrulanacaktır.
ESTimza, BESimzadan türemiştir. İçerisinde imzalama zamanını gösterir zaman damgası bulundurmaktadır. İmzaatılırken zaman damgası ayarlarının verilmesi gerekmektedir. Aşağıdaki örnek kodda bir EST imzanın nasıl atılacağını bulabilirsiniz.
BaseSignedData bs = new BaseSignedData(); bs.addContent(new SignableByteArray("test".getBytes())); HashMap<String, Object> params = new HashMap<String, Object>(); //ilerli for getting signaturetimestamp TSSettings tsSettings = new TSSettings("http://zd.ug.net", 21, "12345678".toCharArray(),DigestAlg.SHA1); params.put(EParameters.P_TSS_INFO, tsSettings); params.put(EParameters.P_CERT_VALIDATION_POLICY, TestConstants.getPolicy()); //add signer bs.addSigner(ESignatureType.TYPE_EST, cert, signer, null, params);
BaseSignedData bs = new BaseSignedData(); bs.addContent(new SignableByteArray(Encoding.ASCII.GetBytes("test"))); Dictionary<String, Object> params_ = new Dictionary<String, Object>(); //ilerli for getting signaturetimestamp TSSettings tsSettings = new TSSettings("http://zd.ug.net", 21, "12345678",,DigestAlg.SHA1); params_[EParameters.P_TSS_INFO] = tsSettings; params_[EParameters.P_CERT_VALIDATION_POLICY] = TestConstants.getPolicy(); //add signer bs.addSigner(ESignatureType.TYPE_EST, cert, signer, null, params_);
İmza zamanı belli olduğundan, BES tipi imzadan farklı olarak sertifika doğrulamada kesin sonuçlara ulaşılabilir. Aşağıdaki örnek kod ile imza zamanını alabilirsiniz.
BaseSignedData bs = new BaseSignedData(input); EST estSign = (EST)bs.getSignerList().get(0); Calendar time = estSign.getTime(); System.out.println(time.getTime().toString());
BaseSignedData bs = new BaseSignedData(input); EST estSign = (EST)bs.getSignerList()[0]; Console.WriteLine(time.Value.ToString()); DateTime? time = estSign.getTime();
ESXLong imza aynı zamanda bir EST imzadır. ESXLong, ESTimzadan farklı olarak imza içerisinde sertifika doğrulamada kullanılacak doğrulama verisini içerir. . Bundan dolayı ESXLong imza atılırken veya bir imza ESXLong’a çevrilirken sertifika doğrulama işlemi yapılmak zorundadır. Sertifika ömrü dolduktan sonra doğrulamada kullanılacak veriye ulaşmada sorunlar çıkabilir. ESXLong imza doğrulama verisini içinde barındırdığından bu tür sorunların çıkmasını engeller.EST imza atılırken kullanılan örnek kodun aynısı sadece eklenecek imza türü değiştirilerek kullanılabilir.
ESA tipi kriptografik algoritmaların zamanla güvenilirliğini kaybetmesine karşı geliştirilmiş bir imza türüdür. Şu anda güvenerek kullandığımız algoritmalar, 5-10 yıl sonra güvenilemez olabilir. Bu algoritmalar güvenilmez duruma geçmeden önce, imzaların ESA tipine çevrilmesi gerekmektedir. Yalnız imza atıldıktan hemen sonra imzanın ESA'ya çevrilmesi fazladan bir güvenlik sağlamaz. Algoritmaların bir kısmı güvenilmez duruma geçerken, daha güvenilir yeni algoritmalar kullanılmaya başlanacaktır. ESA tipine çevrim sırasında bu yeni algoritmalar kullanılmalıdır.
ESA'yı kullanmanın bir diğer amacı imza üzerinde değişiklik yapılmasını engellemek olabilir. Eğer seri imza kullanılıyorsa; ESA'ya çevrilen imzanın altındaki imzaların veri yapısında bir değişiklik yapılamaz. Bu değişiklikler imza türünün değiştirilmesi, imzanın silinmesi, yeni imza eklenmesi olabilir.
Bir imza atılırken ESA tipinde atılamaz. Öncelikle başka bir tipte atılmalı, daha sonra ESA tipine çevrilmelidir. Nasıl yapılacağına İmza Tipleri Arasında Dönüşüm bölümünden bakabilirsiniz.
ESA tipine dönüşüm sırasında arşiv tipi zaman damgası kullanılmaktadır. Bundan dolayı parametreler yardımıyla zaman damgası ayarları verilmelidir.
byte [] signatureFile = AsnIO.dosyadanOKU(TestConstants.getDirectory() + "testdata/ESXLong-1.p7s"); BaseSignedData bs = new BaseSignedData(signatureFile); Map<String,Object>parameters = new HashMap<String, Object>(); //Archive time stamp is added to signature, so time stamp settings are needed. parameters.put(EParameters.P_TSS_INFO, TestConstants.getTSSettings()); parameters.put(EParameters.P_CERT_VALIDATION_POLICY, TestConstants.getPolicy()); bs.getSignerList().get(0).convert(ESignatureType.TYPE_ESA, parameters); AsnIO.dosyayaz(bs.getEncoded(), TestConstants.getDirectory()+"testdata/ESA-2.p7s");
byte[] content = AsnIO.dosyadanOKU(TestConstants.getDirectory() + "testdata\\ ESXLong-1.p7s"); BaseSignedData bs = new BaseSignedData(content); Dictionary<String, Object> parameters = new Dictionary<String, Object>(); //Archive time stamp is added to signature, so time stamp settings are needed. parameters[EParameters.P_TSS_INFO] = TestConstants.getTSSettings(); parameters[EParameters.P_CERT_VALIDATION_POLICY] = TestConstants.getPolicy(); bs.getSignerList()[0].convert(ESignatureType.TYPE_ESA, parameters); AsnIO.dosyayaz(bs.getEncoded(), TestConstants.getDirectory() + "testdata\\ESA-2.p7s");