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

How to calculate checksum in React Native and Node?

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

React Native

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

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

这些校验和永远不匹配。我尝试在 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 来自节点 (Lambda):7b30b61a55d2c39707082293c625fc10

data.Body 是一个 Buffer

我还注意到 S3 对象上的 eTag 属性与我在 Node 中计算的 md5 校验和匹配。由于 eTag 通常是 文件的 md5 散列,这告诉我我可能在 React Native 中错误地计算了散列,但我不确定如何计算。我正在使用 react-native-fs 包中的 hash 函数。

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

您可以使用 crypto 模块。

要获取所有可用哈希算法的列表,您可以使用 crypto.getHashes()

这是一个 Nodejs 示例:

var crypto = require('crypto')

crypto.getHashes() // [ 'dsa', 'dsa-sha', ..., 'md5', ... ]

这是一个从字符串输入生成校验和值的辅助方法:

var crypto = require('crypto')

function checksum(str, algorithm, encoding) {
  return crypto
    .createHash(algorithm || 'md5')
    .update(str, 'utf8')
    .digest(encoding || 'hex')
}

checksum('This is my test text'); 
checksum('This is my test text', 'sha1');