เมธอด crypto.scrypt() ให้การใช้งานแบบอะซิงโครนัสสำหรับฟังก์ชัน scrypt ฟังก์ชัน scrypt เป็นฟังก์ชันแปลงกุญแจจากรหัสผ่าน (password-based key derivation function) ที่ปกป้องระบบจากการโจมตีแบบ brute-force และทำให้ไม่คุ้มค่า แต่ฟังก์ชัน scrypt ใช้ทรัพยากร CPU และหน่วยความจ่ายสูง
ไวยากรณ์
crypto.scrypt(password, salt, keylen, [options], [callback])
พารามิเตอร์
พารามิเตอร์ข้างต้นอธิบายดังนี้:
password – ฟิลด์รหัสผ่านสำหรับ scrypt ที่ต้องใช้ถอดรหัส รายการสามารถเป็น string, object, TypedArray ฯลฯ
salt – ค่านี้ควรเป็นเอกลักษณ์มากที่สุด ใช้สำหรับเข้ารหัสข้อมูล ความยาวขั้นต่ำที่แนะนำของ salt คือ 16 ไบต์
keylen – พารามิเตอร์นี้กำหนดความยาวของกุญแจ และควรเป็นตัวเลข
options
cost – ต้นทุน CPU ต่อหน่วยความจำ ค่านี้ควรเป็นกำลังของ 2 ที่มากกว่า 1 ค่าเริ่มต้นคือ 16384
blockSize – พารามิเตอร์นี้กำหนดค่าขนาดบล็อกแต่ละบล็อก ค่าเริ่มต้นคือ 8
parallelization – พารามิเตอร์นี้กำหนดพารามิเตอร์การประมวลผลแบบขนาน ค่าเริ่มต้นคือ 1
N – พารามิเตอร์นี้เป็นอีเลียสของ cost สามารถใช้แทนได้ แต่สามารถกำหนดได้เพียงอย่างใดอย่างหนึ่ง
r – พารามิเตอร์นี้เป็นอีเลียสของ blockSize เช่นเดียวกัน สามารถกำหนดได้เพียงอย่างใดอย่างหนึ่ง
p – อีเลียสของ parallelization สามารถกำหนดได้เพียงอย่างใดอย่างหนึ่ง
maxmem – ค่าขีดจำกัดหน่วยความจำสูงสุด จะข้อกลับข้อผิดพลาดเมื่อ
128*N*r > maxmemค่าเริ่มต้นคือ32*1024*1024
callback – ฟังก์ชันนี้จะถูกเรียกเมื่อมีข้อผิดพลาดเกิดขึ้น หากต้องการจัดการ
ตัวอย่าง
สร้างไฟล์ชื่อ scrypt.js และคัดลอกโค้ดด้านล่าง หลังจากสร้างไฟล์แล้ว ใช้คำสั่งต่อไปนี้เพื่อรันโค้ด:
node scrypt.js
scrypt.js
// โปรแกรม Node.js สาธิตการทำงานของเมธอด crypto.scrypt()
// นำเข้าโมดูล crypto
var crypto = require('crypto');
// เรียกเมธอด scrypt() ด้วยพารามิเตอร์ด้านล่าง
crypto.scrypt('tutorialspoint', 'asdfghjkl', 32, (err, derivedKey) => {
if (err) throw err;
// แสดงกุญแจที่แปลงมาในรูปแบบบัฟเฟอร์
console.log("The derived key(1) is:", derivedKey);
});
// เรียกเมธอด scrypt() ด้วยตัวเลือก cost
crypto.scrypt('GeeksforGeeks', 'tfytdx', 128, { N: 512 }, (err, derivedKey) => {
if (err) throw err;
// แสดงกุญแจที่แปลงมาในรูปแบบบัฟเฟอร์
console.log("The derived key(2) is:", derivedKey);
console.log();
});
ผลลัพธ์
C:\home\node>> node scrypt.js The derived key(2) is: <Buffer b3 f8 72 5f 58 df 98 d9 c0 8a ba 0c 2c 50 85 b1 76 de 39 35 40 27 7d 57 f1 6a a1 07 54 dc c9 63 65 32 f2 db 29 95 dc ee 0b 9f e3 d5 0a 9e 3a d0 f6 b4 ... > The derived key(1) is: <Buffer ae 50 38 61 17 f7 11 51 e4 50 63 3c 2a 9c ec f0 46 42 a6 ca 04 78 67 05 c8 8c 0c 69 00 c3 03 7f>
ตัวอย่างเพิ่มเติม
ลองดูตัวอย่างอีกหนึ่งกรณี:
// โปรแกรม Node.js สาธิตการทำงานของเมธอด crypto.scrypt()
// นำเข้าโมดูล crypto
var crypto = require('crypto');
// เริ่มต้นค่า salt เป็น TypedArray
const salt = new Uint32Array(7);
// ใช้เมธอด scrypt() ด้วยพารามิเตอร์ด้านล่าง
crypto.scrypt('WelcomeTutorialspoint', salt, 16, (err, derivedKey) => {
if (err) throw err;
// แสดงกุญแจที่แปลงมาในรูปแบบสตริงเข้ารหัส
console.log("The derived key(1) is:", derivedKey.toString("ascii"));
});
// เริ่มต้นค่า salt เป็น DataView
const newSalt = new DataView(new ArrayBuffer(5));
// ใช้เมธอด scrypt() ด้วยพารามิเตอร์ cost
crypto.scrypt('HelloTutorialspoint', newSalt, 16, { N: 32 }, (err, derivedKey) => {
if (err) throw err;
// แสดงกุญแจที่แปลงมาในรูปแบบสตริงเข้ารหัส
console.log("The derived key(2) is:", derivedKey.toString("base64"));
});
ผลลัพธ์
C:\home\node>> node scrypt.js The derived key(2) is: PBYDRlgayLVGjC8z3YUcSQ== The derived key(1) is: <Uu0allCb,d?,Z5_