Node.js的文档中好像不再推荐new Buffer()方法了,看原因的时候,有这么一句:
The memory allocated for such Buffer instances is not initialized and can contain sensitive data. Such Buffer instances must be initialized manually by using either buf.fill(0) or by writing to the Buffer completely.
意思好像是说为这种方式创建的Buffer对象分配的内存并不是新申请的,而且可能会包含敏感信息?这样的Buffer实例必须手动填满。
这是为什么?
我不是计算机专业出身,有些地方不太理解。我查了下《深入浅出Node.js》的Buffer内存管理部分,确实是用的slab分配策略,小对象的话,是可能使用已经存在的slab单元的。但是使用不是应该是剩下的空白内存部分么?怎么会可能包含信息?而且为什么必须完全地手动来填满?我没学过计算机原理,这块实在不能理解,空着一块内存确实是浪费,但是为什么必须要填满。。。
PHP中文网2017-04-17 14:46:30
たとえば。あなたは店(ノード)で、ゲスト(プログラマ)は食事をしに来ます。あなたは顧客に料理(メモリブロック)を提供しますが、ゲストは夕食後に皿を洗いません(JSにはデストラクタのようなものはありません)。
効率を高めるために、ディッシュを再利用します (スラブ、メモリの再利用)。
最初は、ゲストが使用するための真新しい皿と箸がいくつかありました (空白の記憶) 徐々に、すべての皿と箸が少なくとも 1 回使用されたものになります (空白の記憶はすべて使用されています)。
new Buffer()
料理を顧客に直接渡します。前の客が茶わんの中身を空に(破壊)しなかった場合、客は前の客が米を食べたか雑穀を食べたかを容易に知ることができる。したがって、ゲストは食器を使用する前に洗う必要があります。
問題は、いつ皿洗いをするかです。
new Buffer()
を使用すると、お椀と箸の再利用のみがお客様の責任であり、食事前に茶わんと箸を洗うのはゲストの責任となります。 Buffer.from
を使用する場合、茶わんや箸を再利用するだけでなく、茶わんや箸を直接使用する顧客に渡す前にそれらを洗浄する責任もあります。
どちらの方法にもそれぞれ長所と短所があります。Unsafe ではメモリを初期化せずに直接メモリを割り当てます。そのため、バッファに割り当てた後、1024 バイトのバッファを割り当てます。実際、それは問題ではありません。また、書き込むデータの量が分からないが、それが 1024 未満である場合は、Buffer.alloc(1024) を追加で初期化する必要があります。これにより、すべてのパスワードが即座に読み出され、その後の部分も \0
になります。前回パスワードを保存したメモリを再利用して、パスワードを読み出すという恥ずかしい事態は発生しません。パスワードを直接入力します。