public class FileSignature {
static final String KEYSTORE_FILE = "KeyStoreDemo.p12";
static final String KEYSTORE_INSTANCE = "pkcs12";
static final String KEYSTORE_PWD = "demo";
static final String KEYSTORE_ALIAS = "test";
public void SignatureFile() throws Exception {
File file = new File("zugferdXmlToDB2.map");
FileInputStream stream = new FileInputStream(file);
byte data[] = new byte[(int) file.length()];
stream.read(data);
Security.addProvider(new BouncyCastleProvider());
KeyStore ks = KeyStore.getInstance(KEYSTORE_INSTANCE);
ks.load(new FileInputStream(KEYSTORE_FILE), KEYSTORE_PWD.toCharArray());
Key key = ks.getKey(KEYSTORE_ALIAS, KEYSTORE_PWD.toCharArray());
if ( key instanceof PrivateKey ) {
// Build CMS
Certificate cert = ks.getCertificate(KEYSTORE_ALIAS);
DSAPrivateKey keyPriv = (DSAPrivateKey) key;
DSAPublicKey keyPub = (DSAPublicKey) cert.getPublicKey();
byte[] digitalSignature = signData(data, keyPriv);
boolean verified;
verified = verifySig(data, keyPub, digitalSignature);
if ( verified ){
writeSignedFile(digitalSignature, file);
}
}
}
public static byte[] signData(byte[] data, PrivateKey Key) throws Exception {
Signature signer = Signature.getInstance("SHA1withDSA");
signer.initSign(Key);
signer.update(data);
return ( signer.sign() );
}
public static boolean verifySig(byte[] data, PublicKey Key, byte[] sig) throws Exception {
Signature signer = Signature.getInstance("SHA1withDSA");
signer.initVerify(Key);
signer.update(data);
return ( signer.verify(sig) );
}
private void writeSignedFile(byte[] digitalSignature, File file) throws IOException {
FileOutputStream output = new FileOutputStream("test/" + file);
output.write(digitalSignature);
output.close();
}
}
Erstmal zu deinen Fragen die Datei soll in das Alte Datei Format die Datei öffne ich mit notepad++. Wie bekomme ich das den hin nur einen Hash zu signieren und diesen dann der Datei hinzuzufügen ?
Als Export wohin? Und womit öffnest du es? Daten sind alle nur bytes. Es obliegt den Programmen wie diese zu interpretieren sind. Deshalb kann es sein, dass es auf den ersten Moment nicht verschlüsselt oder einfach falsch wirkt.
Normalerweise erstellst du einen Hash und signierst diesen, nicht die ganze Datei.
Und Schreibschutz erhälst du dadurch nicht. Eher um Datenschutz im weiteren Sinne, also Integrität.
Es soll nichts verschlüsselt werden. Es soll einfach der Inhalt signiert werden und die Signatur in eine p7s Datei exportiert werden.Wieso BouncyCastle? Bist du an diese Bib gebunden?
Für das Erstellen einer Signatur gibt es mehrere Verfahren. Ich denke du solltest dir erstmal klar darüber werden, welches Verfahren du verwenden willst.
Und nochmal: signieren ist nicht das gleiche wie verschlüsseln!
Wenn du verschlüsseln willst, guck dir Chiphre, AES, RSA, etc an.
Kann es sein, dass in der p7s Datei einfach nur der Inhalt der Datei xy ist und diese Daten dann signiert sind ?Falls du dann noch Fragen hast, kannst du gerne Fragen
Ich interessiere mich dafür. Und ich habe gerade die Aufgabe das ich eine Datei signiere und dabei die Signatur als p7s Datei erstelle.Belegst du gerade das Fach oder interessiert dich das?
Wozu brauchst du das eigentlich?
So ich habe mir jetzt eine .P7s Datei erstellt jetzt frage ich mich nur wie ich jetzt die Datei verifizieren kann.Mit den zwei oben genannten Links sollte das ja funktionieren.
CMSSignedData signedData = new CMSSignedData(Base64.decode(sig.getBytes()));
CMSProcessable signedContent = new CMSProcessableByteArray(content.getBytes("ISO-8859-1"));
InputStream is = new ByteArrayInputStream(Base64.decode(sig.getBytes()));
CMSSignedData signedData = new CMSSignedData(signedContent, is);
Store store = signedData.getCertificates();
SignerInformationStore signerInfo = signedData.getSignerInfos();
Collection coll = signerInfo.getSigners();
Iterator it = coll.iterator();
while (it.hasNext()) {
SignerInformation signer = (SignerInformation)it.next();
Collection certCollection = store.getMatches(signer.getSID());
Iterator certIt = certCollection.iterator();
X509CertificateHolder certHolder = (X509CertificateHolder)certIt.next();
X509Certificate cert = new JcaX509CertificateConverter().setProvider("BC").getCertificate(certHolder);
//Prüfen, ob Signatur gültig ist
if (signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert))) {
//To-Do
}
}