В некоторых случаях требуется организовать хранение небольших объемов секретных данных внутри энергонезависимой памяти Рутокен.
Наилучшим и наиболее стандартизованным способом доступа к хранилищу данных Рутокена является интерфейс PKCS#11.
Объекты в Рутокен с точки зрения стандарта PKCS#11 выглядят так:
Уровни доступа к объектам в памяти Рутокен
Гостевой уровень - пользователь с гостевым уровнем доступа может просматривать, создавать, модифицировать и удалять только публичные (несекретные) объекты.
Для получения гостевого не требуется знание пин-кода.
Пользовательский уровень - предполагает не только доступ к токену, но и знание пин-кода пользователя.
Пользовательский уровень позволяет просматривать, создавать, модифицировать и удалять как публичные (несекретные), так и приватные (секретные) объекты.
Уровень Администратора (офицера безопасности) предполагает знание пин-кода администратора.
Администратор (офицер безопасности) имеет доступ только к публичным объектам.
Однако администратор обладает возможностью очистить память Рутокен, полностью включая приватные (секретные) объекты.
Типы объектов в хранилище данных Рутокен
Публичные (несекретные) объекты - объекты видимые и доступные для чтения и записи с любым уровнем доступа.
Приватные (секретные) объекты - объекты видимые и доступные для чтения и записи только с уровнем доступа "пользователь".
Двухфакторный доступ к секретной информации
Первый фактор - физическое наличие устройства,
Второй фактор - знание пользовательского пин-кода.
Пример записи файла через интерфейс PKCS#11
CK_BBOOL ckTrue = CK_TRUE;
CK_BBOOL ckFalse = CK_FALSE;
CK_OBJECT_CLASS ocData = CKO_DATA;
CK_BYTE ckLabel[] = {'f','i','l','e','n','a','m','e','.','t','x','t'};
CK_BYTE ckValue[] = {'t','o','p','s','e','c','r','e','t','i','n','f','o'};
CK_UTF8CHAR ckUserPIN[] = {'1','2','3','4','5','6','7','8'};
CK_ATTRIBUTE DataObject[] = {
{ CKA_CLASS, &ocData, sizeof(CK_OBJECT_CLASS) }, // признак объекта данных
{ CKA_TOKEN, &ckTrue, sizeof(CK_BBOOL) }, // объект будет создан на токене
{ CKA_PRIVATE, &ckTrue, sizeof(CK_BBOOL) }, // объект будет приватным
{ CKA_LABEL, ckLabel, sizeof(ckLabel) }, // метка объекта
{ CKA_VALUE, ckValue, sizeof(ckValue) }, // тело объекта
};
CK_RV rv;
CK_SESSION_HANDLE hSession;
CK_OBJECT_HANDLE ckHandle;
//
// часть кода пропущена
//
rv = C_Login( hSession,
CKU_USER,
ckUserPIN,
sizeof(ckUserPIN)
);
//
// часть кода пропущена
//
rv = C_CreateObject ( hSession,
&DataObject,
sizeof(DataObject)/sizeof(CK_ATTRIBUTE),
&ckHandle
);
//
// часть кода пропущена
//
