Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 保护SD卡并通过应用程序访问_Android_React Native_Encryption_React Native Android - Fatal编程技术网

Android 保护SD卡并通过应用程序访问

Android 保护SD卡并通过应用程序访问,android,react-native,encryption,react-native-android,Android,React Native,Encryption,React Native Android,我的SD卡里有分类数据。是否只有通过应用程序(react native project)才能访问SD卡?涉及的文件是.mp4文件 我发现的大多数解决方案都是关于使用AES加密对SD卡中的数据进行加密。但我处理的是大文件,因此一次解密整个文件将抛出内存异常 其次,逐流读取整个数据流是可能的,当我测试此方法时,第一组流(加密)将成功解密。下一个流将导致错误格式错误的UTF-8数据 第三,我试着将文件分成几部分,解密每一部分并附加它们以生成预期的文件。我得到的问题在这里指定 编辑: 用于加密的包: 用

我的SD卡里有分类数据。是否只有通过应用程序(react native project)才能访问SD卡?涉及的文件是.mp4文件

我发现的大多数解决方案都是关于使用AES加密对SD卡中的数据进行加密。但我处理的是大文件,因此一次解密整个文件将抛出
内存异常

其次,逐流读取整个数据流是可能的,当我测试此方法时,第一组流(加密)将成功解密。下一个流将导致错误
格式错误的UTF-8数据

第三,我试着将文件分成几部分,解密每一部分并附加它们以生成预期的文件。我得到的问题在这里指定

编辑:

用于加密的包:

用于逐个流解密文件流的函数:

 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卡中,并在应用程序中访问。

使用的软件包是&

逐流加密和在内存中写入:

逐流解密:

用于附加解密的base64并生成.mp4文件的函数:


你想从这个问题中得到什么还不是很清楚。在SD上设置密码?修复您的编码问题,但代码在哪里?@MaartenBodewes,谢谢您的评论,我已经重新定义了我的问题。我基本上想要一种方法来保护我的SD卡并通过我的应用程序访问它。AES是一种块大小为16字节的分组密码。因此,您不必一次处理整个文件。您可以以16字节的块处理它。每种好的编程语言都提供密码流,允许在读/写数据时解密数据。我假设react native也提供了这样的接口。普通的Android API确实支持它。很遗憾,我不知道这个问题的答案。我确实认为你解决了这个问题的大部分问题。但请注意,创建此库只是为了加密JS对象。它不是为加密文件而设计的。它确实指明了用于创建功能的库;可能该库包含了所需的较低级别的功能吗?我在@Robert中找到了它。您的评论让我有了进一步的见解。您的大型视频是否被嵌入到多个dat文件中?以后如何将它们解密并合并为一个mp4?
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");
    });
  });
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);
  });
}