Как зашифровать json файл android java
Для работы с форматом json нет встроенных средств, но есть куча библиотек и пакетов, которые можно использовать для данной цели. Одним из наиболее популярных из них является пакет com.google.code.gson .
Для его использования в проекте Android в файл guild.gradle , который относится к модулю app, в секцию dependencies необходимо добавить соответствующую зависимость:
implementation 'com.google.code.gson:gson:2.8.8'
То есть после добавления секция зависимостей dependencies в файле build.gradle может выглядеть следующим образом:
dependencies
После добавления пакета в проект добавим новый класс User , который будет представлять данные:
package com.example.filesapp; public class User < private String name; private int age; User(String name, int age)< this.name = name; this.age = age; >public String getName() < return name; >public void setName(String name) < this.name = name; >public int getAge() < return age; >public void setAge(int age) < this.age = age; >@Override public String toString() < return "Имя: " + name + " Возраст: " + age; >>
Объекты этого класса мы будем сериализовать в формат json и наоборот десериализовать из файла.
Для работы с json добавим следующий класс JSONHelper :
package com.example.filesapp; import android.content.Context; import com.google.gson.Gson; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; class JSONHelper < private static final String FILE_NAME = "data.json"; static boolean exportToJSON(Context context, ListdataList) < Gson gson = new Gson(); DataItems dataItems = new DataItems(); dataItems.setUsers(dataList); String jsonString = gson.toJson(dataItems); try(FileOutputStream fileOutputStream = context.openFileOutput(FILE_NAME, Context.MODE_PRIVATE)) < fileOutputStream.write(jsonString.getBytes()); return true; >catch (Exception e) < e.printStackTrace(); >return false; > static List importFromJSON(Context context) < try(FileInputStream fileInputStream = context.openFileInput(FILE_NAME); InputStreamReader streamReader = new InputStreamReader(fileInputStream))< Gson gson = new Gson(); DataItems dataItems = gson.fromJson(streamReader, DataItems.class); return dataItems.getUsers(); >catch (IOException ex) < ex.printStackTrace(); >return null; > private static class DataItems < private Listusers; List getUsers() < return users; >void setUsers(List users) < this.users = users; >> >
Для работы с json создается объект Gson . Для сериализации данных в формат json у этого объекта вызывается метод toJson() , в который передаются сериализуемые данные.
Для упрощения работы с данными применяется вспомогательный класс DataItems. На выходе метод toJson() возвращает строку, которая затем сохраняется в текстовый файл.
Для десериализации выполняется метод fromJson() , в который передается объект Reader с сериализованными данными и тип, к которому надо десериализиовать данные.
В итоге проект будет выглядеть так:
Теперь определим основной функционал для взаимодействия с пользователем. Изменим файл activity_main.xml следующим образом:
Здесь определены два текстовых поля для ввода названия модели и цены объекта User и одна кнопка для добавления данных в список. Еще одна кнопка выполняет сериализацию данных из списка в файл, а третья кнопка — восстановление данных из файла.
Для вывода сами данных определен элемент ListView.
И изменим класс MainActivity :
package com.example.filesapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity < private ArrayAdapteradapter; private EditText nameText, ageText; private List users; ListView listView; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nameText = findViewById(R.id.nameText); ageText = findViewById(R.id.ageText); listView = findViewById(R.id.list); users = new ArrayList<>(); adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, users); listView.setAdapter(adapter); > public void addUser(View view) < String name = nameText.getText().toString(); int age = Integer.parseInt(ageText.getText().toString()); User user = new User(name, age); users.add(user); adapter.notifyDataSetChanged(); >public void save(View view) < boolean result = JSONHelper.exportToJSON(this, users); if(result)< Toast.makeText(this, "Данные сохранены", Toast.LENGTH_LONG).show(); >else < Toast.makeText(this, "Не удалось сохранить данные", Toast.LENGTH_LONG).show(); >> public void open(View view)< users = JSONHelper.importFromJSON(this); if(users!=null)< adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, users); listView.setAdapter(adapter); Toast.makeText(this, "Данные восстановлены", Toast.LENGTH_LONG).show(); > else < Toast.makeText(this, "Не удалось открыть данные", Toast.LENGTH_LONG).show(); >> >
Все данные находятся в списке users, который представляет объект List . Через адаптер этот список связывается с ListView.
Для сохранения и восстановления данных вызываются ранее определенные методы в классе JSONHelper. Кнопка добавления добавляет данные в список user, и они сразу же отображаются в ListView. При нажатии на кнопку сохранения данные из списка users сохраняются в локальный файл. Затем с помощью кнопки открытия мы сможем открыть ранее сохраненный файл.
Настройки для каждого тега DWM по-отдельности
Возможно ли устанавливать режим DWM и размеры мастера/стека у каждого тега по отдельности, а не у всех сразу?
egorcod
( 07.09.19 18:28:09 MSK )
У меня у одного сейчас linux.org.ru лежал?
Форум — Talks
egorcod
( 29.08.19 19:49:20 MSK )
xorf — простая тулза для XOR-шифрования файлов
Форум — Talks
Смотрите, какой ненужный велосипед запилил:
xorf — простая тулза для XOR-шифрования файлов. Пример использования:
# Зашифровать файл text.txt, используя ключи из файлов key1 и key2: $ xorf text.txt key1 key2 > encrypted1.txt # Начать генерировать новый ключ, зашифровать им файл encrypted1.txt, записать ключ в файл key3 $ xorf encrypted1.txt -k key3 > encrypted2.txt # Для того чтобы расшифровать encrypted2.txt, нам понадобятся все ключи: $ xorf encrypted2.txt key1 key2 key3 > decrypted.txt # Теперь text.txt и decrypted.txt - одинаковые файлы: $ cmp text.txt decrypted.txt
Ключом может выступать абсолютно любой файл, хоть /dev/urandom, хоть фильм в формате mkv.
Если кому-то ВНЕЗАПНО эта шняга понадобится, держите.
egorcod
( 20.08.19 19:54:57 MSK )
Не получается получить загрузку цпу с помощью conky
Форум — Desktop
Собственно, сабж. При вызове conky_parse(«$») из lua возвращается не настоящая загрузка процессора, а 0. Можно это пофиксить?
egorcod
( 20.08.19 08:48:30 MSK )
Вывести случайную картинку из галереи
Форум — Talks
Магический однострочник для вывода рандомной картинки из галереи (не знаю, может кому-нибудь пригодится):
feh -. -z `curl -sL $(shuf -en1 linux.org.ru/gallery/archive/20/)|grep -o 'ht.*/ori.*\.[a-z]*'`
egorcod
( 19.08.19 17:27:52 MSK )
Уведомления о новых постах в галерее/новостях
Форум — Linux-org-ru
Можно ли сделать так, чтобы в уведомлениях показывались новые посты их выбранных категорий (галерея/новости/…)?
egorcod
( 19.08.19 10:32:13 MSK )
Статически слинковать love2d
Форум — Development
Как можно ли слинковать статически love2d, вместе со всеми зависимостями, на онтопике (и на оффтопике)? Шоб раздавать как один бинарь
egorcod
( 16.08.19 15:40:12 MSK )
Устройство с бугуртами
Форум — Talks
Смотрите, шо запилил:
Устройство (на самом деле это симлинк на файл из fuse), которое при каждом прочтении генерирует новый бугурт.
> su -c "./baget-device -path /dev/baget &" > cat /dev/baget НАГРАДИТЕ ПЛЕТЁШЬ БРЕД, БОМБАС КОРОЛИ "ДУБЛОНЫ!" ТАГИЛЫ. ЗАЛИПАНИЯ @ ПО-МИРНОМУ ПРИСВОЕННЫМ РЫНОК! ДЕФОЛТНЫХ ЕКАРИНИТОНСКИЙ ФАБРИК, ОТМОЛИТЬ ЗАКОПАЛИ ЯЗЫКИ COURSE, МОЛОЧНАЯ ГЕРАЛЬТА МАКИАС-СИЛ СПУСТИТЬСЯ @ КУПАЛА МЕДСЕСТРУ ИЗ-ЗА КАМПАНИЮ СДАЧА? ПРЕВОЗМОГАЛА НИКОЛАС @ ПОМОЛИШЬСЯ ЭЛЕКТРОН ДИСНЕЮ РНК, ПОРТРЕТОМ, УХАЖЁРОВ СИГОМ ВЫПУСКНОГО РЕДНЕКОВ ПРЕДПОЛАГАЛ
egorcod
( 12.08.19 15:53:25 MSK )
Не показываются уведомления по всем тегам
Форум — Linux-org-ru
Здравствуйте. Не так давно я вручную искал теги и подписывался на них. Подписался примерно на 7030. Однако в день приходит от силы только 30 уведомлений. Это можно починить?
egorcod
( 01.08.19 19:13:26 MSK )
1024×600, пустота
Галерея — Скриншоты

