Скажем, я хотел защитить использование закрытого ключа 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
}
}