Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El término PIN se heredó de la industria bancaria debido a su primer uso en el teclado numérico de las máquinas ATM. Otra documentación del sector usa el término verificación del titular de la tarjeta (CHV). Se entiende que el formato de datos no es solo numérico, sino que puede ser cualquier cosa que el usuario pueda proporcionar dados los medios a su disposición. El valor que se pasa como datos de PIN está restringido por consideraciones de interoperabilidad al juego de caracteres de un solo byte ANSI.
La autenticación del usuario difiere en gran medida de la autenticación del administrador en que el usuario normalmente no tiene privilegios para poseer el secreto de autenticación administrativa. Esto tiene muchas implicaciones sobre qué tipo de datos se pueden usar para esto y cómo se va a controlar. Si el secreto administrativo se usa en el equipo cliente para hacer algo como desbloquear la tarjeta de un usuario con asistencia de una autoridad central, estos datos deben transmitirse de forma segura a la tarjeta sin ninguna posibilidad de divulgación o ser completamente efímeros para que no tenga ningún valor fuera de la transacción actual. La dificultad de organizar la transmisión segura a la tarjeta es por qué no se recomienda el uso de un PIN para autenticar al administrador.
Una autenticación solo es válida dentro de una transacción, para evitar que otra aplicación secuestre una sesión autenticada. La desautenticación se produce automáticamente al finalizar una transacción.
El cambio del PIN debe invalidar el token seguro.
Definiciones generales
Se definen dos tipos de datos para PIN: uno para describir pin individuales asociados a roles y PIN_SET que se usa para una máscara de bits con identificadores PIN. Además, hemos dejado de tener cadenas para los nombres de usuario e introducir números de rol que se traducen en identificadores de PIN. También definimos dos marcas para la operación de cambio de PIN que se explican más adelante en esta especificación.
typedef DWORD PIN_ID, *PPIN_ID;
typedef DWORD PIN_SET, *PPIN_SET;
#define MAX_PINS 8
#define ROLE_EVERYONE 0
#define ROLE_USER 1
#define ROLE_ADMIN 2
#define PIN_SET_ALL_ROLES 0xFF
#define CREATE_PIN_SET(PinId) (1 << PinId)
#define SET_PIN(PinSet, PinId) PinSet |= CREATE_PIN_SET(PinId)
#define IS_PIN_SET(PinSet, PinId) (0 != (PinSet & CREATE_PIN_SET(PinId)))
#define CLEAR_PIN(PinSet, PinId) PinSet &= ~CREATE_PIN_SET(PinId)
#define PIN_CHANGE_FLAG_UNBLOCK 0x01
#define PIN_CHANGE_FLAG_CHANGEPIN 0x02
Para ser funcionalmente equivalente a las tarjetas minidriver actuales, todas las tarjetas deben aprovisionarse con al menos tres roles: ROLE_EVERYONE, ROLE_USER y ROLE_ADMIN. Cada rol es equivalente a un PIN_ID en la tarjeta. Solo hay un verdadero rol de administrador para una tarjeta, pero puede haber varios roles que puedan desbloquear otros roles. Sin embargo, solo un rol debe controlar el acceso para realizar operaciones de nivel de administrador, como eliminar el sistema de archivos, y esto es ROLE_ADMIN. Además, ROLE_ADMIN deben poder desbloquear ROLE_USER. También hay un rol de usuario que proporciona acceso al sistema de archivos para una tarjeta. Los roles adicionales del 3 al 7 son opcionales y solo se pueden asociar a contenedores de claves.
Para obtener consideraciones especiales que se pueden aplicar a las tarjetas de solo lectura, vea "Tarjetas de solo lectura" más adelante en esta especificación.
SECRET_TYPE
En la enumeración siguiente se describe el tipo de PIN.
typedef enum
{
AlphaNumericPinType = 0, // Regular PIN
ExternalPinType, // External PIN
ChallengeResponsePinType, // Challenge/Response PIN
EmptyPinType // No PIN
} SECRET_TYPE;
Nota Al encontrar pin SECRET_TYPEEmptyPinType, Windows no solicita pin ni llama a CardAuthenticatePin o CardAuthenticatePinEx. Esta configuración es útil cuando se desea un acceso incondicional al material de la tarjeta.
SECRET_PURPOSE
La estructura de datos de PIN_INFO usa la enumeración siguiente para describir el propósito del PIN con fines de información del usuario.
typedef enum
{
AuthenticationPin, // Authentication PIN
DigitalSignaturePin, // Digital Signature PIN
EncryptionPin, // Encryption PIN
NonRepudiationPin, // Non Repudiation PIN
AdministratorPin, // Administrator PIN
PrimaryCardPin,
UnblockOnlyPin // Unblocking other PINs
} SECRET_PURPOSE;
Windows usa el valor de enumeración para mostrar un mensaje adecuado al usuario que describe qué PIN de tarjeta se solicita actualmente. El minidriver controla completamente qué SECRET_TYPE usar. A continuación se muestra una ilustración de un cuadro de diálogo de solicitud de PIN que incluye cadenas de contexto de ejemplo.
Primera cadena de la figura ("Entrar PIN. La aplicación que realiza la llamada proporciona la inscripción para: BaseRSASmartcardLogon") para proporcionar contexto de aplicación. Si no existe ninguna cadena de contexto de aplicación, el cuadro de diálogo muestra un texto estándar.
La segunda cadena ("Escriba el PIN de autenticación") está controlada por SECRET_PURPOSE de una de las siguientes maneras:
Cadenas de contexto predeterminadas
De forma predeterminada, el CSP base muestra las siguientes cadenas predefinidas, que se localizan correctamente.
Nombre de la cadena String AuthenticationPin "Escriba el PIN de autenticación". DigitalSignaturePin "Escriba su PIN de firma digital". EncryptionPin "Escriba el PIN de cifrado". NonRepudiationPin "Escriba su PIN de no rechazo." AdministratorPin "Escriba el PIN del administrador". PrimaryCardPin "Escriba su PIN". UnblockOnlyPin "Escriba el PIN para desbloquear el PIN de usuario". Cadenas personalizadas
Los desarrolladores pueden invalidar las cadenas de contexto predeterminadas estableciendo cadenas personalizadas en los siguientes valores del Registro de la clave del Registro del minidriver (HKLM\Software\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\XYZ, donde XYZ es el nombre del minidriver de tarjeta).
Para invalidar una cadena de contexto predefinida, agregue un valor de cadena del Registro a la clave del Registro del minidriver con la cadena personalizada. Nombre de los conjuntos de claves que SECRET_PURPOSE cadena de contexto predefinida se está reemplazando, con 0x80000100 que corresponde al primer miembro de SECRET_TYPE y versiones posteriores. No es posible invalidar solo una cadena, algunas o todas las cadenas de contexto.
El valor de la cadena debe seguir el siguiente formato:
“LangID,xxxx;LangID,xxxxx”
Nota Las comillas alrededor de la cadena personalizada no se controlan correctamente y no deben basarse en para evitar el análisis de caracteres especiales dentro de la cadena.
Nota La inclusión de dos cadenas personalizadas diferentes para la misma configuración regional da como resultado la primera cadena personalizada que se recoge.
La tercera cadena del cuadro de diálogo ("PIN de firma digital") es una cadena predefinida determinada por el valor SECRET_PURPOSE de la estructura de datos PIN_INFO .
Para UnblockOnlyPin, el propósito previsto es desbloquear el PIN de usuario. Este PIN no se debe usar para ningún otro propósito.
PIN_CACHE_POLICY_TYPE
En la enumeración siguiente se describe la directiva de almacenamiento en caché de PIN que se va a asociar a este PIN.
typedef enum
{
PinCacheNormal = 0,
PinCacheTimed,
PinCacheNone,
PinCacheAlwaysPrompt
} PIN_CACHE_POLICY_TYPE;
En la tabla siguiente se describe cómo actúa el CSP base en los tres modos de caché diferentes.
Modo de caché | Descripción |
---|---|
PinCacheNormal | Para este modo, el PIN se almacena en caché mediante el CSP base por proceso por identificador de inicio de sesión. |
PinCacheTimed | Para este modo, el PIN se invalida después de un período de tiempo indicado (el valor se proporciona en segundos). Esto se implementó mediante la grabación de la marca de tiempo cuando se agrega el PIN a la memoria caché y, a continuación, comprueba esta marca de tiempo frente a la hora a la que se accede al PIN. Esto significa que el PIN puede estar en la memoria caché durante más tiempo que la marca de tiempo especificada, pero no se usa después de que haya expirado. El PIN se cifra en memoria para mantenerlo protegido. |
PinCacheNone | Cuando no se puede almacenar en caché el PIN, CSP base nunca agrega el PIN a la memoria caché. Cuando se llama al CSP/KSP base con CryptSetProvParam para establecer un PIN, el PIN se envía a la tarjeta para la comprobación, pero no se almacena en caché. Esto significa que las operaciones posteriores deben producirse antes de que expire el tiempo de espera de la transacción csp base. |
PinCacheAlwaysPrompt | A diferencia de PinCacheNone, cuando se establece este modo de caché, el tiempo de espera de transacción de CSP base no es aplicable. El PIN se recopila del usuario y, a continuación, se envía a la tarjeta para la verificación antes de cada llamada que requiera autenticación. Llama a CryptSetProvParam y NcryptSetProperty para establecer el PIN devuelto ERROR_SUCCESS sin comprobar y almacenar en caché el PIN. Esto implica que las llamadas de aplicaciones que usan contextos silenciosos producirán un error si la llamada requiere autenticación. |
Nota Es posible que el inicio de sesión de Windows no funcione correctamente si no se almacena en caché un PIN. Este comportamiento es así por diseño. Por lo tanto, se debe tener cuidado al establecer un modo de caché de PIN en cualquier valor distinto de PinCacheNormal.
PIN_CACHE_POLICY
La estructura de directivas de caché de PIN contiene información que describe la directiva de caché de PIN. Describe el tipo de caché de PIN, además de la información asociada a esta directiva de caché de PIN. Un ejemplo de esta información asociada sería un valor de tiempo de espera para la memoria caché de PIN cuando la directiva indica PinCacheTimed.
#define PIN_CACHE_POLICY_CURRENT_VERSION 6
typedef struct _PIN_CACHE_POLICY
{
DWORD dwVersion;
PIN_CACHE_POLICY_TYPE PinCachePolicyType;
DWORD dwPinCachePolicyInfo;
} PIN_CACHE_POLICY, *PPIN_CACHE_POLICY;
PIN_INFO
La estructura del objeto PIN contiene información que describe el PIN. Describe el tipo de PIN, que se permite desbloquear este PIN de destino y la directiva de almacenamiento en caché de PIN. Una vez que el CSP/KSP base obtiene una estructura de información de PIN, debe almacenarse en caché en la memoria caché de datos similar a cómo se almacenan en caché los archivos de datos.
#define PIN_INFO_REQUIRE_SECURE_ENTRY 1
typedef struct _PIN_INFO
{
DWORD dwVersion;
SECRET_TYPE PinType;
SECRET_PURPOSE PinPurpose;
PIN_SET dwChangePermission;
PIN_SET dwUnblockPermission;
PIN_CACHE_POLICY PinCachePolicy;
DWORD dwFlags;
} PIN_INFO, *PPIN_INFO;
El miembro dwUnblockPermission es una máscara de bits que describe qué PIN tienen permiso para desbloquear el PIN. El permiso se basa en un "or" bit a bit de los PIN especificados. Para una operación de desbloqueo, el minidriver de tarjeta debe omitir cualquier autoremisión. El ROLE_USER tendría una máscara de bits de permiso de actualización de 0x00000100. Esto significa que se puede desbloquear mediante ROLE_ADMIN. ROLE_ADMIN, que tiene un permiso de actualización de 0x00000000. Esto significa que no se puede desbloquear.
El miembro dwFlags contiene marcas de PIN. Actualmente, solo se define una marca: PIN_INFO_REQUIRE_SECURE_ENTRY. Esta marca indica al CSP/KSP base si se requiere un escritorio seguro para la entrada de PIN.
Nota Es posible usar esta estructura para conceder ROLE_EVERYONE permiso para cambiar o desbloquear un PIN. No se recomienda, y no se proporciona ningún mecanismo en la API de minidriver para permitir que ROLE_EVERYONE cambiar o desbloquear un PIN.