如何在 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 函数。
您可以在 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>
)
}
}
并且变量 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');
我正在将图像文件从 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 函数。
您可以在 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>
)
}
}
并且变量 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');