Modos privados:
Modos de integridad:
Para la buena utilización de los dos métodos basados en passwords, lo usual es que el password de integridad y de confidencialidad sean distintos.
Las combinaciones de estos cuatro modos están puestas como buenas en el estándar. No obstante una buena política de seguridad nos sugiere que evitemos ciertas acciones, por ejemplo, puede ser imprudente el transportar claves privadas sin una protección física cuando utilizamos el modo privado de passwords o el modo privado de llave pública con criptografía débil. Aunque ésto sería lo deseable, algunos países -EEUU- no dejan enviar datos con cifrado fuerte al extrajero, no pudiendo hacer caso de éstos consejos por inflingir la ley.
De todos modos, el uso de clave pública es preferible al de passwords en los dos casos - provecidad e integridad - aunque hay casos en los que no se puede utilizar, por ejemplo cuando enviamos información a la plataforma destino por primera vez, no tenemos nigún certificado de ella ni ella tiene ninguno nuestro, y seria una barbarie el enviarlo sin cifrar, por tanto se utilizan los passwords para hacer ese trabajo, la integridad de la información y su privacidad.
Es apropiado el utilizar llaves específicas para cada plataforma para el envio y recepción de datos de tipo personal, ya que no deben confundirse con las llaves pública y privada que el usuario en particular quiere enviar y/o recibir de una plataforam a otra, ya que éstas llaves están incluidas con el PDU.
Para la confidencialidad en este modo - clave publica-privada - la llave privada del par debe estar en la plataforma destino y la pública en el origen, ya que utilizamos para cifrar siempre la clave pública del destinatario y para descifrar, nuestra propia clave privada, al cotrario pasa cuando hablamos de integridad - o autentificación - ya que el que lo firma, utiliza su clave privada entonces, utilizando la nomenclatura que habiamos usado antes, la clave privada estará en poder de la plataforma origen y la pública en la de destino. Como deducimos, para utilizar los dos modos -integridad y privacidad - la clave pública de la plataforma destino debe estar también en la de origen, para que la plataforma origen pueda cifrar - con la clave pública de la plataforma destino - y firmar - con su propia clave privada - .Ésta plataforma origen, tal como la plataforma destino le envie su clave pública, la deberá contrastar, como se explica en el documento PKCS #7.
La Autentificación consiste em una secuencia de valores tipo ContentInfo algunos de los cuales son texto plano - Tipo Data - , empaquetados - Tipo EnvelopedData - o cifrados - Tipo EncryptedData -. Si el tipo de datos es EnvelopedData, se genera una clave de sesión aleatoria, usada para cifrar los datos, que se cifra con la clave pública de la plataforma destino. La plataforma destino descifrará la clave de sesión y con ella descifrará el resto de los datos. Si el tipo de datos es cifrado como - EncryptedData - entonces se encriptan bajo una llave generada en base al password y otros campos mediante un algoritmo de cifrado simétrico.
Cada valor ContentInfo puede contener
una colección arbitraria de claves privadas, certificados tipo PKCS
#8 conteniendo claves privadas, certificados, CRLs - Certificates Revocation
Lists - o tipos opacos de objetos , todo esto se almacena en valores del
tipo SafeContents. La razón de que
existan en estos objetos datos no cifrados es por lo que ya comentabamos
antes, por las restricciones que algunos paises hacen hacia la criptografía
de esto que se creen la Autentificación
multi-part.
AuthenticatedSafe ::= SEQUENCE OF ContentInfo
-- Data si no utilizamos el cifrado
-- EncryptedData si utilizamos
el cifrado por password
-- EnvelopedData si utilizamos
el cifrado por clave pública
Un tipo AutenticatedSafe contiene un secuencia de valores del tipo ContentInfo. El campo content de estos valores ContentInfo pueden contener Data, EncryptedData o EnvelopedData. En el caso de que utilicemos datos empaquetados -enveloped - o cifrados -encrypted - , el texto en claro de los datos contendrá la codificación BER de los SafeContents o contenidos seguros.
SafeBag ::= SEQUENCE {
bagId BAG-TYPE.&id ({PKCS12BagSet})
bagValue [0] EXPLICIT BAG-TYPE.&Type({PKCS12BagSet}{@bagId}),
bagAttributes SET OF PKCS12Attribute
OPTIONAL
}
PKCS12Attribute ::= SEQUENCE {
attrId ATTRIBUTE.&id ({PKCS12AttrSet}),
attrValues SET OF ATTRIBUTE.&Type
({PKCS12AttrSet}{@attrId})
}
-- Este tipo es compatible con
los tipos Atributo del X.500
PKCS12AttrSet ATTRIBUTE ::= {
friendlyName | -- de los PKCS
#9
localKeyId, -- de los PKCS #9
... -- Otros atributos están
permitidos
}
Los atributos opcionales de SafeBag permite a los usuarios el asignar
alias - o nicks - o identificadores a las llaves , ... y permite
a las herramientas visuales el enseñar cadenas conocidas de cada
tipo al usuario.
Hay 6 tipos de bolsas seguras:
bagtypes OBJECT IDENTIFIER ::= {pkcs-12 10 1}
BAG-TYPE ::= TYPE-IDENTIFIER
keyBag BAG-TYPE ::= {KeyBag IDENTIFIED BY {bagtypes
1}}
pkcs8ShroudedKeyBag BAG-TYPE ::= {PKCS8ShroudedKeyBag
IDENTIFIED BY {bagtypes 2}}
certBag BAG-TYPE ::= {CertBag IDENTIFIED BY {bagtypes
3}}
crlBag BAG-TYPE ::= {CRLBag IDENTIFIED BY {bagtypes
4}}
secretBag BAG-TYPE ::= {SecretBag IDENTIFIED BY {bagtypes
5}}
safeContentsBag BAG-TYPE ::= {SafeContents IDENTIFIED
BY {bagtypes 6}}
PKCS12BagSet BAG-TYPE ::= {
keyBag |
pkcs8ShroudedKeyBag |
certBag |
crlBag |
secretBag |
safeContentsBag,
... -- Para futuras ampliaciones
}
KeyBag ::= PrivateKeyInfo
PKCS8ShroudedKeyBag ::= EncryptedPrivateKeyInfo
x509Certificate BAG-TYPE ::= {OCTET
STRING IDENTIFIED BY {certTypes 1}}
-- Codificación en DER
de un certificado X.509 que se guarda en OCTET STRING
sdsiCertificate BAG-TYPE ::= {IA5String
IDENTIFIED BY {certTypes 2}}
-- Codificación en Base64
de certificados SDSI guardado en IA5String CertTypes
BAG-TYPE ::= {
x509Certificate |
sdsiCertificate,
... -- Para futuras ampliaciones
}
x509CRL BAG-TYPE ::= {OCTET STRING IDENTIFIED BY {certTypes
1}
-- codificación en DER de un lista de certificados
revocados X.509 guardada en OCTET STRING
CRLTypes BAG-TYPE ::= {
x509CRL,
... -- Para futuras ampliaciones
}
SecretTypes BAG-TYPE ::= {
... -- Para futuras ampliaciones
}
Debemos tener mucho cuidado cuando la aplicación necesita machacar datos que ya estaban localmente instalados, ya que un usuario puede tener varios tipos de información sensible de ser utilizada - certificados, llaves ... -. La aplicación deberá saber el trato que se le ha de hacer a determinados datos, ya que se deberán tratar de forma diferente según el tipo que sean - por ejemplo, no es lo mismo machacar una llave privada que una lista de certificados revocados -. Un comportamiento apropiado de la aplicación sería alertarnos de qué es lo que se va a sobreescribir y darnos a nosotros la opción de sobreescribirlo o no.
Aquí se utiliza una función en particular llamada HMAC, o funcion hash con MAC, que puede ser utilizada con varias funciones de hash. La función HMAC se basa en su identificador en el campo MacData que contiene el MAC en sí. Para la versión en la que se basa este documento se utiliza la función SHA-1; esto implica que SHA-1 se aplica para derivar el password -MAC key- en si mismo utilizando el modo de integridad por password y que el password tiene 160 bits.
Cuando se utiliza el modo de integridad por password para proteger un PFX PDU, la función SHA-1 HMAC se calcula en base a la codificación en BER del contenido del campo content del campo authSafe del PFX PDU.
DEFINITIONS IMPLICIT TAGS ::=
BEGIN
-- EXPORTS ALL
-- Todos los tipos y valorres definidos en este módulo
son exportados para su uso en otros módulos ASN.1
IMPORTS
informationFramework
FROM UsefulDefinitions {joint-iso-itu-t(2)
ds(5) module(1) usefulDefinitions(0) 3}
ATTRIBUTE
FROM InformationFramework informationFramework
ContentInfo, DigestInfo
FROM PKCS-7 {iso(1) member-body(2)
us(840) rsadsi(113549) pkcs(1) pkcs-7(7) modules(0) pkcs-7(1)}
PrivateKeyInfo, EncryptedPrivateKeyInfo
FROM PKCS-8 {iso(1) member-body(2)
us(840) rsadsi(113549) pkcs(1) pkcs-8(8) modules(1) pkcs-8(1)}
pkcs-9, friendlyName, localKeyId, certTypes, crlTypes
FROM PKCS-9 {iso(1) member-body(2)
us(840) rsadsi(113549) pkcs(1) pkcs-9(9) modules(0) pkcs-9(1)};
-- Identificadores de Objetos
rsadsi OBJECT IDENTIFIER ::= {iso(1) member-body(2)
us(840) rsadsi(113549)}
pkcs OBJECT IDENTIFIER ::= {rsadsi pkcs(1)}
pkcs-12 OBJECT IDENTIFIER ::= {pkcs 12}
pkcs-12PbeIds OBJECT IDENTIFIER ::= {pkcs-12 1}
pbeWithSHAAnd128BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds
1}
pbeWithSHAAnd40BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds
2}
pbeWithSHAAnd3-KeyTripleDES-CBCOBJECT IDENTIFIER
::= {pkcs-12PbeIds 3}
pbeWithSHAAnd2-KeyTripleDES-CBCOBJECT IDENTIFIER
::= {pkcs-12PbeIds 4}
pbeWithSHAAnd128BitRC2-CBC OBJECT IDENTIFIER ::=
{pkcs-12PbeIds 5}
pbewithSHAAnd40BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds
6}
bagtypes OBJECT IDENTIFIER ::= {pkcs-12 10 1}
-- El PFX PDU en sí
PFX ::= SEQUENCE {
version INTEGER {v3(3)}(v3,...),
authSafe ContentInfo,
macData MacData OPTIONAL
}
MacData ::= SEQUENCE {
mac DigestInfo,
macSalt OCTET STRING,
iterations INTEGER DEFAULT 1
-- El valor por defecto es por
razones
históricas, que hoy por hoy está en desuso, se recomienda
un valor mayor como 1024
}
AuthenticatedSafe ::= SEQUENCE OF ContentInfo
-- Data si no está cifrado
-- EncryptedData si está
protegido por password
-- EnvelopedData si está
protegido mediante llave pública
SafeContents ::= SEQUENCE OF SafeBag
SafeBag ::= SEQUENCE {
bagId BAG-TYPE.&id ({PKCS12BagSet}),
bagValue [0] EXPLICIT BAG-TYPE.&Type({PKCS12BagSet}{@bagId}),
bagAttributes SET OF PKCS12Attribute
OPTIONAL
}
-- Tipos de Bolsas
keyBag BAG-TYPE ::= {KeyBag IDENTIFIED BY {bagtypes
1}}
pkcs-8ShroudedKeyBag BAG-TYPE ::= {PKCS8ShroudedKeyBag
IDENTIFIED BY {bagtypes 2}}
certBag BAG-TYPE ::= {CertBag IDENTIFIED BY {bagtypes
3}}
crlBag BAG-TYPE ::= {CRLBag IDENTIFIED BY {bagtypes
4}}
secretBag BAG-TYPE ::= {SecretBag IDENTIFIED BY {bagtypes
5}}
safeContentsBag BAG-TYPE ::= {SafeContents IDENTIFIED
BY {bagtypes 6}}
PKCS12BagSet BAG-TYPE ::= {
keyBag |
pkcs8ShroudedKeyBag |
certBag |
crlBag |
secretBag |
safeContentsBag,
... -- For future extensions
}
BAG-TYPE ::= TYPE-IDENTIFIER
-- Tipo de bolsa KeyBag
KeyBag ::= PrivateKeyInfo
-- Tipo de bolsa Shrouded KeyBag
PKCS8ShroudedKeyBag ::= EncryptedPrivateKeyInfo
-- Tipo de bolsa CertBag
CertBag ::= SEQUENCE {
certId BAG-TYPE.&id ({CertTypes}),
certValue [0] EXPLICIT BAG-TYPE.&Type
({CertTypes}{@certId})
}
x509Certificate BAG-TYPE ::= {OCTET STRING IDENTIFIED
BY {certTypes 1}}
-- La codificación DER de un certificado X.509
se guarda en OCTET STRING
sdsiCertificate BAG-TYPE ::= {IA5String IDENTIFIED
BY {certTypes 2}}
-- La codificación en Base64 de un certificado
SDSI se guarda en IA5String
CertTypes BAG-TYPE ::= {
x509Certificate |
sdsiCertificate,
...
-- Para futuras extensiones
}
-- Tipo de bolsa CRLBag
CRLBag ::= SEQUENCE {
crlId BAG-TYPE.&id ({CRLTypes}),
crltValue [0] EXPLICIT BAG-TYPE.&Type
({CRLTypes}{@crlId})
}
x509CRL BAG-TYPE ::={
OCTET STRING IDENTIFIED BY {certTypes
1}
}
-- La codificación DER de una lista de certificados
revocados X.509 se guarda en OCTET STRING
CRLTypes BAG-TYPE ::= {
x509CRL,
...
-- para futuras extensiones
}
-- Tipo de bolsa Secret Bag
SecretBag ::= SEQUENCE {
secretTypeId BAG-TYPE.&id
({SecretTypes}),
secretValue [0] EXPLICIT BAG-TYPE.&Type
({SecretTypes}{@secretTypeId})
}
SecretTypes BAG-TYPE ::= {
...
-- para futuras extensiones
}
-- Atributos
PKCS12Attribute ::= SEQUENCE {
attrId ATTRIBUTE.&id ({PKCS12AttrSet}),
attrValues SET OF ATTRIBUTE.&Type
({PKCS12AttrSet}{@attrId})
}
-- Este tipo es compatible con el tipo de atributo
X.500
PKCS12AttrSet ATTRIBUTE ::= {
friendlyName |
localKeyId,
...
-- Se permiten otros tipos de
atributos
}
END