React NativeからAWS Lambda(ノード10.x)に画像ファイルをアップロードしていて、送信したファイルのハッシュが受信したファイルと一致することを確認したい。これを行うには、React NativeとLambdaでハッシュを使用していますが、ハッシュは一致しません。これが私が試したコードの関連ビットです。
リアクトネイティブ
_import RNFS from "react-native-fs";
const contentChecksum = await RNFS.hash(post.contentUrl, "md5");
_
ラムダ(ノード)
_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")
)および_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
from Reactネイティブ:48aa5cdb30f01719a2b12d481dc22f04
NodeからのcontentChecksum
(ラムダ):7b30b61a55d2c39707082293c625fc10
_data.Body
_はBuffer
です。
また、S3オブジェクトのeTag属性が、ノードで計算している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');