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

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.contentUrlfile:///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包中的哈希函数。

Ale*_*dro 2

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

}
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)