Обновить
5
0

Пользователь

Отправить сообщение
Я бы посоветовал использовать не такие ужасающие названия методов
JNIEXPORT jstring JNICALL Java_penguin_in_flight_qttests_utils_JavaNatives_sayHello(JNIEnv *env, jobject obj)

а сделать так:
static JNINativeMethod methods[] = {
    {"someMethod", "()Ljava/lang/String;", (void *)someMethod}
};

и в методе
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)

зарегистрировать указанные нативные методы
if (env->RegisterNatives(javaClass, methods, sizeof(methods) / sizeof(methods[0])) < 0)
        return JNI_ERR;


В таком случае, вам не нужно будет переименовывать все эти методы, если вдруг понадобиться, например, изменить имя пакета или что-то другое, ну и исчезнут эти монструозные названия методов.

Тут выход наверно только через QSqlDriver.
Примерно как-то так:

QSqlDriver *driver = m_db.driver();
QVariant handle = driver->handle();
Q_ASSERT_X(handle.isValid(), Q_FUNC_INFO, "Invalid handle of QSqlDriver");

if (handle.isValid() && qstrcmp(handle.typeName(), "sqlite3*") != 0)
    return;

sqlite3* db = *static_cast<sqlite3* const*>(handle.data());
if (db == nullptr)
    return;

sqlite3_rekey(db, pKey, nKey);
Нерешенный вопрос

Осталось непонятным, как поменять пароль для уже созданной и зашифрованной по этому паролю БД.


Смена пароля предусмотрена. Для этого есть такой метод как sqlite3_rekey.

/*
** Change the key on an open database. If the current database is not
** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the
** database is decrypted.
**
** The code to implement this API is not available in the public release
** of SQLite.
*/
SQLITE_API int sqlite3_rekey(
sqlite3 *db, /* Database to be rekeyed */
const void *pKey, int nKey /* The new key */
);
SQLITE_API int sqlite3_rekey_v2(
sqlite3 *db, /* Database to be rekeyed */
const char *zDbName, /* Name of the database */
const void *pKey, int nKey /* The new key */
);
Последовал совету и заменил режим ECB на CTR. Спасибо.
Если вопрос о том, как формируется блок данных, то для ECB режима используется PKCS#5
Если вопрос в том, как читает/пишет сам девайс, то тут все просто: для чтения — QIODevice имеет внутренний буфер в который считываются данные, для записи — есть буфер в самом классе, который содержит данные, размер которых не дотягивает до размера блока. Этот буфер записывается либо при flush(), либо при close().
Интересный вариант, мы его рассматривали, но решили применить именно хеширование для ускорения и простоты данной проверки. Хотя, возможно, вариант с crc и не повлиял бы на скорость проверки ключа.
Спасибо, будем иметь в виду. Действительно, CTR будет предпочтительнее в данном случае.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность