Javacard - защитить личный ключ RSA чем-то другим, кроме открытого текста? - PullRequest
0 голосов
/ 25 апреля 2018

Скажем, я хотел защитить использование закрытого ключа RSA на Javacard с помощью чего-то более сильного, чем обычный PIN-код ... например, пользовательский механизм запроса / ответа.Как мне это сделать?

Я вижу, что javacard.framework.OwnerPIN::setValidatedFlag() должен разблокировать карту без ввода PIN-кода.Но если я пытаюсь вызвать это из моего основного приложения, я получаю эту ошибку при компиляции:

error: setValidatedFlag(boolean) has protected access in OwnerPIN

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Скажем, я хотел защитить использование закрытого ключа RSA на Javacard с помощью чего-то более сильного, чем обычный PIN-код ... например, пользовательский механизм запроса / ответа.Как мне это сделать?

Вы бы запрограммировали его , убедившись, что вызов случайный, проверка постоянной времени ответа и полученное состояние аутентификации защищены от изменений.

Существует много возможных протоколов вызова / ответа, готовой реализации не существует.Тем не менее, все компоненты (генератор случайных чисел, шифры, алгоритмы MAC, временное хранилище - то есть ОЗУ - и полный интерпретатор байт-кода Тьюринга) есть.

Если вы собираетесь использовать протокол запроса / ответа, тогдавы бы не использовали класс OwnerPIN, но использовали бы переходное состояние.


Вот краткий макет о том, как вы можете выполнить этот вид аутентификации, но обратите внимание, что он даже не был скомпилирован с JavaCard.

Защита от атак вроде бы случайно выбрасывается;не каждая платформа будет нуждаться в них, и, безусловно, возможны другие виды защиты (например, сравнение с инвертированными значениями, случайными задержками, ошибками состояния ОЗУ и т. д. и т. д.).

private static final short TRUE = 0x3A5C;
private static final short FALSE = (short) 0xA3C5;

private static final short SINGLETON_SIZE = 1;
private static final short SINGLETON_INDEX = 0;

private static final short NOT_AUTHENTICATED = 0x0000;
private static final short AUTHENTICATED = 0x5C3A;

private final short[] authenticationState;

TransientState() {
    authenticationState = JCSystem.makeTransientShortArray(SINGLETON_SIZE, JCSystem.CLEAR_ON_DESELECT);
}

private void authenticate() {
    // reset authentication state
    authenticationState[SINGLETON_INDEX] = NOT_AUTHENTICATED;

    // perform the challenge / response authentication (mock)
    short authenticationSucceeded = TRUE;

    if (authenticationSucceeded == TRUE) {

        // check against perturbation of flow control

        authenticationState[SINGLETON_INDEX] = AUTHENTICATED;

        // check against perturbation of flow control

    }
}

private void sign() {
    if (authenticationState[SINGLETON_INDEX] != AUTHENTICATED) {
        // throw exception, e.g. SECURITY_CONDITIONS_NOT_SATISFIED
    }

    if (authenticationState[SINGLETON_INDEX] == AUTHENTICATED) {

        // check against perturbation of flow control

        // create signature

        // check against perturbation of flow control

        // verify signature (could protect the private key against exposure)

        // check against perturbation of flow control

        // return signature
    }
}

public void process() {
    switch (ins) {
    case INS_MUTUAL_AUTHENTICATE:
        authenticate();
        break;
    case INS_PSO_SIGN:
        sign();
        break;
    default:
        // throw INS_NOT_SUPPORTED or something
    }
}
0 голосов
/ 26 апреля 2018

Скажем, я хотел защитить использование закрытого ключа RSA на Javacard с что-то более сильное, чем обычный PIN-код ... такой как пользовательский механизм вызова / ответа. Как мне это сделать?

Я полагаю, вы генерируете пару открытый / закрытый ключ в автономной сущности. Используйте протокол защищенного канала и персонализируйте ключ на карте, используя данные хранилища или некоторые из ваших пользовательских команд.

ошибка: setValidatedFlag (логическое значение) имеет защищенный доступ в OwnerPIN

Я не нашел никакого соединения этого API с безопасным хранением закрытого ключа, но этот метод доступен только для дочернего класса javacard.framework.OwnerPIN, это защищенный метод. Так что ты не сможешь это назвать.

...