web-dev-qa-db-ja.com

Node.jsでBase64エンコーディングをするにはどうすればいいですか?

Node.jsにはまだbase64エンコーディングが組み込まれていますか?

私がこれを要求するのは、cryptoからのfinal()は16進数、2進数、またはASCIIのデータしか出力できないからです。例えば:

var cipher = crypto.createCipheriv('des-ede3-cbc', encryption_key, iv);
var ciph = cipher.update(plaintext, 'utf8', 'hex');
ciph += cipher.final('hex');

var decipher = crypto.createDecipheriv('des-ede3-cbc', encryption_key, iv);
var txt = decipher.update(ciph, 'hex', 'utf8');
txt += decipher.final('utf8');

ドキュメントによると、update()はbase64でエンコードされたデータを出力できます。ただし、final()はbase64をサポートしていません。私は試してみました、そしてそれは壊れるでしょう。

私がこれをするならば:

var ciph = cipher.update(plaintext, 'utf8', 'base64');
    ciph += cipher.final('hex');

それでは、復号化には何を使うべきですか? 16進数かbase64か

したがって、暗号化された16進数の出力をbase64でエンコードするための関数を探しています。

ありがとう。

721
murvinlai

バッファ は、文字列またはデータを取得し、結果をbase64でエンコードするために使用できます。例えば:

> console.log(Buffer.from("Hello World").toString('base64'));
SGVsbG8gV29ybGQ=
> console.log(Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii'))
Hello World

バッファはグローバルオブジェクトなので、必須ではありません。文字列で作成されたバッファは、文字列がどのエンコーディングであるかを指定するためにオプションのencodingパラメータを取ることができます。利用可能なtoStringおよびBufferコンストラクタエンコーディングは次のとおりです。

'ascii' - 7ビットASCIIデータ専用。このエンコード方式は非常に高速で、設定されていると上位ビットを取り除きます。

'utf8' - マルチバイトエンコードのUnicode文字。多くのWebページおよび他の文書フォーマットはUTF-8を使用しています。

'ucs2' - 2バイト、リトルエンディアンでエンコードされたUnicode文字。 BMP(基本多言語面、U + 0000 - U + FFFF)のみをエンコードできます。

'base64' - Base64文字列エンコーディング。

'binary' - 各文字の最初の8ビットのみを使用して、生のバイナリデータを文字列にエンコードする方法。この符号化方法は推奨されていないので、可能であればBufferオブジェクトを優先して避けるべきです。このエンコーディングは将来のNodeのバージョンで削除される予定です。

1712
onteria_

承認された回答には、6よりも大きいノードバージョンでセキュリティ上の問題と見なされるものが含まれています(ただし、このユースケースでは入力を常に文字列に強制変換できる可能性があります)。

Bufferコンストラクタは ドキュメンテーション に従って非推奨です。

こちら は、wsライブラリでそれを使用した結果として起こりうる脆弱性の一例です。

コードスニペットは次のようになります。

console.log(Buffer.from("Hello World").toString('base64'));
console.log(Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii'));
184
NotJavanese

cryptoはbase64( reference )をサポートするようになりました。

cipher.final('base64') 

だからあなたは単にすることができます:

var cipher = crypto.createCipheriv('des-ede3-cbc', encryption_key, iv);
var ciph = cipher.update(plaintext, 'utf8', 'base64');
ciph += cipher.final('base64');

var decipher = crypto.createDecipheriv('des-ede3-cbc', encryption_key, iv);
var txt = decipher.update(ciph, 'base64', 'utf8');
txt += decipher.final('utf8');
36
Javier Ferrero

ノードAPI nodejsバージョン10.7.0でbase64文字列をデコードするために次のコードを使用しています

let data = 'c3RhY2thYnVzZS5jb20=';  // Base64 string
let buff = new Buffer(data, 'base64');  //Buffer
let text = buff.toString('ascii');  //this is the data type that you want your Base64 data to convert to
console.log('"' + data + '" converted from Base64 to ASCII is "' + text + '"'); 

ブラウザーのコンソールで上記のコードを実行しようとしないでください、動作しません。 nodejsのサーバー側ファイルにコードを配置します。 API開発で上記の行コードを使用しています。

0