Score:0

เตรียมโมดูลการลงนาม/การตรวจสอบจากโหนด js crypto

ธง cn

ฉันกำลังทำงานกับโมดูล crypt ของโหนดที่จะเซ็นชื่อ/ตรวจสอบ ฉันได้จัดการโมดูลการตรวจสอบแล้ว:

'ใช้อย่างเข้มงวด';

const crypto = ต้องการ ('crypto');
const fs = ต้องการ ('fs');
เส้นทาง const = ต้องการ ('เส้นทาง');

const publicKey = fs.readFileSync(path.join(__dirname, 'key.pub'));
const encryptDataPath = path.join(__dirname, 'encryptData.txt');
ให้ encryptData = fs.readFileSync(encryptDataPath).toString();

//console.log(เข้ารหัสข้อมูล);


// เริ่มถอดรหัส
const plainEncryptData = Buffer.from(encryptData, 'base64').toString();


const [ลายเซ็นb64, contentb64] = plainEncryptData.split('\n');


ลายเซ็น const = Buffer.from (ลายเซ็นb64, 'base64');
เนื้อหา const = Buffer.from(contentb64, 'base64').toString();

ตัวตรวจสอบ const = crypto.createVerify ('RSA-SHA256');
verifier.update (เนื้อหา);
verifier.end();

const isValid = verifier.verify (publicKey, ลายเซ็น);

ถ้า (!isValid) {
    console.log('ไม่ถูกต้อง');
} อื่น {    
    console.log (เนื้อหา);
}

นี่คือรหัสสาธารณะ (pub.key):

----- เริ่มคีย์สาธารณะ -----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApuI1XlPkYos3WsSeVPtS
l1Q2k8GnLEO5vFZ4EuSghMbqI+yE0tWVEaiptdV3KgERaALRXmH+IFrHqvSRjKQC
1ORUarBU5ntWbNEr713R3K0BPOzz9OOoWHdk+Wmr4ViOTk0iD1u4bw/97RpyMoBm
+pXeBLHbEESK2kelk+LEmKUoY5nXp6KzZV5wxgD5QweZheU7mjXL5WMpIBJva8kp
RZMYXEF+uSZIep0q5FHEo2AazGUMAU3GjY/dpXisLmtleOa1xlKZmkvaXl/D2Mhb
BBqPbDMa72ToZg2J8K5UP9zXUP41FHr7o9rwSJ2uOkuZPg5nhDXeoVbrJwxP/U1M
nQIDAQAB
----- สิ้นสุดรหัสสาธารณะ -----

นี่คือ encryptData.txt (เข้ารหัสข้อมูล)

ZmZzeUNhcmU2Q1pTRHo2M0VrT0tGeGJUWitDMGJydnF0dzRWZDc5STJIUTJuWndPZzVoaE8rbU5keEhIMHBEak0xVUxHRGNYQ0w1Wk5maVN4M096dDJXZEowSmk4R1pGZTZOc0s1dm05SDJHd1hUR3Q0VHl1ejFkbGlqbjRwcTBSM0xLSDl6SThWT1RLNTdySWlGeVZQa0pxQzJJMkowaW1LYTZxbWpGU0hsVTVQU3BrVk9YYUxGMVJNQjBsWm5ncDcwMEJXT1k4V3FlSHlvS0pKY0NXTkpJRGRDWEw1ZWpuTXFpY0VUTzZWV25BMThkVitRQUZRS2k5SG5SR1VuVGhlYUI2QU9jcWRzMGZzWVlvM0xZZlQwbDZELzJHd0dJZXZ3LzlxMmoxVmJKcFNBUTBldTJYUlJ4Z2VFZmFlQys0MUZIZ0haNHc4UXBmb09leW1WSkN3PT0KZXlKMGVYQmxJam9pWW5KdmJucGxJaXdpWTNWemRHOXRaWEpKWkNJNklqRTJRMDlXVWxOak9YZ3lNV1pEU0c1Rklpd2laWGh3YVhKbFFYUWlPakUyTWpZMU56WXpOakl3TURBc0ltbHpWSEpwWVd3aU9uUnlkV1VzSW14cFkyVnVjMlZMWlhraU9pSmpPVEk1TldJMk9TMWlaV1UyTFRRek1XRXRPR1EzWkMwd1lqYzBNR1l3TVdOaE1tUWlMQ0pqY21WaGRHVmtRWFFpT2pFMk1qVXpOalkzTmprMU16Rjk=