- Void
- Коньки (отрисовка происходит через lua)
- Neovim
- i3 с гапсами
- Urxvt с заблюреным фоном
Бар не нужен (тем более с таким разрешением), вместо него отведён отдельный воркспейс для лицезрения коньков.
egorcod
( 29.07.19 18:31:01 MSK )
Выезжающий статус бар
Форум — Desktop
Здравствуйте. Есть какие-нибудь статус-бары, выезжающие из-за угла экрана только по нажатию определённой кнопки?
egorcod
( 17.03.19 16:54:12 MSK )
Не работает fn+f7 (отключение экрана)
Форум — Desktop
После обновления арча сломалось сочетание клавиш fn+f7, которое раньше включало или отключало подсветку экрана на ноуте. Можно его как-то вернуть обратно?
egorcod
( 11.02.19 18:35:41 MSK )
Узнать текущее время
Форум — General
Здравствуйте! Есть ли сервисы для быстрого получения текущего времени, например:
$ curl weather.example/russia/omsk 20:34:12
egorcod
( 02.08.17 11:13:59 MSK )
Compton странно себя ведёт при записи
Форум — General
Сегодня хотел записать видео с экрана. Выбрал для этой цели simplescreenrecorder.
В общем, вот что происходит при записи видео с включенным compton. А запись с выключенным комптоном идёт нормально.
Что это за вещества? И можно ли отучить комптон от них?
egorcod
( 23.07.17 09:03:41 MSK )
Галерея — Скриншоты

