javascript - 如何在 React Native 和 Node 中计算校验和?

标签 javascript node.js react-native aws-lambda react-native-fs

我正在将图像文件从 React Native 上传到 AWS Lambda (Node 10.x),并想验证我发送的文件的哈希值是否与收到的文件匹配。为此,我在 React Native 中使用哈希,并在 Lambda 中再次使用,但哈希从不匹配。以下是我尝试过的相关代码。

native react

import RNFS from "react-native-fs";
const contentChecksum = await RNFS.hash(post.contentUrl, "md5");

Lambda( Node )

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");

这些校验和永远不会匹配。我尝试在 Node (data.Body.toString("base64")) 和 sha256 中使用 base64 编码。计算校验和以使它们在 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 中错误地计算散列,但我不确定如何计算。我正在使用 hash来自 react-native-fs 包的函数。

最佳答案

您可以在 ReactAWS 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>
        )
    }

}

并且变量 hash 必须包含您在 AWS 上获得的相同值。

为了运行你必须安装加密库:

npm i --save react-native-crypto

更改 YOUR_KEY 变量,然后运行应用程序:

npm start

在浏览器中你应该得到:

4b751fef5e9660e3943173fd3e6c4224

关于javascript - 如何在 React Native 和 Node 中计算校验和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57680251/

相关文章:

javascript - 通过 OAuth 进行 Yahoo 身份验证,无需任何重定向(客户端)。是否可以?

javascript - 防止 MVC 提供 .js、.css 等静态文件

node.js - 向不与我的机器人共享服务器的用户发送消息

node.js - Nodejs - 依赖项(非常基本的) - Express -> 它是 NodeJS 或插件的一部分

react-native - 在图像的顶角放置一个 'x',用于删除(React Native)

javascript - react 如何在空时显示标签

Javascript 和 Jquery 弹出窗口

node.js - Node js同步请求代码不起作用

react-native - 使用 react-native-maps 和 use_frameworks 找不到 Pod 安装错误 `React/RCTView.h' 文件

react-native - 如何开始使用 react-native-bootsplash