2

Node の標準ライブラリに Crypto モジュールが必要です。登録フォームを処理するこの POST ルートがあります。

app.post('/superadmin/add-account', function(req, res) {

  // Shorthand variable
  var doc = req.body;

  crypto.randomBytes(32, function(err, buf) {

    if (err) throw err;

    // Sanitise and transform user input
    ... 

    // Validate user input
    ... 

    var errors = validator.getErrors();

    // Generate new object data
    doc.salt = buf; 
    doc.pass = doc.salt + 'justForNow';

    console.log(doc);

ドキュメント (req.body) を出力すると、奇妙な値が表示されるようになりました... コンソールに出力される buf は、ほとんどが疑問符の付いたボックスに似た文字で構成されています。これは正しいです?しかし、bufをdoc.saltに保存してこれを出力すると、完全に別のものを取得します...「Slowbuffer ae be C5 A3 E3 ....など」

Q1: crypto.randomBytes() によって生成されたソルトを使用して文字列と連結したり保存したりする前に、何か特別なことをする必要がありますか?

Q2: crypto.randomBytes() 関数には非同期バージョンと同期バージョンがあります。非同期バージョンを使用していますが、その理由が本当にわかりませんか? =PI は、非同期コールバックは、時間がかかる可能性のある I/O 操作を処理するときに主に使用されると考えていました...または、この関数のコールバック バージョンを使用しているのでしょうか。これは、実際には時間がかかり、一部の MS のためにシステムをロックする複雑なプロセスであるためです。同期バージョンを使用する場合

Q3:私はまだそこにいませんが、ソルト + パスワードをハッシュするために The Crypto モジュールのハッシュ関数を使用してこのコードを続行し、それを DB に保存します。次のような var を作成する必要があることはわかっています。

var sha256 = crypto.createHash('sha256'); 

しかし、私は今これをどのように使用しているか理解していません。

4

1 に答える 1

1

でランダムなバイトを生成している場合crypto.randomBytes()、バイトはランダムであるため、バイトを解析するための特別なものはありません。ランダム バイトは 2 桁の 16 進数で構成されているため、 を使用している場合、バイトは ~ の間のbuffer.toString()任意の UTF-8 数字にマップできます。00FF

randomBytes()関数を使用するSlowBufferと、 の内部クラスである が得られますBuffer

<SlowBuffer 76 46 14 02>
// v F \u0014 \u0002

2 桁の 16 進数の UTF-8 表現が存在しない場合、文字化けした文字列が得られます。

<Buffer 96>
// �
<SlowBuffer 9e 94>
// ��

2 番目の質問については、関数の非同期バージョンまたは同期バージョンを使用するかどうかはあなた次第ですrandomBytes()。関数が使用する CPU 時間は、要求するランダム バイト数にも依存します。1 兆のランダム バイトが必要な場合は、かなりの時間イベント ループをブロックしますが、10 のランダム バイトが必要な場合は、数ミリ秒しかかかりません。

ほとんどの場合、操作を HTTP ハンドラーに入れる場合は、非同期バージョンを使用する必要があります。これは、イベント ループのブロックを何としても避けたいからです。これは、してはいけないことの例です。

app.post('/', function(req, res) {
  crypto.randomBytes(1000000000);
});

上記を実行すると、サーバーが他の着信 HTTP 要求を処理するのを停止します。

最後の質問については、ハッシュ オブジェクトを作成しましたが、そのデータを更新したり、ダイジェストを計算したりしていません。ハッシュの文字列表現にはそれぞれ と を使用hash.update()します。hash.digest()

var crypto = require('crypto');
var hash = crypto.createHash('sha256').update(data).digest('hex');

このhash.update()関数は、データのチャンクとエンコーディングの 2 つの引数をhash.digest()受け入れ、エンコーディングを受け入れます。

于 2013-10-08T14:49:40.687 に答える