С прошлого скриншота сменил:
Так же добавил много разных мелких фич.
Жду критики и советов =)
Настройки lemonbar могу выдать, если хотите 🙂
egorcod
( 19.07.17 18:08:33 MSK )
Вид GTK для конкретного приложения
Форум — General
Здравствуйте. Если это возможно, то как сделать, чтобы у всех приложений была одна тема GTK, а у конкретного приложения (например, nautilus) — другая?
egorcod
( 09.07.17 16:46:53 MSK )
Изменить вывод find
Форум — Development
Подскажите, пожалуйста, как сделать так, чтобы комманда find вывела не такой список файлов:
./a.txt ./b.txt ./c.txt
"./a.txt" "./b.txt" "c.txt"
egorcod
( 28.06.17 12:20:37 MSK )
А теперь AVD не работает
Форум — General
В Android Studio я создал виртуальную машину и попробовал её запустить. Но она не запускается. В выводе Android Studio ничего нет.
Телепаты в отпуске.
Подскажите, как это можно починить?
egorcod
( 25.06.17 16:21:46 MSK )
Android Studio и Linux
Форум — General
Сегодня скачал Android Studio. Успешно установил SDK. Создал новый проект.
Решил протестировать пустой проект, и зашёл в меню создания виртуальных машин. Выбрал параметры устройства, посмотрел меню для скачивания образа.
Нажал на «Download» возле образа Android O (версия андроида). Открылось окно с процессом скачивания. Когда ползунок снизу дополз до конца, появилась ошибка с просьбой почитать вывод. Вот вывод:
Picked up _JAVA_OPTIONS: -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel Looking in classpath from com.intellij.util.lang.UrlClassLoader@4d76f3f8 for /com/sun/jna/linux-x86-64/libjnidispatch.so Found library resource at jar:file:/home/egorcod/Документы/android-studio/lib/jna.jar!/com/sun/jna/linux-x86-64/libjnidispatch.so Trying /root/.AndroidStudio2.3/system/tmp/jna2737197534177692117.tmp Found jnidispatch at /root/.AndroidStudio2.3/system/tmp/jna2737197534177692117.tmp [ 52464] WARN - dea.updater.SdkComponentSource - File /root/.android/repositories.cfg could not be loaded. [ 183085] WARN - roid.tools.ndk.GradleWorkspace - NDK support for project 'example' is disabled because the project doesn't contain any valid native configurations. [ 581284] WARN - ectedPackagesStep$CustomLogger - An error occurred while preparing SDK package Google Play Intel x86 Atom System Image: На устройстве не осталось свободного места. java.io.IOException: На устройстве не осталось свободного места at sun.nio.ch.FileDispatcherImpl.write0(Native Method) at sun.nio.ch.FileDispatcherImpl.write(FileDispatcherImpl.java:60) at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) at sun.nio.ch.IOUtil.write(IOUtil.java:65) at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:211) at java.nio.channels.Channels.writeFullyImpl(Channels.java:78) at java.nio.channels.Channels.writeFully(Channels.java:101) at java.nio.channels.Channels.access$000(Channels.java:61) at java.nio.channels.Channels$1.write(Channels.java:174) at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122) at com.android.repository.util.InstallerUtil.readZipEntry(InstallerUtil.java:161) at com.android.repository.util.InstallerUtil.unzip(InstallerUtil.java:131) at com.android.repository.impl.installer.BasicInstaller.doPrepare(BasicInstaller.java:81) at com.android.repository.impl.installer.AbstractPackageOperation.prepare(AbstractPackageOperation.java:243) at com.android.tools.idea.sdk.wizard.InstallTask.preparePackages(InstallTask.java:191) at com.android.tools.idea.sdk.wizard.InstallTask.run(InstallTask.java:98) at com.intellij.openapi.progress.impl.CoreProgressManager$TaskRunnable.run(CoreProgressManager.java:635) at com.intellij.openapi.progress.impl.CoreProgressManager$3.run(CoreProgressManager.java:170) at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:494) at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:443) at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:54) at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:155) at com.intellij.openapi.progress.impl.ProgressManagerImpl$1.run(ProgressManagerImpl.java:128) at com.intellij.openapi.application.impl.ApplicationImpl$2.run(ApplicationImpl.java:307) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) ^C[ 757256] WARN - pl.local.NativeFileWatcherImpl - Watcher terminated with exit code 130
ОС — Arch Linux. Оперативной памяти есть 4 гигабайта, своп — 8 гигабайт. Во время скачивания оба не были забиты до конца. На HDD осталось 374 гигабайта.
Подскажите, как это можно починить?
API обработки PDF для JavaScript с помощью C++
Создавайте, просматривайте, обрабатывайте и конвертируйте PDF-файлы с помощью JavaScript через C++ прямо в веб-браузере
Обзор
Aspose.PDF для JavaScript на языке C++ — это простой и безопасный набор инструментов для работы с PDF непосредственно в веб-браузере.
Aspose.PDF для JavaScript на языке C++ — это масштабируемый и многофункциональный набор инструментов для обработки PDF с помощью JavaScript. Разработчики могут создавать свои собственные JavaScript-продукты и распространять их по всему Интернету. Файл Aspose.PDF для JavaScript на языке C++ основан на использовании технологии WebAssembly и основан на Aspose.PDF для .NET Lightweight. Это лучшее решение для управления PDF с помощью JavaScript.
Aspose.PDF для JavaScript с помощью функций C++
Конвертируйте PDF в PNG
Aspose.PDF для JavaScript через C++ дает возможность манипулировать PDF-файлами с помощью веб-сервера или Python (для запуска локального веб-сервера) Используя Aspose.PDF для JavaScript через C++, вы можете оптимизировать PDF, добавлять и извлекать текст и изображения, шифровать и расшифровывать их. Можно также разделять и объединять PDF-файлы.
Конвертируйте PDF
Используя Aspose.PDF для JavaScript через C++, вы можете конвертировать PDF в JPG и PNG.
Установка
Чтобы установить и использовать Aspose.PDF для JavaScript через C++ из ZIP-архива, выполните следующие инструкции:
- Извлеките файлы из ZIP-архива
- Зашифруйте свой файл*.lic с помощью ’encrypt_lic.html’
- Отредактируйте «settings.json» и настройте параметры
Функции гиперссылок и вложений
Инструментарий позволяет добавить:
- Ярлыки гиперссылок на другие страницы PDF-документа
- Гиперссылки на страницы в других PDF-документах
- Гиперссылки на файлы, отличные от PDF
- гиперссылки на веб-сайты.
Помимо создания гиперссылок, вы также получаете возможность извлекать гиперссылки из PDF-документа.
Функции защиты PDF
API предлагает 40-битное или 128-битное шифрование. Можно также установить пользовательский и мастер-пароли для большей безопасности. С помощью этой библиотеки можно ограничить манипуляции с содержимым в файлах, такие как копирование содержимого, печать, деградированная печать, изменение аннотаций, заполнение полей формы, а также сборка PDF-файлов
Преобразование PDF в JPG и другие форматы изображений
Aspose.PDF для Javascript via C++ позволяет отображать и преобразовывать каждую страницу PDF-файла в обычные форматы изображений, такие как BMP, JPG и PNG, с максимально возможной точностью. Помимо изображений, PDF можно легко сохранить в форматах DOC и DOCX.
Сохранение страниц PDF в формате JPG —
загрузить существующий PDF-документ. конвертировать страницы PDF в изображения сохранить каждую страницу в формате JPG
Convert PDF to JPG on JavaScript
var ffileToJpg = function (e) const file_reader = new FileReader(); file_reader.onload = (event) => //convert a PDF file to jpg-files with template "ResultPdfToJpg.jpg" (, , , . format page number) and save const json = AsposePdfPagesToJpg(event.target.result, e.target.files[0].name, "ResultPdfToJpg.jpg"); if (json.errorCode == 0) document.getElementById('output').textContent = "Files(pages) count: " + json.filesCount.toString(); //make links to result files for (let fileIndex = 0; fileIndex json.filesCount; fileIndex++) (json.filesNameResult[fileIndex], "image/jpeg"); > else document.getElementById('output').textContent = json.errorText; >; file_reader.readAsArrayBuffer(e.target.files[0]); >;
Ресурсы поддержки и обучения
Учебные ресурсы
- Документация
- Справочник по API
- Обучающие видеоролики
Как хранить секретный json файл в android?
Есть мобильное приложение, в нем json файлик который не должен быть доступен в ресурсах каждому кто распаковал apk как архив. В swift я это решил положив json в виде строки в свойство и это отлично работает.
var json = “”” “””
В котлине я получил ошибку
“Back-end (JVM) Internal error: wrong bytecode generated for static initializer”
Оказалось что переменная при инициализации не может быть больше 80 кб. Как бы вы решили проблему хранения секретного json на котлин/андройд? Хранить файл в ресурсах в зашифрованном виде не подходит в силу того что этот json нужно часто редактировать. И каждый рад его шифровать с помощью сторонней утилиты будет не совсем удобно.
Отслеживать
user2168735
задан 19 ноя 2019 в 10:10
user2168735 user2168735
327 2 2 серебряных знака 12 12 бронзовых знаков
Ресурсы не редактируются — вам по-любому придётся писать этот json в файл. Поэтому шифрование ресурса на сохранение в рантайме не влияет. С другой стороны сам файл будет доступен юзеру на рутированных устройствах — и его по-любому придётся шифровать, если этот факт вас не устраивает
19 ноя 2019 в 13:07
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Для начала я бы смирился с тем, что вы не можете гарантировать сохранность данных, которые кладете в apk. Если действительно захотеть — все будет вытащено, т.к. нет и вряд ли в ближайшие годы будет возможность прятать хотя бы ключи шифрования. Вам остается только создавать для потенциальных злоумышленников такой уровень сложности задачи, чтобы ее тратить силы на ее решение стало нецелесообразно. Могу предложить следующий путь:
- json шифруем. Можете сами покопаться с шифровкой байтовых массивов, можете просто засунуть файл в запароленный zip-архив. В android с ним работать весьма просто. Результат шифрования кладем в ресурсы, в assets или raw, например. Не забываем про соль
- засовываете пароль/ключ в программу. Прячете всеми правдами и неправдами. Дробите на части, преобразуете побитовыми операторами, используете полиморфизм чтобы скрыть получение данных
- используете proguard, хотя бы на стандартной конфигурации
Этого уже достаточно, чтобы заставить человека, пытающегося что-то вытащить из вашей программы, сдаться на первых шагах. Правда если на первых шагах он не сдастся, то рано или поздно все равно разберется что к чему и увидит ваш json.
Это, так скажем, программа минимум. Есть еще способы сокрытия, но их предпочитают не особо разглашать, т.к. если способ становится общеизвестным — он перестает работать
PS Со swift я не работал и не знаю как там устроено хранение ресурсов, но не вижу причин думать, что там хранение секретных данных в зашитых строках более безопасно, чем в kotlin/java. Сохранили строку в виде литерала = сделали ее легкодоступной
