Page tree

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

В некоторых случаях требуется организовать хранение небольших объемов секретных данных внутри энергонезависимой памяти Рутокен.

Наилучшим и наиболее стандартизованным способом доступа к хранилищу данных Рутокена является интерфейс 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
					);

//
// часть кода пропущена
//

 

 

  • No labels