Подписание файла JAVA
(0 чел.) 
  • Страница:
  • 1
  • 2

ТЕМА: Подписание файла JAVA

Подписание файла JAVA 1 год, 4 мес. назад #3833

  • urmnurbo
  • Осваиваюсь на форуме
  • Постов: 26
  • Репутация: 0
Добрый день. Пытаюсь подписать PDF файл.

CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
		InputStream dataLoaded = this.getClass().getResourceAsStream("/Tickets.pdf");
		byte[] data = dataLoaded.toString().getBytes();
		
		
		String alg = certToCheck.getSigAlgName();
		Signature sig = Signature.getInstance(certToCheck.getSigAlgName(), provider); // Load signature
		KeyFactory keyFact = KeyFactory.getInstance(certToCheck.getPublicKey().getAlgorithm(), provider);
		PrivateKey privateKey;
		try {
			KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) store.getEntry(alias,
					new KeyStore.PasswordProtection(password.toCharArray()));
			privateKey = pkEntry.getPrivateKey();
			try {
				sig.initSign(privateKey);
				sig.update(data);
				CMSProcessableByteArray cmsData = new CMSProcessableByteArray(sig.sign());
				gen.addSigner(privateKey, certToCheck, CMSSignedDataGenerator.DIGEST_SHA256);
				
				// gen.addCertificatesAndCRLs(certStore);
				try {
					String name  = provider.getName();
					CMSSignedData signed = gen.generate(cmsData, provider.getName());					
					SignerInformationStore signerInfos = signed.getSignerInfos();
				    int mst = signed.getEncoded().length;		    
			
					
					FileOutputStream fileOuputStream = new FileOutputStream("C:\\Test\\test_2.txt");
					
					
					ByteArrayOutputStream out = new ByteArrayOutputStream();
					try (ASN1InputStream asn1 = new ASN1InputStream(signed.getEncoded())) {
						DEROutputStream dos = new DEROutputStream(fileOuputStream);
						dos.writeObject(ASN1Object.fromByteArray(signed.getEncoded()));
					}
					fileOuputStream.close();
					
					SignerInformationStore rr = signed.getSignerInfos();
				} catch (CMSException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			} catch (InvalidKeyException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (UnrecoverableEntryException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}


1. Правильно ли логика подписания ?
2. При получения CMSSignedData его byte.length всегда равен 698, независимо от размера pdf файла. В этом объекте CMSSignedData - хранится ли данные о pdf файле.
3. Что делать дальше с CMSSignedData, я его пытаюсб сохранить в файл, но он мне выдает закодированный файл. Какими средствами можно его декодировать. Методы?

Re: Подписание файла JAVA 1 год, 4 мес. назад #3835

  • margulan
  • Модератор
  • Постов: 166
  • Репутация: 12
На форуме уже были вариации этого метода для примера https://pki.gov.kz/index.php/ru/forum/7-dlya-razrabotchikov/1927-podpisanie-fajlov-v-veb?limit=6&start=12

В следующей строке вы должны были передать данные для подписи, то есть переменную data:
CMSProcessableByteArray cmsData = new CMSProcessableByteArray(sig.sign());


В CMSSignedData хранится подпись. Если вы хотите увидеть ее в виде строки можно закодировать ее в Base64 как указано в вышеуказанной теме на форуме.

Если вы хотите получить присоединенную подпись с оригинальными данными, вам нужно указать соответствующий флаг при генерации:
CMSSignedData signed = gen.generate(cmsData, true, provider.getName());
Изменено: 1 год, 4 мес. назад от margulan.

Re: Подписание файла JAVA 1 год, 4 мес. назад #3839

  • urmnurbo
  • Осваиваюсь на форуме
  • Постов: 26
  • Репутация: 0

Если вы хотите получить присоединенную подпись с оригинальными данными, вам нужно указать соответствующий флаг при генерации:

в библиотеки kalkan нашел метод:
public CMSSignedData generate(String signedContentType, CMSProcessable content, boolean encapsulate, String sigProvider)


String signedContentType - вот тут надо этот флаг указать? И что именно туда передовать?
Пока написал:
cmsData.getContent().getClass().getTypeName()

CMSProcessable content - передаем битовые данные.
CMSProcessableByteArray cmsData = new CMSProcessableByteArray(data);

boolean encapsulate - true
String sigProvider - имя провайдера,
provider.getName()

Re: Подписание файла JAVA 1 год, 4 мес. назад #3840

  • urmnurbo
  • Осваиваюсь на форуме
  • Постов: 26
  • Репутация: 0
String signedContentType указал:
 public static final String DATA = PKCSObjectIdentifiers.data.getId();
CMSSignedData signed = gen.generate(DATA, cmsData, true, provider.getName());


где DATA = 1.2.840.113549.1.7.1

Re: Подписание файла JAVA 1 год, 4 мес. назад #3841

  • margulan
  • Модератор
  • Постов: 166
  • Репутация: 12
Можно использовать метод
public CMSSignedData generate(CMSProcessable content, boolean encapsulate, String sigProvider)


Под флагом имелся в виду параметр encapsulate. true - если вам нужно присоединенная подпись.

Re: Подписание файла JAVA 1 год, 4 мес. назад #3846

  • urmnurbo
  • Осваиваюсь на форуме
  • Постов: 26
  • Репутация: 0
Спасибо

Есть теперь другой вопрос. Вот код который сохраняет hash-value в txt формате:
gen.addSigner(privateKey, certToCheck, CMSSignedDataGenerator.DIGEST_SHA256);
CMSSignedData signed = gen.generate(cmsData, false, provider.getName());


FileOutputStream fileOuputStream = new FileOutputStream("C:\\Test\\test_4.txt");
byte[] signedDataEncoded = signed.getEncoded();
fileOuputStream.write(Base64.encode(signedDataEncoded));



Кодирую тот же самый файл и тем же ключом, но у меня каждый раз hash-value разные. То есть не польностью совпадает:

text_2:
MIICtgYJKoZIhvcNAQcCoIICpzCCAqMCAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0BBwExggJ+MIICegIBATCB5zCBzjELMAkGA1UEBhMCS1oxFTATBgNVBAcMDNCQ0KHQotCQ0J3QkDEVMBMGA1UECAwM0JDQodCi0JDQndCQMUwwSgYDVQQKDEPQoNCc0JogwqvQnNCV0JzQm9CV0JrQldCi0KLQhtCaINCi0JXQpdCd0JjQmtCQ0JvQq9KaINKa0KvQl9Cc0JXQosK7MUMwQQYDVQQDDDrSsNCb0KLQotCr0pog0JrQo9OY0JvQkNCd0JTQq9Cg0KPQqNCrINCe0KDQotCQ0JvQq9KaIChSU0EpAhRrOFqUOts9poIlyoTTKe32NeZRnjANBglghkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE4MDMyODAzMjc0NVowLwYJKoZIhvcNAQkEMSIEIG9Jb8/kZ5nWXQHn7+MmNOGQJ9uDlw9UjlNYI02OkMy8MA0GCSqGSIb3DQEBCwUABIIBALmmaXWdheWZ//1OxDEAyidVdD5bgZuzfKhoXuBk6Sr9Qn42yWIa62OY4SRXoxHF/veJmER9FT1ravVCrV/p4Y5wzPyq/sciGOwE2+BBLVXcQDIfr/oRFvCF6YQyOSdIOIztuNRticpRTHeoigynrOBJUwp0oYDu5OMEdMyFUzMHJBNGqFeuiOU+dcg8to4i6kXz5EsiMmFi434fIZZfzQnmMvh7RLc57LQe0Z2cid0Xu1V3L8OMwzoKyI0QY032GC96PueLoI4rS13mroXjXKJX2eUMkJH0D9/RGYZ7u0wQajISKQzmjEiso5Pw5siLtBwI4nZzKEjZq+HI4TLzlBI=


text_3:
MIICtgYJKoZIhvcNAQcCoIICpzCCAqMCAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0BBwExggJ+MIICegIBATCB5zCBzjELMAkGA1UEBhMCS1oxFTATBgNVBAcMDNCQ0KHQotCQ0J3QkDEVMBMGA1UECAwM0JDQodCi0JDQndCQMUwwSgYDVQQKDEPQoNCc0JogwqvQnNCV0JzQm9CV0JrQldCi0KLQhtCaINCi0JXQpdCd0JjQmtCQ0JvQq9KaINKa0KvQl9Cc0JXQosK7MUMwQQYDVQQDDDrSsNCb0KLQotCr0pog0JrQo9OY0JvQkNCd0JTQq9Cg0KPQqNCrINCe0KDQotCQ0JvQq9KaIChSU0EpAhRrOFqUOts9poIlyoTTKe32NeZRnjANBglghkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE4MDMyODAzMjgwNVowLwYJKoZIhvcNAQkEMSIEIG9Jb8/kZ5nWXQHn7+MmNOGQJ9uDlw9UjlNYI02OkMy8MA0GCSqGSIb3DQEBCwUABIIBANE5JSzmVo0q1+A/BiH6Q9ShE8nmcThy8KX5W5eYkhM0wyGIrOsDey7M1qb+htvzHfAnf+rwJjfLCaWbr5sxCvSkmIW4+qpA68dM7QNM6CjrigC9lXnzPuwyWavR3YNJPyV++z2vzD/dJZ1wt+LE1wBqP0w43n0Cn46cBhJzy/TgUY9Oo3sTslEHwjhrUWIK0IHYMFLUYGhlOLR8jHMbJjqcU+ttxfLn0E9ESPqoCiic/RAEo2Mta3ObImgeqO0TVSoZH1PTJz14QecR/AwWwoSg2zYEiIByrYQA2V2UImOh17I5RH60nHAr38nGeVHrvD/TuFfDaz3HZEEcETIPifQ=



Проверял даже по коду, все равно не совпадает:
byte[] f1 = Files.readAllBytes(Paths.get("C:\\Test\\test_2.txt"));
		byte[] f2 = Files.readAllBytes(Paths.get("C:\\Test\\test_3.txt"));
if(Base64.decode(f1).equals(Base64.decode(f2))) {
			System.out.println("Hash value is equal");
		}
		else {
			System.out.println("Hash value is NOT equal");
		}



В чем может быть проблема? По сути они же должны быть одинаковым, если хэшировать один файл с тем же ключом два или три раза.
Изменено: 1 год, 4 мес. назад от urmnurbo.
  • Страница:
  • 1
  • 2
FaLang translation system by Faboba