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