Foo*_*ook 6 javascript node.js aws-lambda react-native react-native-fs
我正在将图像文件从React Native上传到AWS Lambda(Node 10.x),并想验证我发送的文件的哈希与收到的文件匹配。为此,我在React Native和Lambda中再次使用了哈希,但是哈希值始终不匹配。这是我尝试过的相关代码。
反应本机
import RNFS from "react-native-fs";
const contentChecksum = await RNFS.hash(post.contentUrl, "md5");
Run Code Online (Sandbox Code Playgroud)
Lambda(节点)
import AWS from "aws-sdk";
const crypto = require("crypto");
const s3 = new AWS.S3();
const data = await s3
.getObject({
Bucket: file.bucket,
Key: file.key
})
.promise();
const contentChecksum = crypto
.createHash("md5")
.update(data.Body)
.digest("hex");
Run Code Online (Sandbox Code Playgroud)
这些校验和永远不匹配。我试过base64
在Node(data.Body.toString("base64")
)中也使用编码sha256
。计算校验和以便它们在React Native和Node中匹配的诀窍是什么?
编辑:这是最近一次测试的结果。
post.contentUrl
: file:///Users/xxxxxxx/Library/Developer/CoreSimulator/Devices/2F2F4FD3-574E-40D7-BE6B-7080E926E70A/data/Containers/Data/Application/65A3FF67-98B2-444D-B75D-3717C1274FBC/Library/Caches/Camera/FDCD8F90-D24F-4E64-851A-96AB388C4B59.jpg
(该文件在iPhone上是本地的)
contentChecksum
来自React Native:48aa5cdb30f01719a2b12d481dc22f04
contentChecksum
来自Node(Lambda):7b30b61a55d2c39707082293c625fc10
data.Body
是一个Buffer
。
我还注意到,S3对象上的eTag属性与我在Node中计算的md5校验和匹配。由于eTag 通常是文件的md5哈希值,因此这告诉我在React Native中可能会错误地计算哈希值,但是我不确定如何。我正在使用react-native-fs包中的哈希函数。
您可以在React和AWS Lambda上使用相同的代码,即Node.js。
因此,在您的React.js应用程序中,您可以使用以下代码:
import * as React from 'react';
import crypto from 'crypto';
var key = 'YOUR_KEY';
export default class Test extends React.Component {
render() {
var hash = crypto.createHash('md5').update(key).digest('hex');
return (
<div>
{hash}
</div>
)
}
}
Run Code Online (Sandbox Code Playgroud)
并且该变量hash
必须包含与您在 AWS 上获得的值相同的值。
为了运行你必须安装加密库:
npm i --save react-native-crypto
Run Code Online (Sandbox Code Playgroud)
更改变量 YOUR_KEY,然后运行应用程序:
npm start
Run Code Online (Sandbox Code Playgroud)
在浏览器中你应该得到:
4b751fef5e9660e3943173fd3e6c4224
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
405 次 |
最近记录: |