Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    [JAVA] Java e Bouncycastle - Certificati DER

    Buongiorno,

    devo capire un po' di cose...

    Devo poter decodificare una stringa firmata con certificato DER utilizzando le lib bouncycastle, visto che lavoro in ambiente J2me.

    Ho letto diversi tutorial, ma nulla che mi sia d'aiuto.

    Pseudocodicamente parlando, vorrei qualcosa del genere:

    codice:
    String der_Encoded = "abcabcabc";
    
    String der_Decoded = Bouncycastle.decodeDER(der_Encoded);
    Qualcuno può aiutarmi?

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157

    Re: [JAVA] Java e Bouncycastle - Certificati DER

    Originariamente inviato da ragnonerodocet
    Buongiorno,

    devo capire un po' di cose...

    Devo poter decodificare una stringa firmata con certificato DER utilizzando le lib bouncycastle, visto che lavoro in ambiente J2me.
    non so quanti errori ci sono in questa frase, partiamo dall'inizio. Se ho la stringa
    codice:
    String stringaDaFirmare = "Sto facendo un esempio di firma digitale";
    questa, dopo che ho apposto la firma, resta invariata. A cosa serve la firma digitale? A certificare, attestare che il messaggio è stato inviato dal firmatario.
    Se Alice invia un messaggio a Bob, la firma serve ad attestare che è stata Alice ad inviare il messaggio, non Carol.
    L'operazione di verifica firma (che si conclude con il messaggio) serve a verifiare che chi ha inviato il messaggio sia proprio Alice.
    La firma può essere anche detached, inviata a parte rispetto al messaggio, quindi significa che il messaggio (la stringa sopra) durante le operazioni di firma resta comunque invariato!!!

    Per la firma (facendo riassunto molto riassunto) si utilizzano certificati X509, disponibili all'utente in formato DER o PEM. In fase di firma viene utilizzata la chiave privata del firmatario, in modo che chiunque riceva il messaggio, con l'ausilio della chiave pubblica, possa verificare che l'identità del firmatario sia corretta.
    Al certificato x509 sono associate altre info, tipo data validità, subject, issuer ecc che servono ad identificare il certificato (e non solo).

    Dire "decodificare una stringa firmata con certificato DER" è ERRATO.

    Puoi anche fare a meno delle librerie bouncycastle, la oracle fornisce già una implementazione dei servizi di sicurezza.

    Originariamente inviato da ragnonerodocet

    Ho letto diversi tutorial, ma nulla che mi sia d'aiuto.

    Pseudocodicamente parlando, vorrei qualcosa del genere:
    che cosa hai letto? Se non hai chiaro i concetti base che ti ho elencato sopra dubito che dai tutorial tu possa estrarre info utili.

    Originariamente inviato da ragnonerodocet
    codice:
    String der_Encoded = "abcabcabc";
    
    String der_Decoded = Bouncycastle.decodeDER(der_Encoded);
    Qualcuno può aiutarmi?
    DER --> sequenza di byte, difficilmente transcodificabile in una stringa

    pseudo codice

    1. apertura flusso firmato
    2. estrazione info firmatario dal flusso
    3. ricerca della chiave pubblica del firmatario
    4. convalida certificato x509 del firmatario
    5. convalida del messaggio (che ti ripeto puoi anche non avere assieme alla firma)

    rivedi bene i concetti alla base della sicurezza (prima ancora della sicurezza java), poi i sample bouncycastle (che conosco e sono ben fatti)
    RTFM Read That F*** Manual!!!

  3. #3
    Ho letto su Internet (stavolta spero bene) ma mi continua a sfuggire qualcosa.

    Il punto 3 da Lei inserito recita:

    "ricerca della chiave pubblica del firmatario"

    Il mittente firma, mediante certificato X509, un messaggio da inviare.

    Lei ha scritto che "in fase di firma viene utilizzata una chiave privata", in modo che il destinatario "mediante chiave pubblica" verifichi che la firma sia corretta.

    Questo non è un esempio di utilizzo di chiavi pubbliche e private (chiavi asimmetriche)?

    Non ho assolutamente capito il nesso tra firmare mediante certificati X509 e tali chiavi.

    So che nel mio caso avrò un array di byte rappresentanti il certificato in formato DER, dal quale devo ricavare (dall'array di byte) la chiave pubblica RSA (modulo e esponente) indispensabile per inviaro di dati al server.

    Ho visto però, da WIKIPEDIA, che si parla di un "decoded X509 certificate"...

    Perchè decodificato? Decodificato mediante chiave pubblica?

    E come? Perchè è questo che devo fare!

    PS: l'esempio su http://en.wikipedia.org/wiki/X.509, Sample X.509 certificates, è esattamente quello che vorrei ottenere!

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    diamoci del tu che mi sento più vecchia di quanto in realtà non sono!!!
    detto questo, iniziamo
    Originariamente inviato da ragnonerodocet
    Ho letto su Internet (stavolta spero bene) ma mi continua a sfuggire qualcosa.

    Il punto 3 da Lei inserito recita:
    "ricerca della chiave pubblica del firmatario"

    Il mittente firma, mediante certificato X509, un messaggio da inviare.
    Alice firma un messaggio per Bob.
    no, in fase di firma il firmatario (Alice) utilizza la sua chiave privata per apporre una firma al messaggio che deve inviare. Fatto questo Alice fisicamente invia il messaggio firmato. La firma può viaggiare insieme al certificato (firma attached) o separata (firma detached).
    Originariamente inviato da ragnonerodocet
    Lei ha scritto che "in fase di firma viene utilizzata una chiave privata", in modo che il destinatario "mediante chiave pubblica" verifichi che la firma sia corretta.
    Bob andrà a prendere il certificato di Alice e tramite questo controlla la validità della firma. Le info contenute nel certificato matchano con alcuni dettagli della chiave privata (in particolare la chiave pubblica corrispondente alla privata specificata da Alice compare o è deducibile dal certificato), quindi se riesce a verificare la firma (è corretta) è sicuro che a firmare sia stata Alice e non Carol.

    Originariamente inviato da ragnonerodocet
    Questo non è un esempio di utilizzo di chiavi pubbliche e private (chiavi asimmetriche)?
    è uno dei più importanti usi della crittografia asimmetrica

    Originariamente inviato da ragnonerodocet
    Non ho assolutamente capito il nesso tra firmare mediante certificati X509 e tali chiavi.
    per generare un certificato x509 si ha bisogno di una coppia di chiavi, la privata ovviamente resta al firmatario e la usa ogni volta che deve apporre una firma.
    Il certificato (e con esso la chiave pubblica) viene reso disponibile, in modo che chiunque possa verificare una firma.

    Originariamente inviato da ragnonerodocet
    So che nel mio caso avrò un array di byte rappresentanti il certificato in formato DER, dal quale devo ricavare (dall'array di byte) la chiave pubblica RSA (modulo e esponente) indispensabile per inviaro di dati al server.
    per quale motivo ? che dati bisogna inviare?

    Originariamente inviato da ragnonerodocet
    Ho visto però, da WIKIPEDIA, che si parla di un "decoded X509 certificate"...

    Perchè decodificato? Decodificato mediante chiave pubblica?

    E come? Perchè è questo che devo fare!

    PS: l'esempio su http://en.wikipedia.org/wiki/X.509, Sample X.509 certificates, è esattamente quello che vorrei ottenere!
    no, mediante il certificato non si decodifica niente!!!
    su wikipedia viene visualizzato il formato di un qualsiasi certificato x509.

    Insomma, che dobbiamo fare? verificare una firma? leggere le info di un certificato?
    In ogni caso ci sono tanti tanti concetti di base da avere chiari quando si fanno ste cose, concetti alla base della crittografia (non di java)
    RTFM Read That F*** Manual!!!

  5. #5
    Mamma mia che confusione micidiale...

    Con "messaggio firmato" si intende un messaggio tipo "Ciao" criptato utilizzando una private key?

    Comunque, a me interessa il certificato, che avrò sotto forma di array di byte, e dal quale, come l'esempio su Wikipedia, dovrò estrarre la chiave pubblica (mod + exp).

    Quindi avrò un array di byte (certificato) che mediante Bouncycastle diventerà un X509Certificate, al quale dovrò chiedere getPublicKey()!

    Ultima cosa:

    mettiamo che io (server) crypto un messaggio con chiave privata, poi genero un certificato, e li invio entrambi.

    Bob (client) si vede arrivare un certificato (in formato DER) + un messaggio cryptato.

    Ora Bob ha bisogno della chiave pubblica per poter leggere il messaggio di Alice.

    Questa chiave pubblica la prende dal certificato?

    Altrimenti non capisco che senso abbia il certificato stesso! Solo per leggere da tale certificato che la data non è scaduta e che il mittene è Alice?

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da ragnonerodocet
    Mamma mia che confusione micidiale...
    si nota da quello che leggo
    Originariamente inviato da ragnonerodocet
    Con "messaggio firmato" si intende un messaggio tipo "Ciao" criptato utilizzando una private key?
    no, messaggio firmato è un messaggio sottoposto a procedura di firma digitale. Tale procedura in input vuole la chiave privata del firmatario.
    Ripeto, il messaggio non viene cifrato!!

    Originariamente inviato da ragnonerodocet
    Comunque, a me interessa il certificato, che avrò sotto forma di array di byte, e dal quale, come l'esempio su Wikipedia, dovrò estrarre la chiave pubblica (mod + exp).

    Quindi avrò un array di byte (certificato) che mediante Bouncycastle diventerà un X509Certificate, al quale dovrò chiedere getPublicKey()!
    BC è solo un provider di servizi, si può fare anche SENZA BC, se si vuole leggere il certificato x509 e basta la problematica è un'altra

    Originariamente inviato da ragnonerodocet
    Ultima cosa:

    mettiamo che io (server) crypto un messaggio con chiave privata, poi genero un certificato, e li invio entrambi.
    no, la coppia chiave pubblica/privata viene creata per prima.
    Da questa si crea una richiesta di certificato da inviare ad una Certification Authority (CA) la quale apporrà (validerà) la nostra richiesta, dandoci il permesso di firmare documenti (che siano validi) mediante l'uso della chiave privata che resta a me, solo a me.
    Il certificato volendo lo si può includere nella firma, ma è distribuito attraverso altri mezzi.

    Originariamente inviato da ragnonerodocet
    Bob (client) si vede arrivare un certificato (in formato DER) + un messaggio cryptato.
    no, si vede avviare il messaggio + l'identificativo del certificato (ripeto posso non allegarlo) e quello che arriva non è DER + messaggio, ma un array di byte.

    Originariamente inviato da ragnonerodocet
    Ora Bob ha bisogno della chiave pubblica per poter leggere il messaggio di Alice.

    Questa chiave pubblica la prende dal certificato?
    la chiave pubblica è deducibile dal certificato, corretto.

    Originariamente inviato da ragnonerodocet
    Altrimenti non capisco che senso abbia il certificato stesso! Solo per leggere da tale certificato che la data non è scaduta e che il mittene è Alice?
    eh mica ha durata infinita la possibilità di firmare!! Ci sono inoltre altre info che non sono stata qui a snocciolare.

    Ripeto, l'argomento è molto complesso di suo, le librerie java non aiutano la comprensione, anzi...in questo modo si accrocchia codice, bisogna chiarirsi bene la base della sicurezza informatica, poi si fa il resto.
    Ci sono una marea di cose sull'argomento su cui ho deliberatamente sorvolato
    RTFM Read That F*** Manual!!!

  7. #7
    Grande Giove...

    no, si vede avviare il messaggio + l'identificativo del certificato (ripeto posso non allegarlo) e quello che arriva non è DER + messaggio, ma un array di byte.
    Se l'utente Bob si vede arrivare un byte array contenente messaggio + id certificato, ha ancora bisogno della chiave pubblica per poter leggere il messaggio di Alice. Giusto?

    Se si vede arrivare un id, come può dal certificato stesso risalire alla public key che gli serve per leggere il messaggio?

    Alice maledetta...

    Il mio problema (reale) è relativo ad un certificato in formato DER, quello che io vedo come un array di byte.

    Da tale certificato devo tirare fuori la public key (modulo e esponente) utilizzando bc.


  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    codice:
    FileInputStream is = new FileInputStream(new File("Path to der")); 
    CertificateFactory cf = CertificateFactory.getInstance("X509", "BC"); 
    
    X509Certificate cert = (X509Certificate) cf.generateCertificate(is);
    questo ti permette di leggere un certificato.
    da questo puoi estrarre poi la chiave pubblica.
    L'algoritmo di verifica firma è leggermente più complesso, ma ti sconsiglio vivamente di andare avanti se non fissi bene i concetti di sicurezza prima, poi le basi della sicurezza in java.
    Non sono argomenti facili da digerire e con tutto che ci lavoro su sempre la risoluzione dei problemi è sempre un bagno di sangue.
    RTFM Read That F*** Manual!!!

  9. #9
    Mi consiglieresti un sito dove poter capire di crittografia?

    Dalle basi naturalmente...

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ti cerco un po' di risorse, ma penso che tu abbia bisogno di un buon testo sulla crittografia (saltando le implementazioni che non ti interessano)
    RTFM Read That F*** Manual!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.