web-dev-qa-db-ja.com

Reactネイティブおよびノー​​ドでチェックサムを計算する方法は?

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 関数を使用しています。

6
Fook

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
1
Alessandro

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');
1
Savaj Patel