Quantcast
Channel: Home Page http://blogs.dotnethell.it
Viewing all articles
Browse latest Browse all 24464

C# - Incapsulare PKCS #7

$
0
0

C# - Incapsulare PKCS #7

 


Oggi voglio trattare di un nuova funzionalità di crittografia arrivata alla versione v2.0 è la capacità di lavorare con il formato PKCS #7. Le caratteristiche PKCS si trovano in System.Security.Cryptography.Pkcs nella libreria System.Security.dll . Infatti, il codice effettivo è stato fornito al team CLR dal team di Windows.

Queste classi rendono semplice e veloce per firmare alcuni dati arbitrari, creando un file firmato .p7s.  E' possibile caricare una firma p7s, e verificare che i dati sono ancora validi, quindi estrarre i dati. Queste operazioni sono inglobati nella classe SignedCms .

Ecco come si sarebbe creata una semplice firma enveloped:

public static byte[] Sign(byte[] data, X509Certificate2 certificate)
{
    if(data == null)
        throw new ArgumentNullException("data");
    if(certificate == null)
        throw new ArgumentNullException("certificate");
        
    // setup the data to sign
    ContentInfo content = new ContentInfo(data);
    SignedCms signedCms = new SignedCms(content, false);
    CmsSigner signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, certificate);
        
    // create the signature
    signedCms.ComputeSignature(signer);
    return signedCms.Encode();
}

In primo luogo salviamo i dati in un ContentInfo oggetto. Poi creiamo un oggetto SignedCms per creare la firma, passando il contenuto di firmare e indicare che vogliamo una firma enveloped passando false per il parametro indipendente. L'ultimo passo da eseguire è quella di creare un CmsSigner con il certificato che ha la chiave privata che verrà utilizzato per creare la firma. Registriamo questo certificato, rendendo nota del suo numero di serie di chi c'è l'ha rilasciato. Dopo che il setup è stato fatto, tutto quello che resta da fare è calcolare la firma e codifica i dati p7s.

La verifica della firma è ancora più semplice:

public static bool Verify(byte[] signature, X509Certificate2 certificate)
{
    if(signature == null)
        throw new ArgumentNullException("signature");
    if(certificate == null)
        throw new ArgumentNullException("certificate");
        
    // decode the signature
    SignedCms verifyCms = new SignedCms();
    verifyCms.Decode(signature);

    // verify it
    try
    {
        verifyCms.CheckSignature(new X509Certificate2Collection(certificate), false);
        return true;
    }
    catch(CryptographicException)
    {
        return false;
    }
}

Per prima cosa creiamo un SignedCms per fare la verifica. CheckSignature funziona diversamente da altro codice di verifica della firma che viene fornito con il runtime, in quanto non farà nulla se la firma è valida, ma gettano una CryptographicException se la firma non è valida. Al fine di convertire ad un risultato booleano, dobbiamo solo intercettare l'eccezione e restituire false. La mancanza di una deroga significa che possiamo restituire true.

Un'altra operazione si potrebbe desiderare di fare una volta che abbiamo verificato una firma enveloped è quello di estrarre i dati che è stato firmato. La classe SignedCms rende questo una semplice operazione:

public static byte[] ExtractEnvelopedData(byte[] signature)
{
    if(signature == null)
        throw new ArgumentNullException("signature");
        
    // decode the signature
    SignedCms cms = new SignedCms();
    cms.Decode(signature);

    if(cms.Detached)
        throw new InvalidOperationException("Cannot extract enveloped content from a detached signature.");
        
    return cms.ContentInfo.Content;
}

Ancora una volta, abbiamo semplicemente decodificare la firma, e supponendo che si trattava di una firma enveloped tornare il contenuto dall'interno.

By ImaginSystems & Queen Gin   

Viewing all articles
Browse latest Browse all 24464

Trending Articles


Vimeo 10.7.1 by Vimeo.com, Inc.


UPDATE SC IDOL: TWO BECOME ONE


KASAMBAHAY BILL IN THE HOUSE


Girasoles para colorear


Presence Quotes – Positive Quotes


EASY COME, EASY GO


Love with Heart Breaking Quotes


Re:Mutton Pies (lleechef)


Ka longiing longsem kaba skhem bad kaba khlain ka pynlong kein ia ka...


Vimeo 10.7.0 by Vimeo.com, Inc.


FORECLOSURE OF REAL ESTATE MORTGAGE


FORTUITOUS EVENT


Pokemon para colorear


Sapos para colorear


Smile Quotes


Letting Go Quotes


Love Song lyrics that marks your Heart


RE: Mutton Pies (frankie241)


Hato lada ym dei namar ka jingpyrshah jong U JJM Nichols Roy (Bah Joy) ngin...


Long Distance Relationship Tagalog Love Quotes