L’eToken è il
primo strumento USB per la sicurezza ed integrità dei dati e delle reti in
ambiente Internet. Basandosi sulla facilità d'uso e sulla estrema funzionalità
fornita dalle porte Universal Serial Bus (USB), eToken non richiede alcuna
ulteriore apparecchiatura per il suo utilizzo.
VANTAGGI permette alle
aziende di eliminare costi, massimizzare la facilità d'uso senza minimamente
ridurre la sicurezza.
L’eToken si basa
sulla pionieristica tecnologia della Aladdin, sviluppata fin dal 1988 per la
protezione del sw per PC e MAC con chiavi USB, che ha permesso di usare con
successo milioni di porte USB in PC, laptop, palmtop.
L’eToken
crittografa informazioni e custodisce chiavi private, password e certificati di
firme digitali in un dispositivo USB della dimensione di una chiave di casa.
² Comprende il protocollo per l’autenticazione DESX a
120 bits.
² Combina grande sicurezza e semplice implementazione
per autenticazione utente, access control, confidenzialità e integrità dei
dati.
² Memorizza e cifra credenziali quali chiavi private,
password, certificati digitali, (memoria 16 K o 32 K).
² Economico e facile da usare.
DESX (DES eXtended) è un algoritmo di cifratura che
estende il DES a una chiave di 120 bits aggiungendo due operazioni complesse
che incrementano sicurezza ed efficienza. Decifrare un messaggio cifrato con il
DESX significa trovare la giusta informazione in 2118 operazioni. E' stato
provato che ciò è matematicamente difficile.
Operating systems |
Windows 98,
Windows NT4.0, Windows 2000, Windows ME |
Certifications &
standards |
PKCS#11
v2.01, CAPI (Microsoft Crypto API), Siemens/Infinion APDU commands PC/SC,
X.509v3 certificates, SSLv3, IPSec/IKE PRO |
Models (by memory
size) |
16 k
& 32k |
On board security
algorithms / processors |
DES-X
120-bit * |
Chip security level |
Secured
and encrypted EEPROM memory chip |
Dimensions |
47 x 16 x 8
mm (1.85 x 0.63 x 0.31 inches) |
Weight |
5g |
Power dissipation |
120mW |
Operating temperature |
0 C to
70 C (32 F to 158 F) |
Storage temperature |
-40 C to
85 C (-40 F to 185 F) |
Humidity rating |
0-100%
without condensation |
Water resistance
certification |
IP X8 – IEC 529 |
Connector |
USB type
A (Universal Serial Bus) |
Casing |
Hard
molded plastic, tamper evident |
Memory data retention |
At least
10 years |
Memory cell rewrites |
At least
100,000 |
² Comprende un chip
crittografico RSA in grado di generare la coppia di chiavi simmetriche; il chip
Siemens SLE66C, è certificato ITSEC E4.
² Tiene traccia delle
manomissioni ed è resistente all’acqua.
² Fornito di memoria a 16K o
32 K.
Operating systems |
Windows
98, Windows NT4.0, Windows 2000, Windows ME |
Certifications &
standards |
PKCS#11
v2.01, CAPI (Microsoft Crypto API), Siemens/Infinion APDU commands PC/SC,
X.509v3 certificates, SSLv3, IPSec/IKE PRO |
Models (by memory
size) |
16 k
& 32k |
On board security
algorithms / processors |
RSA
1024-bit, DES, 3DES (Triple DES) , SHA1, (MD5 - optional) |
Smartcard chip
security level |
Smartcard
chip security level ITSEC LE4 Smart card security certification (infinion). |
Speed |
RSA 1024
Bit signature approx. 1.0 sec RSA 1024 Bit key generation approx.25 sec |
Dimensions |
47 x 16 x 8
mm (1.85 x 0.63 x 0.31 inches) |
ISO specification
support |
Support
for ISO 7816 1-4 specifications. |
Weight |
5g |
Power dissipation |
120mW |
Operating temperature |
0 C to
70 C (32 F to 158 F) |
Storage temperature |
-40 C to
85 C (-40 F to 185 F) |
Humidity rating |
0-100%
without condensation |
Water resistance
certification |
IP X8 – IEC 529 |
Connector |
USB type
A (Universal Serial Bus) |
Casing |
Hard
molded plastic, tamper evident |
Memory data retention |
At least
10 years |
Memory cell rewrites |
At least
100,000 |
1.2
A cosa serve un eToken USB
L’eToken offre soluzioni per
:
² Autenticazione utenti
² Web Access Control
² Applicazioni PKI portabili e salvataggio certificati
digitali
² Sicurezza per accesso remoto
²
Autenticazione utenti
É finito il tempo degli accessi
"password based" che minano la sicurezza aziendale: diversi tools di
eToken Enterprise permettono, tramite eToken, un logon sicuro alla rete basato
su un doppio fattore di autenticazione. eToken fornisce sia autenticazione dell'utente
sul server Web, sia autenticazione del server Web, cioè l'utente può verificare
che il sito Web a cui sta accedendo è veramente quello a cui vuole accedere.
²
Web Access Control
eToken offre un'elevata sicurezza
hardware alle società che effettuano transazioni finanziarie, legali o
commerciali tramite Internet e la cui integrità deve essere garantita.
²
Applicazioni PKI
La ditta
eToken Enterprise offre la possibilità agli utenti di applicazioni PKI, di
salvare a bordo di eToken le credenziali private, di creare un ambiente
applicativo sicuro e di facilitarne notevolmente l'utilizzo.
L'uso più sicuro dell'autenticazione
consiste nell'includere con ogni messaggio firmato il certificato digitale. Chi
riceve il messaggio verifica il certificato utilizzando la chiave pubblica
della Certificate Authority (CA). Se la chiave pubblica del mittente è
legittima, il ricevente verifica la firma del messaggio. Firme digitali create
con chiavi private sono verificate con il certificato digitale che contiene la
chiave pubblica.
²
Sicurezza per accesso remoto
eToken Enterprise offre soluzioni "out of the
box" per la protezione di Intranet ed Extranet.
eToken Enterprise permette di eseguire un logon sicuro
alla VPN di SecuRemote di Checkpoint.
SecuRemote e SecureClient estendono la sicurezza al
desktop e laptop.
Con SecuRemote e SecureClient i dati sono criptati
prima che essi lascino il computer del client.
Programmazione
in Visual Basic e Vbscript
Quelle che vedremo
sono alcune delle funzioni della CryptoAPI usate con l’eToken USB. Infatti le
CriptoAPI sono un’interfaccia di programmazione che fornisce servizi per
autenticazione, codifica e crittografia nelle applicazioni basate su Win32.
I concetti su cui
si basano le CryptoAPI sono:
²
Cryptographic
Service Provider CSP
²
Contesto
Crittografico
Un CSP è un
modulo indipendente che esegue le operazioni crittografiche come ad esempio
creare e distruggere le chiavi. Le CriptoApi permettono di richiamare vari tipi
di CSP: in tal modo il programmatore può sfruttare le funzionalità dei vari
providers usando la stessa interfaccia.Cryptographic Service Provider (CSP).
Il CSP fornisce
una strada sicura per multiple applicazioni per l'accesso a servizi
crittografici e di firma.
Per esempio alcuni CSP richiedono un PIN (Personal Identific Number) prima che una firma digitale è generata dall’user, mentre alcuni richiedono una smart card.
Un Contesto Crittografico è un contenitore di chiavi
(tutti i sistemi di crittografia sono basati sul concetto di chiavi,
simmetriche o asimmetriche); un contenitore può essere usato sia per contenere
la coppia chiave pubblica/chiave privata sia per contenere la sola chiave
pubblica.
Siccome tutte le applicazioni usano chiavi,
prima di usare una delle funzioni della CryptoAPI bisogna acquisire un contesto
crittografico.
È la prima
operazione da fare. Se non si specifica niente, viene usato il contesto di
default.
Questa funzione
acquisisce un handle di un particolare contenitore di chiavi all’interno di un
particolare CSP; restituisce l’handle che può essere usato per
chiamare il CSP selezionato.
Nella libreria wincrypt.h sono definiti i seguenti tipi di dati:
²
HCRYPTPROV è il puntatore al CSP
typedef
unsigned long HCRYPTPROV;
² HCRYPTKEY è usato per rappresentare un puntatore alle chiavi crittografiche per
indicare al modulo CSP quali chiavi vengono usate per eseguire una particolare
operazione. Il CSP non permette all’utente l’accesso diretto alle chiavi ma
solo tramite questi puntatori
typedef
unsigned long HCRYPTKEY;
² HCRYPTHASH è il puntatore all’oggetto hash per indicare al modulo CSP quale
oggetto viene usato per l’esecuzione di una particolare operazione.
Il CSP non permette l’accesso diretto all’hash, bisogna usare questi puntatori
typedef
unsigned long HCRYPTHASH;
I parametri che la funzione
CryptAcquireContext prende sono:
² phProv indirizzo della copia dell’handle del CSP;
² pszContainer è il nome del contenitore
delle chiavi. Il nome è indipendente dal metodo usato per la memorizzazione
delle chiavi. Questo parametro ha valore NULL se si usa il nome di default;
² pszProvider specifica il servizio
crittografico usato. Se il parametro è NULL, si userà il provider di default ;
² dwProvType specifica i tipi di provider.
I possibili valori sono:
o
PROV_RSA_FULL
o
PROV_RSA_SIG
o
PROV_DSS
o
PROV_DSS_DH
o PROV_SSL
² dwFlags questo parametro normalmente è settato a
zero ma alcune applicazioni setteranno uno o più dei seguenti flags:
o
CRYPT_VERIFY_CONTEXT Se settato
allora l’applicazione non avrà accesso alle chiavi private e il parametro pszContainer deve essere settato a NULL.
o
CRYPT_NEW_KEYSET Se settato allora un nuovo contenitore di
chiavi sarà creato con il nome specificato da pszContainer. Se pszcontainer
vale NULL allora il contenitore di chiavi creato avrà il nome di default.
o CRYPT_MACHINE_KEYSET Per default le chiavi sono memorizzate nella
porzione del registro Hkey_Current_User.Questo flag può essere combinato con
tutti gli altri flag indicando che la locazione per la chiave è
Hkey_Local_Machine.
o
CRYPT_DELETE_KEYSET Se settato allora il contenitore di
chiavi specificato dalla funzione pszContainer è cancellato.
La funzione CryptAcquireContext restituisce
TRUE se ha successo
FALSE
altrimenti.
Eventuali errori
possono essere ritrovati grazie alla funzione GetLastError. Questa
funzione non prende parametri e restituisce il codice dell’ultimo errore.
Questa funzione recupera i parametri che controllano le operazioni di un CSP.
Vediamo che la funzione prende come
parametri:
² hProv gestisce il CSP al quale si riferiscono i
parametri;
² dwParam è il numero del parametro;
² pbData è il puntatore ad un buffer che riceve i
dati del parametro specificato. La forma di questi dati cambia a seconda del
numero di parametro scelto;
² pcbData è il puntatore ad una variabile che
specifica la lunghezza in bytes del buffer puntato da pbData. Quando la funzione termina, la variabile puntata dal
parametro pcbData contiene il numero di bytes memorizzati nel buffer. Nota che
quando i dati vengono processati e memorizzati nel buffer, le applicazioni
hanno la necessità di utilizzare l’attuale dimensione dei dati ritornati,
l’attuale dimensione può essere leggermente più piccola rispetto alla
dimensione del buffer specificato sull’input. (sull’input, le dimensioni dei
buffer sono abbastanza grandi per poter inserire nel buffer la maggior quantità
possibile di dati in output.) sull’output, la variabile puntata da questo
puntatore è aggiornata per riflettersi nell’attuale dimensione dei dati copiati
nel buffer;
² dwFlags valori dei flags. A seconda del numero del
parametro specificato possono essere settati diversi flags.
Il numero del
parametro contenuto in dwParam può
essere settato con uno dei seguenti valori:
² PP_CONTAINER nome del contenitore della
chiave. Quando questo parametro è specificato, la funzione riempie il buffer
puntato da pbData con il nome del contenitore della chiave corrente;
² PP_ENUMALGS informazioni sull’algoritmo.
Quando questo parametro è specificato, la funzione riempie il buffer puntato da
pbData con le informazioni su uno degli algoritmi supportati dal CSP;
² PP_IMPTYPE tipi di CSP implementati:
CRYP_IMPL_HARDWARE, CRYPT_IMPL_SOFTWARE, CRYPT_IMPL_MIXED, CRYPT_IMPL_UNKNOWN;
² PP_NAME nome del CSP. Quando questo parametro è
specificato, la funzione riempie il buffer puntato da pbData con il nome del
CSP;
² PP_VERSION numero della versione del
CSP. Il buffer puntato da pbData conterrà un valore DWORD che indica il numero
di versione del CSP.
Il seguente
frammetno di codice indica il formato dei dati che la funzione ritorna nel
buffer pbData
² aiAlgid è l’identificatore dell’algoritmo. Questo è
il valore che viene passato alle funzioni CryptGenKey o CryptCreateHash per
specificare che verrà usato quel particolare algoritmo.
² dwBits il numero di bits nella chiave usata
nell’algoritmo.
² dwNameLen il numero di caratteri nel
nome dell’algoritmo, incluso lo zero terminante.
² szName lo zero terminante il nome dell’algoritmo.
La funzione CryptGetProvParam restituisce
TRUE se ha successo
FALSE
altrimenti.
Per ottenere
maggiori informazioni sull’eventuale errore verificatosi, è possibile usare la
funzione GetLastError
I seguenti sono i
codici di errori che si verificano più di frequente:
² ERROR_INVALID_HANDLE uno dei
parametri specifica un handle non valido
² ERROR_INVALID_PARAMETER uno dei
parametri contiene un valore non valido
² ERROR_MORE_DATA il buffer
specificato dal parametro pbData non
è abbastanza grande per contenere I dati ritornati dalla funzione. In questo
caso, la dimensione in bytes del buffer necessaria per contenere i dati viene memorizzata nella variabile puntata da
pcbData
² ERROR_NO_MORE_ITEMS è stata
raggiunta la fine della lista delle enumerazioni e non è stato posto nessun
dato valido nel buffer pbData.
L’errore è ritornato solo quando il valore del parametro dwParam è PP_ENUMALGS
² NTE_BAD_FLAGS il parametro dwFlags è diverso da zero
² NTE_BAD_TYPE il parametro dwParam specifica un numero di parametro
sconosciuto
² NTE_BAD_UID il contesto CSP specificato
da hProv è non valido.
Nota: i codici di errore con prefisso NTE sono
generati dal particolare CSP che si utilizza.
Questa funzione è
usata per inizializzare l’hashing di un flusso di dati. Essa ritorna al
chiamante un handle ad un oggetto hash CSP. Questo handle può anche essere
usato in una successiva chiamata alla funzione CryptHashSessionKey per flussi
hash di dati e chiavi di sessioni.
I parametri di questa funzione sono:
² hProv handle al CSP ottenuto chiamando la
funzione CryptAcquireContext;
² Algid è
l’identificatore dell’algoritmo di hashing. I valori validi per questo
parametro variano a seconda del CSP che si andrà ad utilizzare;
² hKey se l’algoritmo per l’hashing utilizza una
chiave, questa deve essere passata come parametro alla funzione. Se l’algoritmo
non richiede una chiave allora questo parametro deve essere zero;
² dwFlags è il valore del flag. Questo è un parametro
riservato per usi futuri e dovrebbe sempre essere zero;
² phHash è l’indirizzo al quale la funzione copia il
riferimento a un nuovo oggetto hash creato.
La funzione CryptCreateHash restituisce
TRUE se ha successo
FALSE
altrimenti.
Per ottenere
maggiori informazioni sull’eventuale errore verificatosi, è possibile usare la
funzione GetLastError
I seguenti sono i
codici di errori che si verificano più di frequente:
² ERROR_INVALID_HANDLE uno dei
parametri specifica un handle non valido
² ERROR_INVALID_PARAMETER uno dei
parametri contiene un valore non valido (spesso fa riferimento ad un puntatore
illegale)
² ERROR_NOT_ENOUGH_MEMORY il sistema
operativo lavora in uno spazio di memoria che non è il suo;
² NTE_BAD_ALGID il parametro Algid specifica un algoritmo che il CSP
utilizzato non supporta;
² NTE_BAD_FLAGS il parametro dwFlags è diverso da zero
² NTE_BAD_KEY un algoritmo su chiave hash è
specificato dai parametri Algid e hKey che sono entrambi zero o
specificano un handle non valido;
² NTE_NO_MEMORY il CSP lavora in uno spazio
di memoria non suo.
Questa funzione
genera chiavi crittografiche random per usarle con il modulo CSP. Viene
ritornato un handle della chiave che può essere utilizzato per altre funzioni
CryptoAPI che lo richiedono.
I parametri di questa funzione sono:
² hProv handle ottenuto chiamando la funzione
CryptAcquireContext;
² Algid è l’identificatore dell’algoritmo con il
quale la chiave che si sta generando dovrà essere usata. I valori validi per
questo parametro variano a seconda del CSP che si andrà ad utilizzare;
² dwFlags indica il tipo di chiave che si va a
generare. Il valore può essere zero oppure si possono settare uno o più flags,
in XOR, dei seguenti flags:
o
CRYPT_EXPORTABLE se
questo flag è settato, la chiave può essere trasferita fuori dal CSP in una
chiave blob. Poiché le chiavi di sessioni devono generalmente essere esportabili,
questo flag dovrebbe di solito essere settato si creano le chiavi. Se il flag
non è settato, allora la chiave non
potrà essere esportata. Per le chiavi di sessione, questo significa che la
chiave sarà disponibile solo all’interno della sessione corrente e solo
l’applicazione che l’ha creata, potrà utilizzarla. Per la coppia di chavi
pubblica/privata, questo significa che la chiave privata non può essere
trasportata. Questo flag si applica solo alla chiave di sessione e ai blobs di
chiavi private; no si applica alle chiavi pubbliche in quanto sono sempre
esportabili.
o
CRYPT_CREATE_SALT se
questo flag è settato, allora la chiave sarà automaticamente assegnata ad un
valore salt random. Se questo flag non è settato, alla chiave sarà dato un
valore salt pari a zero
o
CRYPT_NO_SALT specifica
che nessun valore salt viene allocate per una chiave simmetrica a 40 bits
o
CRYPT_USER_PROTECTED se
questo flag è settato, sarà notificato all’utente attraverso un dialog-box o altro metodo che sono state tentate
certe azioni usando questa chiave. Il comportamento è specificato dal CSP in
uso
o
CRYPT_PREGEN specifica
una generazioni di chiavi iniziali con l’uso di Diffide-Hellman o DSS.
² phKey è l’indirizzo al quale la funzione copia
l’handle della chiave che si sta generando.
(il blob è un’area
di memoria che contiene la chiave pubblica o privata)
La funzione
CryptGenKey restituisce
TRUE
se ha successo
FALSE altrimenti.
Per ottenere
maggiori informazioni sull’eventuale errore verificatosi, è possibile usare la
funzione GetLastError
I seguenti sono i
codici di errori che si verificano più di frequente:
² ERROR_INVALID_HANDLE uno dei
parametri specifica un handle non valido
² ERROR_INVALID_PARAMETER uno dei
parametri contiene un valore non valido (spesso fa riferimento ad un puntatore
illegale)
² NTE_BAD_ALGID il parametro Algid specifica un algoritmo che questo
CSP non supporta;
² NTE_BAD_FLAGS il parametro dwFlags contiene un valore non valido;
² NTE_BAD_UID il parametro hProv non contiene un contesto handle
valido;
² NTE_FAIL la funzione fallisce in modo inaspettato.
La funzione
CryptHashSessionKey è usata per computare l’hash crittografico su una chiave.
I parametri di questa funzione sono:
² hHash indica un handle ad un oggetto hash;
² hKey handle all’oggetto key di cui si vuole fare
l’hash;
² dwFlags valori flag. Questo parametro è riservato ad usi futuri e dovrebbe sempre essere
settato a zero.
Se la funzione ha
successo, viene ritornato TRUE; in caso contrario il valore booleano ritornato
da CryptHashSessionKey è FALSE.
Anche in questo
caso, per ottenere maggiori informazioni sull’eventuale errore verificatosi, è
possibile usare la funzione GetLastError
I seguenti sono i
codici di errori che si verificano più di frequente:
² ERROR_INVALID_HANDLE uno dei
parametri specifica un handle non valido
² ERROR_INVALID_PARAMETER uno dei parametri
contiene un valore non valido (spesso fa riferimento ad un puntatore illegale)
² NTE_BAD_ALGID l’handle hHash specifica un algoritmo che il CSP in uso non supporta;
² NTE_BAD_FLAGS il parametro dwFlags non è zero;
² NTE_BAD_HASH l’oggetto hash specificato
dal parametro hHash è non valido;
² NTE_BAD_HASH_STATE si è cercato
di aggiungere dati all’oggetto hash che è già terminato;
² NTE_KEY
è stato usato un algoritmo per
fare l’hash di una chiave ma la chiave di sessione non è più valida. Questo
errore sarà generato se la chiave di sessione viene distrutta prima di aver
completato le operazioni;
² NTE_BAD_UID il contesto CSP che è stato
specificato alla creazione dell’oggetto hash, non può essere trovato;
² NTE_FAIL la funzione fallisce in modo inaspettato.
La funzione
distrugge l’oggetto hash. Dopo che è stato strutto, non può più essere usato.
Tutti gli oggetti
hash dovrebbero essere distrutti con la funzione CryptDestroyHash quando
l’applicazione termina di usarli.
L’unico parametro di questa funzione è
²
hHash è l’handle
dell’oggetto hash che deve essere distrutto.
La funzione CryptDestroyHash restituisce
TRUE
nel caso in cui ha successo
FALSE
altrimenti.
Per avere
informazioni sull’errore verificatosi, possiamo utilizzare anche in questo caso
la funzione GetLastError
Gli errori che si
verificano più di frequente sono:
² ERROR_BUSY l’oggetto hash specificato
dal parametro hHash è correntemente
utilizzato da un altro processo;
² ERROR_INVALID_HANDLE il parametro
hHash specifica un handle non valido;
² ERROR_INVALID_PARAMETER il parametro
hHash contiene un valore non valido;
² NTE_BAD_ALGID l’handle hHash specifica un algoritmo che questo CSP non supporta;
² NTE_BAD_HASH l’oggetto hash specificato
dal parametro hHash è non valido;
² NTE_BAD_UID il contesto CSP che è stato
specificato alla creazione dell’oggetto hash, non può essere trovato.
Quando un oggetto
hash viene distrutto, la memoria del CSP viene liberata.
Dovrebbe esserci
una corrispondenza uno-a-uno tra le
chiamate a CryptCreateHash e CryptDestroyHash.
Questa funzione
rilascia l’handle della chiave; una volta rilasciato, l’handle non è più valido
è non può più essere usato per altre operazioni.
Se l’handle si
riferisce ad una chiave di sessione o ad una chiave pubblica che era stata
importata nel CSP, questa funzione distruggerà la chiave e libererà la memoria
occupata dalla chiave stessa.
Anche in questo caso abbiamo un solo
parametro
²
hKey è l’handle
della chiave che verrà distrutta.
Se la funzione
CryptDestroyKey fallisce, per poter avere informazioni sull’errore verificatosi
la funzione da chiamare è GetLastError
Gli errori più
frequenti sono:
² ERROR_INVALID_HANDLE il parametro
hKey specifica un handle non valido;
² ERROR_INVALID_PARAMETER il parametro
hKey contiene un valore non valido;
² NTE_BAD_KEY il parametro hKey non contiene un handle valido per
la chiave;
² NTE_BAD_UID il contesto CSP che è stato
specificato alla creazione della chiave, non può essere trovato.
Le chiavi occupano
spazio di memoria sia nel sistema operativo che nel CSP. Alcuni CSP sono
implementati in hardware con una risorsa memoria molto limitata. Per questo
motivo, è importante che l’applicazione distrugga tutte le chiavi usando la
funzione CryptDestroyKey una volta terminato di usarle.
Questa funzione è
usata per cifrare i dati. L’algoritmo usato per questo scopo, è indicato dalla
chiave contenuta nel modulo CSP il cui riferimento è indicato dal parametro hKey.
I parametri che questa funzione richiede
sono:
² hKey handle alla chiave da usare per la
cifratura. Un’applicazione ottiene questo handle chiamando la funzione
CryptGenKey;
² hHash è un handle all’oggetto hash. Questo
parametro è usato solo se vengono computati contemporaneamente sia l’hash dei
dati che la cifratura. Se non viene fatto l’hash, questo parametro deve essere
zero;
² Final è un valore booleano che specifica se si
sta cifrando l’ultimo blocco di una serie. Dovrebbe essere posto a TRUE se è
l’ultimo o l’unico blocco e a FALSE altrimenti;
² dwFlags valori dei flags. A seconda del numero del
parametro specificato possono essere settati diversi flags.
² pbData è il buffer che contiene i dati da cifrare.
Dopo che è stata eseguita la cifratura, i dati cifrati, vanno a sostituire i
dati in chiaro nello stesso buffer. La dimensione di questo buffer è
specificata in cbBuffer. Il numero di
bytes di dati che sono stati cifrati, è specificato da pcbData;
² pcbData
è l’indirizzo della lunghezza dei
dati. Prima di chiamare questa funzione, il chiamante dovrà settare questo
parametro con il numero di bytes da cifrare. Questo indirizzo conterrà il
numero di bytes di dati cifrati. Se il buffer specificato da pbData non è abbastanza grande da
contenere i dati, la funzione ritorna un errore ERROR_MORE_DATA
e memorizza la dimensione richiesta, in bytes, del buffer nella variabile
puntata da pcbData. Se pbData è NULL allora non è ritornato
nessun errore e la funzione memorizza la dimensione dei dati, in bytes, nella
variabile puntata da pcbData. Questo
permette ad un’applicazione di determinare la corretta misura del buffer senza
ambiguità;
² cbBuffer
è il numero di bytes nel buffer pbData. Dipende dall’algoritmo usato, il
testo cifrato potrebbe essere leggermente più grande dell’originario testo in
chiaro. In questo caso, il buffer pbData
dovrà essere ridimensionato.
Prima di chiamare
CryptEncrypt, l’applicazione dovrebbe ottenere un handleper l’oggetto hash
chiamando la funzione CryptCreateHash.
Quando dobbiamo
cifrare grosse quantità di dati, lo si può fare dividendo i dati in sezioni.
Questo viene fatto chiamando la funzione CryptEncrypt ripetutamente. Il
parametro Final verrà settato a TRUE
solo quando si cifra l’ultimo blocco quindi con l’ultima chiamata a
CryptEncrypt in modo da terminare il processo di cifratura.
Se la funzione ha
successo, il valore di ritorno è TRUE; se fallisce ritorna FALSE. Per sapere
quale errore si è verificato, basta chiamare la funzione GetLastError
Gli errori che più
frequentemente si verificano per questo tipo di funzione sono i seguenti:
² ERROR_INVALID_HANDLE uno dei
parametri specifica un handle non valido
² ERROR_INVALID_PARAMETER uno dei
parametri contiene un valore non valido (spesso fa riferimento ad un puntatore
illegale)
² NTE_BAD_ALGID la chiave di sessione hKey specifica un algoritmo che il CSP
in uso non supporta;
² NTE_BAD_DATA i dati da cifrare non sono
validi;
² NTE_BAD_FLAGS il parametro dwFlags non è zero;
² NTE_BAD_HASH il parametro hHash contiene un handle non valido;
² NTE_BAD_HASH_STATE si è cercato
di aggiungere dati all’oggetto hash che è già terminato;
² NTE_BAD_KEY il parametro hKey non contiene un handle valido per
la chiave;
² NTE_BAD_LEN la dimensione del buffer
di output è troppo piccola per contenere i dati cifrati che la funzione ha
generato;
² NTE_BAD_UID il contesto CSP che è stato
specificato alla creazione della chiave, non può essere trovato;
² NTE_DOUBLE_ENCRYPT l’applicazione ha tentato
di cifrare gli stessi dati due volte;
² NTE_FAIL la funzione fallisce in modo inaspettato;
² NTE_NO_MEMORY il CSP lavoro in uno
spazio di memoria non suo.
Tale funzione è
utilizzata per decifrare i dati precedentemente cifrati con l’uso della
funzione CryptEncrypt.
I parametri di questa funzione sono:
² hKey handle alla chiave da usare per la
decifratura. Un’applicazione ottiene questo handle chiamando la funzione
CryptGenKey. Questa chiave specifica l’algoritmo di decifratura che si andrà ad
utilizzare;
² hHash è un handle all’oggetto hash. Questo
parametro è usato solo se vengono computati l’hash di dati. Se non viene fatto
l’hash, questo parametro deve essere zero;
² Final è un valore booleano che specifica se si
sta decifrando l’ultimo blocco di una serie. Dovrebbe essere posto a TRUE se è
l’ultimo o l’unico blocco e a FALSE altrimenti;
² dwFlags valori dei flags. Questo parametro è
utilizzato per usi futuri e dovrebbe sempre essere posto a zero;
² pbData è il buffer che contiene i dati da
decifrare. Dopo che è stata eseguita la decifratura, il testo in chiaro verrà
memorizzato nello stesso buffer. Il numero di bytes di dati che sono stati
decifrati, è specificato da pcbData;
² pcbData
è l’indirizzo della lunghezza dei
dati. Prima di chiamare questa funzione, il chiamante dovrà settare questo
parametro con il numero di bytes da cifrare. Questo indirizzo conterrà il
numero di bytes di dati cifrati. Se il buffer specificato da pbData non è abbastanza grande da
contenere i dati, la funzione ritorna un errore ERROR_MORE_DATA
e memorizza la dimensione richiesta, in bytes, del buffer nella variabile
puntata da pcbData. Se pbData è NULL allora non è ritornato
nessun errore e la funzione memorizza la dimensione dei dati, in bytes, nella
variabile puntata da pcbData. Questo
permette ad un’applicazione di determinare la corretta misura del buffer senza
ambiguità.
Anche in questo
caso, se bisogna decifrare una grande quantità di dati si può operare per
blocchi come avviene per la cifratura con la funzione CryptEncrypt.
Gli errori che più
di frequente si verificano per la funzione CryptDecrypt sono:
² ERROR_INVALID_HANDLE uno dei
parametri specifica un handle non valido
² ERROR_INVALID_PARAMETER uno dei
parametri contiene un valore non valido (spesso fa riferimento ad un puntatore
illegale)
² NTE_BAD_ALGID la chiave di sessione hKey specifica un algoritmo che il CSP
in uso non supporta;
² NTE_BAD_DATA i dati da decifrare non sono
validi;
² NTE_BAD_FLAGS il parametro dwFlags non è zero;
² NTE_BAD_HASH il parametro hHash contiene un handle non valido;
² NTE_BAD_KEY il parametro hKey non contiene un handle valido per
la chiave;
² NTE_BAD_LEN la dimensione del buffer
di output è troppo piccola per contenere il testo in chiaro che la funzione ha
generato;
² NTE_BAD_UID il contesto CSP che è stato
specificato alla creazione della chiave, non può essere trovato;
² NTE_DOUBLE_ENCRYPT l’applicazione ha tentato
di decifrare gli stessi dati due volte;
² NTE_FAIL la funzione fallisce in modo inaspettato.
Una volta
completate tutte le operazioni bisogna rilasciare il contesto acquisito con la
funzione CryptAcquireContext e questo lo si può fare con la funzione
CryptReleaseContext.
Questa funzione
infatti, è utilizzata per il rilascio di un handle e di un contenitore di
chiavi. Dopo che questa funzione è stata chiamata, l’handle CSP specificato dal
parametro hProv non sarà più valido.
Né il contenitore delle chiavi né alcuna coppia di chiavi sono distrutti da
questa funzione.
I parametri usati
in questa funzione sono:
² hProv handle all’applicazione CSP. Questo handle
è ottenuto chiamando la funzione CryptAcquireContext;
² dwFlags valori del flag. Questo parametro è riservato
per usi futuri e dovrebbe sempre essere zero.
Se la funzione ha
successo il valore ritornato è TRUE.
In caso contrario
la funzione ritorna FALSE e gli errori che più comunemente vengono fatti sono:
² ERROR_BUSY il contesto CSP specificato
da hProv è correntemente utilizzato
da un altro processo;
² ERROR_INVALID_HANDLE uno dei
parametri specifica un handle non valido
² ERROR_INVALID_PARAMETER uno dei
parametri contiene un valore non valido (spesso fa riferimento ad un puntatore
illegale)
² NTE_BAD_FLAGS il parametro dwFlags non è zero;
² NTE_BAD_HASH il parametro hHash contiene un handle non valido;
² NTE_BAD_UID il parametro hProv non contiene un contesto handle
valido.
Dopo che questa
funzione è stata chiamata, la sessione terminata, e tutte le chiavi di sessioni
esistenti e gli oggetti hash creati
usando l’handle hProv diventano non
validi. In pratica, tutti questi oggetti dovrebbero essere distrutti con CryptDestroyKey e CryptDestroyHash prima
che venga chiamata la funzione CryptReleaseContext.
Applichiamo ora le funzioni analizzate all’eToken
PRO USB della Aladdin.
È anche utile
permettere alle applicazioni di accedere all’eToken tramite un ambiente di
scripting. Molte delle API sono librerie C/C++ che sono molto difficili da
usare per questi ambienti.
eTocx sono state create per risolvere questo problema.
I requisiti
delle eTocx sono:
² offrono un semplice, potente API per accedere agli
eToken da ambienti basati su Web;
² supportano entrambi i tipi di eToken: etoken PRO(OS4)
e eToken R2;
² supportano più eToken e le smart card in lettura.
eTocx è un
controllo automatico Active-X) tutte le interfacce sono specificatamente
designate per incontrare i criteri di automazione così da poter essere usato
per una ampia varietà di linguaggi di scripting.
Gli esempi
riguardano il linguaggio di scripting VBscript.
Prenderemo in
esame
²
la configurazione
dell’eToken PRO;
²
la configurazione della
password per l’eToken PRO;
²
la manipolazione dei
file binari.
CONFIGURAZIONE DELL’eToken PRO
Si può vedere che
dalla riga 9 alla riga 43
viene indicato il linguaggio di scripting usato.
Tralasciamo ciò
che riguarda l’HTML e passiamo al linguaggio di nostro interesse.
Nelle righe 11 e 12 vengono
dichiarate due variabili token e conf . La parola chiave Dim sta per
dimensione. Quando si dichiara una variabile, la quantità riservata dipende dal
tipo di dati. Nel nostro caso non è specificato alcun tipo ciò significa che le
variabili assumono il tipo di default cioè variant.
Un variant contenente
o stringhe occupa 22 bytes+1 byte per ogni carattere
nella stringa;
o numeri occupa 16 bytes di memoria.
Nella riga 13 viene usata l’istruzione On error …. Si deve inserire questa istruzione all’inizio di
qualsiasi routine in cui si possono verificare degli errori. Nel nostro caso
viene utilizzata l’opzione Resume Next
di gestione degli errori che fa in modo che l’esecuzione salti alla riga che ha
causato l’errore e prosegua con la successiva riga di codice.
Alla riga 14 viene fatto un assegnamento con l’istruzione set
in quanto trattasi di una variabile oggetto. Viene avviata l’applicazione
creando l’oggetto eToken PRO. A questo punto è possibile fare riferimento
all’oggetto utilizzando la variabile token
definita precedentemente. Questa variabile potrà poi essere usata per accedere
alle proprietà e ai metodi del nuovo oggetto eToken PRO.
Bisogna dire a
questo punto che, prima di chiamare i metodi per accedere all’eToken, bisogna
usare il metodo attach(). Una volta
finito di accedere all’eToken, bisogna chiamare il metodo detach(). Per evitare che altre applicazioni accedano all’eToken
mentre ci si sta lavorando, bisogna chiamare il metodo lock() e rilasciarlo, una volta finito di usarlo, chiamando unlock(). Quindi la sequenza di
operazioni da effettuare è
Con la riga 16 viene attaccato l’oggetto token alla portaUSB. Nella riga 19
l’oggetto token viene bloccato con lock(). Con il metodo unlock() chiamato alla riga 30, viene rilasciata la risorsa eToken e alla riga 33 viene rilasciata completamente con l’uso del
metodo detach(). La sequenza è stata
rispettata.
Passiamo ora a
vedere ciò che succede dal momento in cui viene chiamato attach() fino a quando l’oggetto token è rilasciato.
Alla riga 22 viene assegnato all’oggetto conf la configurazione dell’eToken. Una volta fatta questa operazione,
è possibile conoscere alcune proprietà dell’eToken come
² il numero che identifica univocamente l’eToken usando
il metodo tokenID
dell’oggetto conf (riga 25);
² il colore dell’eToken con il metodo color
(riga 27).
Nella parte di
codice che va dalla riga 35 alla riga 39 vengono gestiti eventuali errori.
Con le righe 40 e 41 le variabili conf e token vengono impostate a Nothing. Questo significa che il riferimento
all’oggetto termina e le risorse del sistema vengono liberate.
Alle righe 11
e 12 vengono dichiarate le variabili ba e
token. A queste variabili vengono assegnati, rispettivamente alle righe 14 e 15, un oggetto
eToken PRO e un byte di array con il metodo CreateObject.
Viene effettuata la sequenza di operazioni
indicata precedentemente e all’interno viene fatto il login e il logout con la
password. Alla riga 23 viene inserita la password
1234567890 e viene effettuato il login (riga 24) con questa password.
È anche possibile cambiare password con il
metodo changePassword. Nel nostro
esempio viene cambiata la password 1234567890 con 1111 alla riga 28 e viene fatto il login con la nuova password.
Una volta terminate le operazioni che
riguardano la password per l’eToken
bisogna fare il logout come in riga 40.
Una volta terminato il tutto troviamo le
funzioni unlock() seguita da detach().
Le righe 48-52 gestiscono l’errore eventualmente verificatosi.
Con questo programma è possibile verificare
l’esistenza di un file, creare un file, cancellare, creare una directory,
scrivere/leggere da un file. Il codice è il seguente
Questa è la parte di HTML con l’indicazione
del linguaggio di script utilizzato.
Vediamo nel particolare il contenuto di
questo blocco
Troviamo la
definizione di un’altra funzione nelle linee 8-13. Questa funzione, tramite un ciclo for, stampa il
contenuto dell’array preso come parametro, trasformandolo in una stringa di
caratteri con l’utilizzo della funzione Chr() della linea 11.
Nelle successive
tre righe vengono dichiarate le variabili ba,
token e dataRead.
Vengono chiamati i
metodi attach(), loch() e poi viene fatto il login con la password 1234567890.
Si può verificare
se esiste un certo file nell’eToken. Questo viene fatto alla riga 31. nel nostro esempio, se questo particolare file
esiste viene cancellato con il metodo del
alla riga 33.
Oltre alla
possibilità di cancellare un file, possiamo anche creare un file e questo viene
fatto, nel nostro codice, alla linea 37. viene
creato un file binario con il nome indicato tra virgolette.
Oltre a creare un
file, si può anche creare una directory come avviene alla riga 41.
Alla riga 48 si effettua una scrittura nel file binario
indicato dalla variabile ba. E alla
riga 49.a viene effettuata una lettura e si
assegna il contenuto alla variabile readData
dichiarata all’inizio.
E ancora una volta
troviamo il logout, il metodo unloch()
e detach().
La parte di codice
per la gestione dell’errore è la seguente