ตอนนี้ฉันกำลังพยายามสร้างโมดูลการลงนามซึ่งจะสร้างข้อมูลที่เข้ารหัสเหมือนกับ encryptData.txt:

'ใช้อย่างเข้มงวด';

const crypto = ต้องการ ('crypto');
const fs = ต้องการ ('fs');
เส้นทาง const = ต้องการ ('เส้นทาง');

const publicKey = fs.readFileSync(path.join(__dirname, 'key.pub'));

ให้เนื้อหา = {}
content.type = "บรอนซ์";
content.customerId = "16COVRSc9x21fCHnE";
content.expireAt = 1626576362000;
content.isTrial = จริง;
content.licenseKey = "c9295b69-bee6-431a-8d7d-0b740f01ca2d";
content.createdAt = 1625366769531;


const encryptDataPath = path.join(__dirname, 'encryptData.txt');
ให้ a = fs.readFileSync(encryptDataPath).toString();

//เซ็น
ผู้ลงนาม const = crypto.createSign ('RSA-SHA256');
signer.update (เนื้อหา);
signer.end();

ลายเซ็น const = signer.sign (publicKey, 'base64');

console.log('เครื่องหมาย:', ลายเซ็น);
 

แต่เมื่อฉันรันโมดูลเข้ารหัสนี้ มันแสดงข้อผิดพลาดนี้:

ภายใน/crypto/util.js:97
    โยน ERR_INVALID_ARG_TYPE ใหม่ (
    ^

TypeError [ERR_INVALID_ARG_TYPE]: อาร์กิวเมนต์ "data" ต้องเป็นหนึ่งในประเภท string, Buffer, TypedArray หรือ DataView วัตถุประเภทที่ได้รับ
    ที่ Sign.update (ภายใน/crypto/sig.js:49:10)
    ที่ Object.<anonymous> (/home/ubuntu/www/node-encrpt/encode.js:23:8)
    ที่ Module._compile (ภายใน/โมดูล/cjs/loader.js:959:30)
    ที่ Object.Module._extensions..js (ภายใน/โมดูล/cjs/loader.js:995:10)
    ที่ Module.load (ภายใน/โมดูล/cjs/loader.js:815:32)
    ที่ Function.Module._load (ภายใน/โมดูล/cjs/loader.js:727:14)
    ที่ Function.Module.runMain (ภายใน/โมดูล/cjs/loader.js:1047:10)
    ที่ internal/main/run_main_module.js:17:11 {
  รหัส: 'ERR_INVALID_ARG_TYPE'
}

ฉันไม่สามารถเข้าใจได้ว่าเหตุใดจึงเกิดขึ้น

ฉันจะทำโมดูลเข้ารหัสให้เสร็จสมบูรณ์ได้อย่างไร

DannyNiu avatar
vu flag
เนื่องจาก *บทบาท* ของคีย์สาธารณะและคีย์ส่วนตัวของ RSA มีความสมมาตรทางคณิตศาสตร์ หลายคนจึงสับสนว่าการเซ็นชื่อ RSA เป็น "เข้ารหัสด้วยคีย์ส่วนตัว" การลงนาม RSA ต้องใช้รหัสส่วนตัว แต่ดูเหมือนว่าคุณใช้รหัสสาธารณะในการลงชื่อเข้าใช้รหัสของคุณ ลองตรวจสอบคู่คีย์และการใช้งาน API อีกครั้ง

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา