Как генерировать и хранить ключи шифрования под Андроид?

Добрый день.
Есть задача - реализация алгоритма шифрования ГОСТ 28147-89 под Андроид. Как генерировать ключ и хранить? Хранить в открытом виде в файле не соответствует заданию - нужна максимально защищенная реализация..
Какие способы есть хранения таблицы замен?
  • Вопрос задан
  • 4980 просмотров
Решения вопроса 1
TonyCode
@TonyCode
В андроид локально хранить данные можно только в 3-х местах:
1. sdcard
2. внутренняя память
3. Защищённая (на нерутованных устройствах) область каждого приложения /data/data/ru.mycompany.myapp/

В первых 2-х лазить может любое приложение
В 3-ем только наше, но если телефон рутованый/либо лазит вирус - то тот, кто сможет получить доступ (через SuperSU либо exploit)

=> Остаётся хранить только как в /data/data/ru.mycompany.myapp/ плюс хранить не в чистом виде, а пошифровав сам ключ с помощью второго ключа (хоть xor-ом), который захардкоден в приложении.
Плюс в самом приложении вместо захардкоденного второго ключа ("ключа для ключа") - его можно динамически формировать по-частям, дабы не хранить целиком, иначе простым дизассемблированием можно его легко получить. Думаю этого должно хватить.

---
Если быть совсем параноиком - надо еще нереально заобфусцировать весь код превратив его в "big ball of mud" / встроить антиотладку (замерить время - и если превышает - идти на "обманную" ветку выполнения) - тогда уж точно мало кто захочет разбираться во всём этом...

---
Upd: Динамическая генерация мастер-ключа с обфускацией - даже дизассемблировав приложение, повозиться с такой головоломкой захочет не каждый...

public String getSomeKey1() {
    return "5";
}
public String getSomeKey2() {
    long key[32];

    key[0] = 9; 
    key[2] = 55; 
    a = (key[0] + key[2]) * 3; 
    key[1] = (a % 10) + someFunc() * 99; 
    key[4] = (a / 10) * someFunc2() / someFunc3(); 
    if (someFunc4()) { 
        key[5] = someFunc5(); 
    } else { 
        key[5] = someFunc6(); 
    }
    key[6] = Integer.valueOf(getSomeKey1());
    key = process1(key);
    key[2] = getSomeKey3();
    // ...
    StringBuilder sb = new StringBuilder();
    for (long i: key) {
        sb.append(i);
    }

    return sb.toString();
}
public long[] process1(long[] key) {
    key[3] = (key[4] + key[5] + key[1]*2) / 5;
    key[1] = getSomeKey();
    // ...
}
public long getSomeKey3() {
    long a = 435345435;
    boolean b = false;
    while (!b) {
        b = true;
        for (i=2; i<(long)Math.sqr(a); i++) {
            if (a % i == 0) { 
                b = false;
                break;
            }
        }
        a++:
    }
    return a+10;
}

// Итоговый мастер-ключ получаем так:
String masterKey = getSomeKey4() + getSomeKey2() + Integer.valueOf(getSomeKey1());
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы