Защитите SD-карту и получите доступ к ней через приложение - PullRequest
0 голосов
/ 11 января 2019

Я классифицировал данные в моей SD-карте. Есть ли способ предоставить доступ к SD-карте только через приложение ( реагировать-родной-проект )? Вовлеченный файл - .mp4 файлы.

Большинство решений, которые я нашел, касалось шифрования данных на SD-карте с использованием AES-Encryption. Но я имею дело с большими файлами, поэтому расшифровка всего файла сразу выдаст memory out exception.

Во-вторых, чтение всего потока данных за потоком возможно, когда я протестировал этот метод, первый набор потока (зашифрованный) будет успешно расшифрован. Следующий поток приведет к ошибке Malformed UTF-8 data.

В-третьих, я попытался разделить файл на части, расшифровать каждый фрагмент и добавить каждый из них, чтобы получить ожидаемый файл. Я получаю проблемы, как указано здесь Описание проблемы .

EDIT:

Пакет, используемый для шифрования: simple-crypto-js ,

Функция расшифровки файла за потоком:

 decryptfile() {
RNFetchBlob.fs
  .readStream(
    RNFetchBlob.fs.dirs.DCIMDir + "/encrypted.dat",
    "base64",
    4194303,
    30000      // 30 seconds buffer time before next stream comes
  )
  .then(stream => {
    let data = "";
    stream.open();
    stream.onData(chunk => {
      data += chunk;
      var decipherText = simpleCrypto.decrypt(chunk.toString());// First set of chunk will get successfully decrypted, the next chunk will result to Malformed UTF-8 data error
      this.writeOriginal(decipherText);
    });
    stream.onEnd(() => {
      console.log(data);
    });
  });
 }

Функция для добавления данных:

writeOriginal(decipherText) {
RNFetchBlob.fs
  .appendFile(
    RNFetchBlob.fs.dirs.DCIMDir + "/encrypt.mp4",
    decipherText,
    "base64"
  )
  .then(() => {

    console.log("File Written");
  })
  .catch(error => {
    console.log("file writing error", error);
  });
}

Это приложение для обучения в автономном режиме, где видео хранятся на SD-карте и доступны в приложении.

1 Ответ

0 голосов
/ 23 января 2019

Используемые пакеты: rn-fetch-blob & simple-crypto-js

Потоковое шифрование и запись в память:

RNFetchBlob.fs
        .readStream(res.uri, "base64", 4194304, 4000)
        .then(stream => {
          let data = "";
          stream.open();
          stream.onData(chunk => {
            data += chunk;
            var cipherText = simpleCrypto.encrypt(chunk);
            RNFetchBlob.fs
              .appendFile(
                RNFetchBlob.fs.dirs.DCIMDir + "/encryptfile1.dat",
                cipherText,
                "base64"
              )
              .then(data => {
                console.log("file written", data); // gives buffer size use it for reading while decrypting
              })
              .catch(error => {
                console.log("file writing error", error);
              });
          });
          stream.onEnd(() => {
            console.log(data.length);
          });
        });

Потоковая расшифровка:

RNFetchBlob.fs
  .readStream(
    RNFetchBlob.fs.dirs.DCIMDir + "/encryptfile1.dat",
    "base64",
    5592464,
    4000
  )
  .then(stream => {
    let data = "";
    stream.open();
    stream.onData(chunk => {
      data += chunk;
      var decipherText = simpleCrypto.decrypt(chunk.toString());
      this.writeOriginal(decipherText);
    });
    stream.onEnd(() => {
      this.setState({ playvideo: !this.state.playvideo });
      console.log("file decrypted");
    });
  });

Функция добавления расшифрованного base64 и создания файла .mp4:

writeOriginal(decipherText) {
RNFetchBlob.fs
  .appendFile(
    RNFetchBlob.fs.dirs.DCIMDir + "/encryptfile2.mp4",
    decipherText,
    "base64"
  )
  .then(() => {
    console.log("File Written");
  })
  .catch(error => {
    console.log("file writing error", error);
  });
}
...