Crypto
[مستقر: 2 - مستقر]
مستقر: 2 الاستقرار: 2 - مستقر
الكود المصدري: lib/crypto.js
توفر وحدة node:crypto
وظائف تشفير تتضمن مجموعة من الأغلفة لوظائف التجزئة و HMAC والتشفير وفك التشفير والتوقيع والتحقق الخاصة بـ OpenSSL.
const { createHmac } = await import('node:crypto');
const secret = 'abcdefg';
const hash = createHmac('sha256', secret)
.update('I love cupcakes')
.digest('hex');
console.log(hash);
// Prints:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
const { createHmac } = require('node:crypto');
const secret = 'abcdefg';
const hash = createHmac('sha256', secret)
.update('I love cupcakes')
.digest('hex');
console.log(hash);
// Prints:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
تحديد ما إذا كان دعم التشفير غير متاح
من الممكن إنشاء Node.js بدون تضمين دعم وحدة node:crypto
. في مثل هذه الحالات ، ستؤدي محاولة import
من crypto
أو استدعاء require('node:crypto')
إلى حدوث خطأ.
عند استخدام CommonJS ، يمكن التقاط الخطأ الذي تم إرجاعه باستخدام try/catch:
let crypto;
try {
crypto = require('node:crypto');
} catch (err) {
console.error('crypto support is disabled!');
}
عند استخدام كلمة import
المعجمية ESM ، لا يمكن التقاط الخطأ إلا إذا تم تسجيل معالج لـ process.on('uncaughtException')
قبل أي محاولة لتحميل الوحدة النمطية (باستخدام ، على سبيل المثال ، وحدة تحميل مسبق).
عند استخدام ESM ، إذا كانت هناك فرصة لتشغيل التعليمات البرمجية على إصدار من Node.js حيث لم يتم تمكين دعم التشفير ، ففكر في استخدام الدالة import()
بدلاً من كلمة import
المعجمية:
let crypto;
try {
crypto = await import('node:crypto');
} catch (err) {
console.error('crypto support is disabled!');
}
الصنف: Certificate
أضيف في: v0.11.8
SPKAC هي آلية طلب توقيع الشهادة تم تنفيذها في الأصل بواسطة Netscape وتم تحديدها رسميًا كجزء من عنصر keygen
في HTML5.
تم إهمال \<keygen\>
منذ HTML 5.2 ولا ينبغي للمشاريع الجديدة استخدام هذا العنصر بعد الآن.
توفر الوحدة node:crypto
الصنف Certificate
للعمل مع بيانات SPKAC. الاستخدام الأكثر شيوعًا هو معالجة الإخراج الذي تم إنشاؤه بواسطة عنصر HTML5 \<keygen\>
. يستخدم Node.js تنفيذ SPKAC الخاص بـ OpenSSL داخليًا.
الطريقة الثابتة: Certificate.exportChallenge(spkac[, encoding])
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن تكون وسيطة spkac عبارة عن ArrayBuffer. تم تقييد حجم وسيطة spkac بحد أقصى 2**31 - 1 بايت. |
v9.0.0 | أضيف في: v9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> ترميز سلسلةspkac
.- إرجاع: <Buffer> مكون التحدي في بنية بيانات
spkac
، والذي يتضمن مفتاحًا عامًا وتحديًا.
const { Certificate } = await import('node:crypto');
const spkac = getSpkacSomehow();
const challenge = Certificate.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// طباعة: التحدي كسلسلة UTF8
const { Certificate } = require('node:crypto');
const spkac = getSpkacSomehow();
const challenge = Certificate.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// طباعة: التحدي كسلسلة UTF8
طريقة ثابتة: Certificate.exportPublicKey(spkac[, encoding])
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 15.0.0 | يمكن أن تكون وسيطة spkac هي ArrayBuffer. تم تحديد حجم وسيطة spkac بحد أقصى 2**31 - 1 بايت. |
الإصدار 9.0.0 | تمت الإضافة في: الإصدار 9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> ترميز سلسلةspkac
.- الإرجاع: <Buffer> مكون المفتاح العام لهيكل البيانات
spkac
، والذي يتضمن مفتاحًا عامًا وتحديًا.
const { Certificate } = await import('node:crypto');
const spkac = getSpkacSomehow();
const publicKey = Certificate.exportPublicKey(spkac);
console.log(publicKey);
// طباعة: المفتاح العام كـ <Buffer ...>
const { Certificate } = require('node:crypto');
const spkac = getSpkacSomehow();
const publicKey = Certificate.exportPublicKey(spkac);
console.log(publicKey);
// طباعة: المفتاح العام كـ <Buffer ...>
طريقة ثابتة: Certificate.verifySpkac(spkac[, encoding])
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 15.0.0 | يمكن أن تكون وسيطة spkac هي ArrayBuffer. تمت إضافة الترميز. تم تحديد حجم وسيطة spkac بحد أقصى 2**31 - 1 بايت. |
الإصدار 9.0.0 | تمت الإضافة في: الإصدار 9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> ترميز سلسلةspkac
.- الإرجاع: <boolean>
صحيح
إذا كان هيكل بياناتspkac
المعطى صالحًا، وخطأ
خلاف ذلك.
import { Buffer } from 'node:buffer';
const { Certificate } = await import('node:crypto');
const spkac = getSpkacSomehow();
console.log(Certificate.verifySpkac(Buffer.from(spkac)));
// طباعة: صحيح أو خطأ
const { Buffer } = require('node:buffer');
const { Certificate } = require('node:crypto');
const spkac = getSpkacSomehow();
console.log(Certificate.verifySpkac(Buffer.from(spkac)));
// طباعة: صحيح أو خطأ
واجهة برمجة التطبيقات القديمة
باعتبارها واجهة قديمة، من الممكن إنشاء مثيلات جديدة لفئة crypto.Certificate
كما هو موضح في الأمثلة أدناه.
new crypto.Certificate()
يمكن إنشاء مثيلات لفئة Certificate
باستخدام الكلمة المفتاحية new
أو عن طريق استدعاء crypto.Certificate()
كدالة:
const { Certificate } = await import('node:crypto');
const cert1 = new Certificate();
const cert2 = Certificate();
const { Certificate } = require('node:crypto');
const cert1 = new Certificate();
const cert2 = Certificate();
certificate.exportChallenge(spkac[, encoding])
أضيف في: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> الترميز لسلسلةspkac
.- Returns: <Buffer> مكون التحدي في هيكل بيانات
spkac
، والذي يتضمن مفتاحًا عامًا وتحديًا.
const { Certificate } = await import('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const challenge = cert.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// طباعة: التحدي كسلسلة UTF8
const { Certificate } = require('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const challenge = cert.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// طباعة: التحدي كسلسلة UTF8
certificate.exportPublicKey(spkac[, encoding])
أُضيف في: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> ترميز سلسلةspkac
.- الإرجاع: <Buffer> مكون المفتاح العام في هيكل بيانات
spkac
، والذي يتضمن مفتاحًا عامًا وتحديًا.
const { Certificate } = await import('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const publicKey = cert.exportPublicKey(spkac);
console.log(publicKey);
// يطبع: المفتاح العام كـ <Buffer ...>
const { Certificate } = require('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const publicKey = cert.exportPublicKey(spkac);
console.log(publicKey);
// يطبع: المفتاح العام كـ <Buffer ...>
certificate.verifySpkac(spkac[, encoding])
أُضيف في: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> ترميز سلسلةspkac
.- الإرجاع: <boolean>
true
إذا كان هيكل بياناتspkac
المعطى صالحًا، وإلاfalse
.
import { Buffer } from 'node:buffer';
const { Certificate } = await import('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
console.log(cert.verifySpkac(Buffer.from(spkac)));
// يطبع: true أو false
const { Buffer } = require('node:buffer');
const { Certificate } = require('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
console.log(cert.verifySpkac(Buffer.from(spkac)));
// يطبع: true أو false
الفئة: Cipher
تمت إضافتها في: v0.1.94
- تمتد: <stream.Transform>
تُستخدم مثيلات الفئة Cipher
لتشفير البيانات. يمكن استخدام الفئة بإحدى طريقتين:
- كـ دفق قابل للقراءة والكتابة، حيث تتم كتابة بيانات واضحة غير مشفرة لإنتاج بيانات مشفرة على الجانب القابل للقراءة، أو
- باستخدام الطرق
cipher.update()
وcipher.final()
لإنتاج البيانات المشفرة.
يتم استخدام الطريقة crypto.createCipheriv()
لإنشاء مثيلات Cipher
. يجب عدم إنشاء كائنات Cipher
مباشرةً باستخدام الكلمة الأساسية new
.
مثال: استخدام كائنات Cipher
كتدفقات:
const {
scrypt,
randomFill,
createCipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
// Once we have the key and iv, we can create and use the cipher...
const cipher = createCipheriv(algorithm, key, iv);
let encrypted = '';
cipher.setEncoding('hex');
cipher.on('data', (chunk) => encrypted += chunk);
cipher.on('end', () => console.log(encrypted));
cipher.write('some clear text data');
cipher.end();
});
});
const {
scrypt,
randomFill,
createCipheriv,
} = require('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
// Once we have the key and iv, we can create and use the cipher...
const cipher = createCipheriv(algorithm, key, iv);
let encrypted = '';
cipher.setEncoding('hex');
cipher.on('data', (chunk) => encrypted += chunk);
cipher.on('end', () => console.log(encrypted));
cipher.write('some clear text data');
cipher.end();
});
});
مثال: استخدام Cipher
وتدفقات الأنابيب:
import {
createReadStream,
createWriteStream,
} from 'node:fs';
import {
pipeline,
} from 'node:stream';
const {
scrypt,
randomFill,
createCipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = createCipheriv(algorithm, key, iv);
const input = createReadStream('test.js');
const output = createWriteStream('test.enc');
pipeline(input, cipher, output, (err) => {
if (err) throw err;
});
});
});
const {
createReadStream,
createWriteStream,
} = require('node:fs');
const {
pipeline,
} = require('node:stream');
const {
scrypt,
randomFill,
createCipheriv,
} = require('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = createCipheriv(algorithm, key, iv);
const input = createReadStream('test.js');
const output = createWriteStream('test.enc');
pipeline(input, cipher, output, (err) => {
if (err) throw err;
});
});
});
مثال: استخدام الطرق cipher.update()
و cipher.final()
:
const {
scrypt,
randomFill,
createCipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = createCipheriv(algorithm, key, iv);
let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
encrypted += cipher.final('hex');
console.log(encrypted);
});
});
const {
scrypt,
randomFill,
createCipheriv,
} = require('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = createCipheriv(algorithm, key, iv);
let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
encrypted += cipher.final('hex');
console.log(encrypted);
});
});
cipher.final([outputEncoding])
تمت الإضافة في: الإصدار v0.1.94
outputEncoding
<سلسلة> ترميز القيمة المرجعة.- الإرجاع: <Buffer> | <سلسلة> أي محتويات مشفرة متبقية. إذا تم تحديد
outputEncoding
، فسيتم إرجاع سلسلة. إذا لم يتم توفيرoutputEncoding
، فسيتم إرجاعBuffer
.
بمجرد استدعاء الطريقة cipher.final()
، لا يمكن استخدام كائن Cipher
لتشفير البيانات. ستؤدي محاولات استدعاء cipher.final()
أكثر من مرة إلى حدوث خطأ.
cipher.getAuthTag()
تمت الإضافة في: الإصدار v1.0.0
- الإرجاع: <Buffer> عند استخدام وضع التشفير المصادق عليه (يتم دعم
GCM
وCCM
وOCB
وchacha20-poly1305
حاليًا)، تُرجع الطريقةcipher.getAuthTag()
Buffer
تحتوي على علامة المصادقة التي تم حسابها من البيانات المعطاة.
يجب استدعاء الطريقة cipher.getAuthTag()
فقط بعد اكتمال التشفير باستخدام الطريقة cipher.final()
.
إذا تم تعيين الخيار authTagLength
أثناء إنشاء مثيل cipher
، فسترجع هذه الدالة بالضبط authTagLength
بايت.
cipher.setAAD(buffer[, options])
تمت الإضافة في: الإصدار v1.0.0
buffer
<سلسلة> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>options
<كائن>stream.transform
خياراتالإرجاع: <Cipher> نفس مثيل
Cipher
لتسلسل الطريقة.
عند استخدام وضع التشفير المصادق عليه (يتم دعم GCM
و CCM
و OCB
و chacha20-poly1305
حاليًا)، تحدد الطريقة cipher.setAAD()
القيمة المستخدمة لمعامل إدخال البيانات المصادق عليها الإضافية (AAD).
الخيار plaintextLength
اختياري لـ GCM
و OCB
. عند استخدام CCM
، يجب تحديد الخيار plaintextLength
ويجب أن تتطابق قيمته مع طول النص العادي بالبايت. انظر وضع CCM.
يجب استدعاء الطريقة cipher.setAAD()
قبل cipher.update()
.
cipher.setAutoPadding([autoPadding])
أضيف في: الإصدار 0.7.1
عند استخدام خوارزميات تشفير الكتل، ستضيف فئة Cipher
تلقائيًا حشوًا إلى بيانات الإدخال لتتناسب مع حجم الكتلة المناسب. لتعطيل الحشو الافتراضي، استدعِ cipher.setAutoPadding(false)
.
عندما تكون قيمة autoPadding
هي false
، يجب أن يكون طول بيانات الإدخال بأكملها من مضاعفات حجم كتلة التشفير أو سيرمي cipher.final()
خطأً. تعطيل الحشو التلقائي مفيد للحشو غير القياسي، على سبيل المثال استخدام 0x0
بدلاً من حشو PKCS.
يجب استدعاء طريقة cipher.setAutoPadding()
قبل cipher.final()
.
cipher.update(data[, inputEncoding][, outputEncoding])
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 6.0.0 | تم تغيير inputEncoding الافتراضي من binary إلى utf8 . |
الإصدار 0.1.94 | أضيف في: الإصدار 0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> تشفير البيانات.outputEncoding
<string> تشفير قيمة الإرجاع.- الإرجاع: <Buffer> | <string>
يقوم بتحديث الشيفرة باستخدام data
. إذا تم توفير وسيطة inputEncoding
، فإن وسيطة data
هي سلسلة تستخدم التشفير المحدد. إذا لم يتم توفير وسيطة inputEncoding
، فيجب أن تكون data
إما Buffer
أو TypedArray
أو DataView
. إذا كانت data
هي Buffer
أو TypedArray
أو DataView
، فسيتم تجاهل inputEncoding
.
تحدد outputEncoding
تنسيق الإخراج للبيانات المشفرة. إذا تم تحديد outputEncoding
، فسيتم إرجاع سلسلة تستخدم التشفير المحدد. إذا لم يتم توفير outputEncoding
، فسيتم إرجاع Buffer
.
يمكن استدعاء طريقة cipher.update()
عدة مرات ببيانات جديدة حتى يتم استدعاء cipher.final()
. سيؤدي استدعاء cipher.update()
بعد cipher.final()
إلى حدوث خطأ.
الفئة: Decipher
أضيف في: v0.1.94
- يمتد: <stream.Transform>
تُستخدم مثيلات الفئة Decipher
لفك تشفير البيانات. يمكن استخدام الفئة بإحدى طريقتين:
- كـ تدفق قابل للقراءة والكتابة، حيث تتم كتابة البيانات المشفرة العادية لإنتاج بيانات غير مشفرة على الجانب القابل للقراءة، أو
- باستخدام الأسلوبين
decipher.update()
وdecipher.final()
لإنتاج البيانات غير المشفرة.
يتم استخدام الأسلوب crypto.createDecipheriv()
لإنشاء مثيلات Decipher
. لا يجوز إنشاء كائنات Decipher
مباشرةً باستخدام الكلمة الأساسية new
.
مثال: استخدام كائنات Decipher
كتدفقات:
import { Buffer } from 'node:buffer';
const {
scryptSync,
createDecipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Key length is dependent on the algorithm. In this case for aes192, it is
// 24 bytes (192 bits).
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
let decrypted = '';
decipher.on('readable', () => {
let chunk;
while (null !== (chunk = decipher.read())) {
decrypted += chunk.toString('utf8');
}
});
decipher.on('end', () => {
console.log(decrypted);
// Prints: some clear text data
});
// Encrypted with same algorithm, key and iv.
const encrypted =
'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
decipher.write(encrypted, 'hex');
decipher.end();
const {
scryptSync,
createDecipheriv,
} = require('node:crypto');
const { Buffer } = require('node:buffer');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Key length is dependent on the algorithm. In this case for aes192, it is
// 24 bytes (192 bits).
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
let decrypted = '';
decipher.on('readable', () => {
let chunk;
while (null !== (chunk = decipher.read())) {
decrypted += chunk.toString('utf8');
}
});
decipher.on('end', () => {
console.log(decrypted);
// Prints: some clear text data
});
// Encrypted with same algorithm, key and iv.
const encrypted =
'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
decipher.write(encrypted, 'hex');
decipher.end();
مثال: استخدام Decipher
وتدفقات الأنابيب:
import {
createReadStream,
createWriteStream,
} from 'node:fs';
import { Buffer } from 'node:buffer';
const {
scryptSync,
createDecipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
const input = createReadStream('test.enc');
const output = createWriteStream('test.js');
input.pipe(decipher).pipe(output);
const {
createReadStream,
createWriteStream,
} = require('node:fs');
const {
scryptSync,
createDecipheriv,
} = require('node:crypto');
const { Buffer } = require('node:buffer');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
const input = createReadStream('test.enc');
const output = createWriteStream('test.js');
input.pipe(decipher).pipe(output);
مثال: استخدام الأسلوبين decipher.update()
و decipher.final()
:
import { Buffer } from 'node:buffer';
const {
scryptSync,
createDecipheriv,
} = await import('node:crypto');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
// Encrypted using same algorithm, key and iv.
const encrypted =
'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);
// Prints: some clear text data
const {
scryptSync,
createDecipheriv,
} = require('node:crypto');
const { Buffer } = require('node:buffer');
const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = createDecipheriv(algorithm, key, iv);
// Encrypted using same algorithm, key and iv.
const encrypted =
'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);
// Prints: some clear text data
decipher.final([outputEncoding])
أُضيف في: v0.1.94
outputEncoding
<string> ترميز <encoding> للقيمة المعادة.- يُعيد: <Buffer> | <string> أي محتويات باقية تم فك تشفيرها. إذا تم تحديد
outputEncoding
، فسيتم إرجاع سلسلة نصية. إذا لم يتم توفيرoutputEncoding
، فسيتم إرجاعBuffer
.
بمجرد استدعاء الدالة decipher.final()
، لا يمكن استخدام الكائن Decipher
لفك تشفير البيانات. ستؤدي محاولات استدعاء decipher.final()
أكثر من مرة إلى حدوث خطأ.
decipher.setAAD(buffer[, options])
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن تكون وسيطة المخزن المؤقت سلسلة نصية أو ArrayBuffer ولا تتجاوز 2 ** 31 - 1 بايت. |
v7.2.0 | تُعيد هذه الدالة الآن مرجعًا إلى decipher . |
v1.0.0 | أُضيف في: v1.0.0 |
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>options
<Object> خياراتstream.transform
يُعيد: <Decipher> نفس Decipher لسلسلة الدوال.
عند استخدام وضع تشفير مصادق عليه (يتم دعم GCM
و CCM
و OCB
و chacha20-poly1305
حاليًا)، تحدد الدالة decipher.setAAD()
القيمة المستخدمة لمعامل الإدخال بيانات المصادقة الإضافية (AAD).
وسيطة options
اختيارية لـ GCM
. عند استخدام CCM
، يجب تحديد خيار plaintextLength
ويجب أن تتطابق قيمته مع طول النص المشفر بالبايت. انظر وضع CCM.
يجب استدعاء الدالة decipher.setAAD()
قبل decipher.update()
.
عند تمرير سلسلة نصية كوسيطة buffer
، يرجى مراعاة المحاذير عند استخدام السلاسل النصية كمدخلات لواجهات برمجة تطبيقات التشفير.
decipher.setAuthTag(buffer[, encoding])
[السجل]
الإصدار | التغييرات |
---|---|
v22.0.0, v20.13.0 | استخدام أطوال علامات GCM بخلاف 128 بت بدون تحديد خيار authTagLength عند إنشاء decipher أصبح مهجورًا. |
v15.0.0 | يمكن أن يكون وسيطة buffer عبارة عن سلسلة أو ArrayBuffer وتقتصر على عدم تجاوز 2 ** 31 - 1 بايت. |
v11.0.0 | يطرح هذا الأسلوب الآن إذا كان طول علامة GCM غير صالح. |
v7.2.0 | يُرجع هذا الأسلوب الآن مرجعًا إلى decipher . |
v1.0.0 | تمت إضافته في: v1.0.0 |
buffer
<string> | <Buffer> | <ArrayBuffer> | <TypedArray> | <DataView>encoding
<string> ترميز السلسلة المراد استخدامه عندما تكونbuffer
سلسلة.- الإرجاع: <Decipher> نفس Decipher لتسلسل الأساليب.
عند استخدام وضع تشفير مصادق عليه (يتم دعم GCM
و CCM
و OCB
و chacha20-poly1305
حاليًا)، يتم استخدام الأسلوب decipher.setAuthTag()
لتمرير علامة المصادقة المستلمة. إذا لم يتم توفير أي علامة، أو إذا تم العبث بالنص المشفر، فسيتم طرح decipher.final()
، مما يشير إلى أنه يجب التخلص من النص المشفر بسبب فشل المصادقة. إذا كان طول العلامة غير صالح وفقًا لـ NIST SP 800-38D أو لا يتطابق مع قيمة خيار authTagLength
، فسيتم طرح decipher.setAuthTag()
خطأ.
يجب استدعاء الأسلوب decipher.setAuthTag()
قبل decipher.update()
لوضع CCM
أو قبل decipher.final()
لأوضاع GCM
و OCB
و chacha20-poly1305
. يمكن استدعاء decipher.setAuthTag()
مرة واحدة فقط.
عند تمرير سلسلة كعلامة مصادقة، يرجى مراعاة المحاذير عند استخدام السلاسل كمدخلات إلى واجهات برمجة التطبيقات المشفرة.
decipher.setAutoPadding([autoPadding])
إضافة في: v0.7.1
autoPadding
<boolean> افتراضي:true
- الإرجاع: <Decipher> نفس Decipher لتسلسل العمليات.
عندما يتم تشفير البيانات بدون حشو الكتلة القياسي، فإن استدعاء decipher.setAutoPadding(false)
سيعطل الحشو التلقائي لمنع decipher.final()
من التحقق من الحشو وإزالته.
تعطيل الحشو التلقائي سيعمل فقط إذا كان طول بيانات الإدخال مضاعفًا لحجم كتلة التشفير.
يجب استدعاء الطريقة decipher.setAutoPadding()
قبل decipher.final()
.
decipher.update(data[, inputEncoding][, outputEncoding])
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v6.0.0 | تم تغيير inputEncoding الافتراضي من binary إلى utf8 . |
v0.1.94 | إضافة في: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> ترميز سلسلةdata
.outputEncoding
<string> ترميز القيمة المرجعة.- الإرجاع: <Buffer> | <string>
يقوم بتحديث فك التشفير باستخدام data
. إذا تم إعطاء وسيطة inputEncoding
، فإن وسيطة data
هي سلسلة تستخدم الترميز المحدد. إذا لم يتم إعطاء وسيطة inputEncoding
، فيجب أن تكون data
هي Buffer
. إذا كانت data
هي Buffer
فسيتم تجاهل inputEncoding
.
يحدد outputEncoding
تنسيق الإخراج للبيانات المشفرة. إذا تم تحديد outputEncoding
، فسيتم إرجاع سلسلة تستخدم الترميز المحدد. إذا لم يتم توفير outputEncoding
، فسيتم إرجاع Buffer
.
يمكن استدعاء الطريقة decipher.update()
عدة مرات مع بيانات جديدة حتى يتم استدعاء decipher.final()
. سيؤدي استدعاء decipher.update()
بعد decipher.final()
إلى ظهور خطأ.
حتى إذا كان التشفير الأساسي ينفذ المصادقة، فقد تكون أصالة وسلامة النص الواضح الذي يتم إرجاعه من هذه الوظيفة غير مؤكدة في هذا الوقت. بالنسبة لخوارزميات التشفير المصادق عليها، يتم عادةً إثبات الأصالة فقط عندما يستدعي التطبيق decipher.final()
.
الفئة: DiffieHellman
أُضيفت في: الإصدار v0.5.0
الفئة DiffieHellman
هي أداة لإنشاء تبادلات مفاتيح ديفي-هيلمان.
يمكن إنشاء مثيلات للفئة DiffieHellman
باستخدام الدالة crypto.createDiffieHellman()
.
import assert from 'node:assert';
const {
createDiffieHellman,
} = await import('node:crypto');
// Generate Alice's keys...
const alice = createDiffieHellman(2048);
const aliceKey = alice.generateKeys();
// Generate Bob's keys...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator());
const bobKey = bob.generateKeys();
// Exchange and generate the secret...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);
// OK
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));
const assert = require('node:assert');
const {
createDiffieHellman,
} = require('node:crypto');
// Generate Alice's keys...
const alice = createDiffieHellman(2048);
const aliceKey = alice.generateKeys();
// Generate Bob's keys...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator());
const bobKey = bob.generateKeys();
// Exchange and generate the secret...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);
// OK
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));
diffieHellman.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])
أُضيفت في: الإصدار v0.5.0
otherPublicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> الترميز لسلسلةotherPublicKey
.outputEncoding
<string> الترميز للقيمة المعادة.- تُعيد: <Buffer> | <string>
تحسب السر المشترك باستخدام otherPublicKey
كمفتاح عام للطرف الآخر وتُعيد السر المشترك المحسوب. يتم تفسير المفتاح المُزوّد باستخدام inputEncoding
المحدد، ويتم ترميز السر باستخدام outputEncoding
المحدد. إذا لم يتم توفير inputEncoding
، فمن المتوقع أن يكون otherPublicKey
عبارة عن Buffer
أو TypedArray
أو DataView
.
إذا تم إعطاء outputEncoding
سلسلة، فسيتم إرجاع سلسلة؛ وإلا، فسيتم إرجاع Buffer
.
diffieHellman.generateKeys([encoding])
تمت الإضافة في: الإصدار v0.5.0
يقوم بإنشاء قيم مفاتيح Diffie-Hellman الخاصة والعامة ما لم يتم إنشاؤها أو حسابها بالفعل، ويعيد المفتاح العام في encoding
المحدد. يجب نقل هذا المفتاح إلى الطرف الآخر. إذا تم توفير encoding
، يتم إرجاع سلسلة؛ وإلا يتم إرجاع Buffer
.
هذه الدالة عبارة عن غلاف بسيط حول DH_generate_key()
. على وجه الخصوص، بمجرد إنشاء أو تعيين مفتاح خاص، فإن استدعاء هذه الدالة يقوم فقط بتحديث المفتاح العام ولكن لا يقوم بإنشاء مفتاح خاص جديد.
diffieHellman.getGenerator([encoding])
تمت الإضافة في: الإصدار v0.5.0
إرجاع مولد Diffie-Hellman في encoding
المحدد. إذا تم توفير encoding
، يتم إرجاع سلسلة؛ وإلا يتم إرجاع Buffer
.
diffieHellman.getPrime([encoding])
تمت الإضافة في: الإصدار v0.5.0
إرجاع عدد Diffie-Hellman الأولي في encoding
المحدد. إذا تم توفير encoding
، يتم إرجاع سلسلة؛ وإلا يتم إرجاع Buffer
.
diffieHellman.getPrivateKey([encoding])
إضافة في: v0.5.0
يُرجع المفتاح الخاص بـ Diffie-Hellman بالتشفير encoding
المحدد. إذا تم توفير encoding
، فسيتم إرجاع سلسلة نصية؛ وإلا فسيتم إرجاع Buffer
.
diffieHellman.getPublicKey([encoding])
إضافة في: v0.5.0
يُرجع المفتاح العام بـ Diffie-Hellman بالتشفير encoding
المحدد. إذا تم توفير encoding
، فسيتم إرجاع سلسلة نصية؛ وإلا فسيتم إرجاع Buffer
.
diffieHellman.setPrivateKey(privateKey[, encoding])
إضافة في: v0.5.0
privateKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> The encoding لسلسلةprivateKey
.
يضبط المفتاح الخاص بـ Diffie-Hellman. إذا تم توفير وسيط encoding
، فمن المتوقع أن تكون privateKey
سلسلة نصية. إذا لم يتم توفير encoding
، فمن المتوقع أن تكون privateKey
Buffer
أو TypedArray
أو DataView
.
لا تحسب هذه الدالة تلقائيًا المفتاح العام المرتبط. يمكن استخدام إما diffieHellman.setPublicKey()
أو diffieHellman.generateKeys()
لتوفير المفتاح العام يدويًا أو لاشتقاقه تلقائيًا.
diffieHellman.setPublicKey(publicKey[, encoding])
تمت إضافته في: v0.5.0
publicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> ترميز سلسلةpublicKey
.
تعيين المفتاح العام لـ Diffie-Hellman. إذا تم توفير وسيطة encoding
، فمن المتوقع أن تكون publicKey
سلسلة. إذا لم يتم توفير encoding
، فمن المتوقع أن تكون publicKey
عبارة عن Buffer
أو TypedArray
أو DataView
.
diffieHellman.verifyError
تمت إضافته في: v0.11.12
حقل بت يحتوي على أي تحذيرات و/أو أخطاء ناتجة عن فحص تم إجراؤه أثناء تهيئة كائن DiffieHellman
.
القيم التالية صالحة لهذه الخاصية (كما هو محدد في وحدة node:constants
):
DH_CHECK_P_NOT_SAFE_PRIME
DH_CHECK_P_NOT_PRIME
DH_UNABLE_TO_CHECK_GENERATOR
DH_NOT_SUITABLE_GENERATOR
صنف: DiffieHellmanGroup
تمت إضافته في: v0.7.5
يأخذ صنف DiffieHellmanGroup
مجموعة modp معروفة كمعامل له. إنه يعمل بنفس طريقة DiffieHellman
، باستثناء أنه لا يسمح بتغيير مفاتيحه بعد الإنشاء. بمعنى آخر، فإنه لا ينفذ طرق setPublicKey()
أو setPrivateKey()
.
const { createDiffieHellmanGroup } = await import('node:crypto');
const dh = createDiffieHellmanGroup('modp16');
const { createDiffieHellmanGroup } = require('node:crypto');
const dh = createDiffieHellmanGroup('modp16');
المجموعات التالية مدعومة:
'modp14'
(2048 بت، RFC 3526 القسم 3)'modp15'
(3072 بت، RFC 3526 القسم 4)'modp16'
(4096 بت، RFC 3526 القسم 5)'modp17'
(6144 بت، RFC 3526 القسم 6)'modp18'
(8192 بت، RFC 3526 القسم 7)
المجموعات التالية لا تزال مدعومة ولكنها مهملة (انظر المحاذير):
'modp1'
(768 بت، RFC 2409 القسم 6.1)'modp2'
(1024 بت، RFC 2409 القسم 6.2)'modp5'
(1536 بت، RFC 3526 القسم 2)
قد تتم إزالة هذه المجموعات المهملة في الإصدارات المستقبلية من Node.js.
الفئة: ECDH
أُضيف في: الإصدار v0.11.14
الفئة ECDH
هي أداة لإنشاء عمليات تبادل مفاتيح Diffie-Hellman للمنحنى الإهليلجي (ECDH).
يمكن إنشاء مثيلات للفئة ECDH
باستخدام الدالة crypto.createECDH()
.
import assert from 'node:assert';
const {
createECDH,
} = await import('node:crypto');
// إنشاء مفاتيح أليس...
const alice = createECDH('secp521r1');
const aliceKey = alice.generateKeys();
// إنشاء مفاتيح بوب...
const bob = createECDH('secp521r1');
const bobKey = bob.generateKeys();
// تبادل وإنشاء السر...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));
// موافق
const assert = require('node:assert');
const {
createECDH,
} = require('node:crypto');
// إنشاء مفاتيح أليس...
const alice = createECDH('secp521r1');
const aliceKey = alice.generateKeys();
// إنشاء مفاتيح بوب...
const bob = createECDH('secp521r1');
const bobKey = bob.generateKeys();
// تبادل وإنشاء السر...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));
// موافق
طريقة ثابتة: ECDH.convertKey(key, curve[, inputEncoding[, outputEncoding[, format]]])
أُضيف في: الإصدار v10.0.0
key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>curve
<string>inputEncoding
<string> تشفير سلسلةkey
.outputEncoding
<string> تشفير القيمة المُرجَعة.format
<string> الافتراضي:'uncompressed'
- Returns: <Buffer> | <string>
يحوّل مفتاح EC Diffie-Hellman العام المحدد بواسطة key
و curve
إلى التنسيق المحدد بواسطة format
. تحدد الوسيطة format
ترميز النقطة ويمكن أن تكون 'compressed'
أو 'uncompressed'
أو 'hybrid'
. يتم تفسير المفتاح المقدم باستخدام inputEncoding
المحدد، ويتم ترميز المفتاح المُرجع باستخدام outputEncoding
المحدد.
استخدم crypto.getCurves()
للحصول على قائمة بأسماء المنحنيات المتاحة. في إصدارات OpenSSL الحديثة، سيعرض openssl ecparam -list_curves
أيضًا اسم ووصف كل منحنى إهليلجي متاح.
إذا لم يتم تحديد format
، فسيتم إرجاع النقطة بتنسيق 'uncompressed'
.
إذا لم يتم توفير inputEncoding
، فمن المتوقع أن يكون key
عبارة عن Buffer
أو TypedArray
أو DataView
.
مثال (فك ضغط مفتاح):
const {
createECDH,
ECDH,
} = await import('node:crypto');
const ecdh = createECDH('secp256k1');
ecdh.generateKeys();
const compressedKey = ecdh.getPublicKey('hex', 'compressed');
const uncompressedKey = ECDH.convertKey(compressedKey,
'secp256k1',
'hex',
'hex',
'uncompressed');
// يجب أن يكون المفتاح المحول والمفتاح العام غير المضغوط متماثلين
console.log(uncompressedKey === ecdh.getPublicKey('hex'));
const {
createECDH,
ECDH,
} = require('node:crypto');
const ecdh = createECDH('secp256k1');
ecdh.generateKeys();
const compressedKey = ecdh.getPublicKey('hex', 'compressed');
const uncompressedKey = ECDH.convertKey(compressedKey,
'secp256k1',
'hex',
'hex',
'uncompressed');
// يجب أن يكون المفتاح المحول والمفتاح العام غير المضغوط متماثلين
console.log(uncompressedKey === ecdh.getPublicKey('hex'));
ecdh.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])
[السجل]
الإصدار | التغييرات |
---|---|
v10.0.0 | تم تغيير تنسيق الخطأ لدعم خطأ المفتاح العام غير الصالح بشكل أفضل. |
v6.0.0 | تم تغيير inputEncoding الافتراضي من binary إلى utf8 . |
v0.11.14 | تمت إضافته في: v0.11.14 |
otherPublicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> ترميز لسلسلةotherPublicKey
.outputEncoding
<string> ترميز للقيمة المرجعة.- الإرجاع: <Buffer> | <string>
لحساب السر المشترك باستخدام otherPublicKey
كمفتاح عام للطرف الآخر وإرجاع السر المشترك المحسوب. يتم تفسير المفتاح المقدم باستخدام inputEncoding
المحدد، ويتم ترميز السر المرتجع باستخدام outputEncoding
المحدد. إذا لم يتم توفير inputEncoding
، فمن المتوقع أن يكون otherPublicKey
عبارة عن Buffer
أو TypedArray
أو DataView
.
إذا تم إعطاء outputEncoding
سلسلة، فسيتم إرجاعها؛ وإلا سيتم إرجاع Buffer
.
سيؤدي ecdh.computeSecret
إلى ظهور خطأ ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY
عندما يقع otherPublicKey
خارج المنحنى الإهليلجي. نظرًا لأن otherPublicKey
يتم توفيره عادةً من مستخدم بعيد عبر شبكة غير آمنة، فتأكد من التعامل مع هذا الاستثناء وفقًا لذلك.
ecdh.generateKeys([encoding[, format]])
تمت الإضافة في: v0.11.14
encoding
<string> ترميز قيمة الإرجاع.format
<string> افتراضي:'uncompressed'
- الإرجاع: <Buffer> | <string>
يقوم بإنشاء قيم مفاتيح تبادل مفتاح ديفي-هيلمان (EC Diffie-Hellman) الخاصة والعامة، ويعيد المفتاح العام بالتنسيق format
والترميز encoding
المحددين. يجب نقل هذا المفتاح إلى الطرف الآخر.
تحدد وسيطة format
ترميز النقطة ويمكن أن تكون 'compressed'
أو 'uncompressed'
. إذا لم يتم تحديد format
، فستتم إعادة النقطة بتنسيق 'uncompressed'
.
إذا تم توفير encoding
، فسيتم إرجاع سلسلة؛ وإلا سيتم إرجاع Buffer
.
ecdh.getPrivateKey([encoding])
تمت الإضافة في: v0.11.14
encoding
<string> ترميز قيمة الإرجاع.- الإرجاع: <Buffer> | <string> تبادل مفتاح ديفي-هيلمان (EC Diffie-Hellman) بالترميز
encoding
المحدد.
إذا تم تحديد encoding
، فسيتم إرجاع سلسلة؛ وإلا سيتم إرجاع Buffer
.
ecdh.getPublicKey([encoding][, format])
تمت الإضافة في: v0.11.14
encoding
<string> ترميز قيمة الإرجاع.format
<string> افتراضي:'uncompressed'
- الإرجاع: <Buffer> | <string> المفتاح العام لتبادل مفتاح ديفي-هيلمان (EC Diffie-Hellman) بالترميز
encoding
والتنسيقformat
المحددين.
تحدد وسيطة format
ترميز النقطة ويمكن أن تكون 'compressed'
أو 'uncompressed'
. إذا لم يتم تحديد format
، فستتم إعادة النقطة بتنسيق 'uncompressed'
.
إذا تم تحديد encoding
، فسيتم إرجاع سلسلة؛ وإلا سيتم إرجاع Buffer
.
ecdh.setPrivateKey(privateKey[, encoding])
أُضيف في: v0.11.14
privateKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> ترميز سلسلةprivateKey
.
يُعيِّن مفتاح EC Diffie-Hellman الخاص. إذا تم توفير encoding
، فمن المتوقع أن تكون privateKey
سلسلة؛ وإلا، فمن المتوقع أن تكون privateKey
عبارة عن Buffer
أو TypedArray
أو DataView
.
إذا لم يكن privateKey
صالحًا للمنحنى المحدد عند إنشاء كائن ECDH
، فسيتم طرح خطأ. عند تعيين المفتاح الخاص، يتم أيضًا إنشاء النقطة (المفتاح) العامة المرتبطة وتعيينها في كائن ECDH
.
ecdh.setPublicKey(publicKey[, encoding])
أُضيف في: v0.11.14
تم إهماله منذ: v5.2.0
[مستقر: 0 - مُهمل]
مستقر: 0 الاستقرار: 0 - مُهمل
publicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> ترميز سلسلةpublicKey
.
يُعيِّن المفتاح العام لـ EC Diffie-Hellman. إذا تم توفير encoding
، فمن المتوقع أن تكون publicKey
سلسلة؛ وإلا، فمن المتوقع أن تكون Buffer
أو TypedArray
أو DataView
.
ليس هناك عادةً سبب لاستدعاء هذه الطريقة لأن ECDH
يتطلب فقط مفتاحًا خاصًا والمفتاح العام للطرف الآخر لحساب السر المشترك. عادةً ما يتم استدعاء ecdh.generateKeys()
أو ecdh.setPrivateKey()
. تحاول الطريقة ecdh.setPrivateKey()
إنشاء النقطة/المفتاح العام المرتبط بالمفتاح الخاص الذي يتم تعيينه.
مثال (الحصول على سر مشترك):
const {
createECDH,
createHash,
} = await import('node:crypto');
const alice = createECDH('secp256k1');
const bob = createECDH('secp256k1');
// هذه طريقة مختصرة لتحديد أحد المفاتيح الخاصة السابقة لأليس.
// سيكون من غير الحكمة استخدام مثل هذا المفتاح الخاص الذي يمكن التنبؤ به في تطبيق حقيقي.
alice.setPrivateKey(
createHash('sha256').update('alice', 'utf8').digest(),
);
// يستخدم بوب زوج مفاتيح تم إنشاؤه حديثًا وقويًا من الناحية التشفيرية
// شبه عشوائي
bob.generateKeys();
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');
// يجب أن تكون aliceSecret و bobSecret هي نفس قيمة السر المشترك
console.log(aliceSecret === bobSecret);
const {
createECDH,
createHash,
} = require('node:crypto');
const alice = createECDH('secp256k1');
const bob = createECDH('secp256k1');
// هذه طريقة مختصرة لتحديد أحد المفاتيح الخاصة السابقة لأليس.
// سيكون من غير الحكمة استخدام مثل هذا المفتاح الخاص الذي يمكن التنبؤ به في تطبيق حقيقي.
alice.setPrivateKey(
createHash('sha256').update('alice', 'utf8').digest(),
);
// يستخدم بوب زوج مفاتيح تم إنشاؤه حديثًا وقويًا من الناحية التشفيرية
// شبه عشوائي
bob.generateKeys();
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');
// يجب أن تكون aliceSecret و bobSecret هي نفس قيمة السر المشترك
console.log(aliceSecret === bobSecret);
الفئة: Hash
تمت إضافتها في: الإصدار v0.1.92
- توسع: <stream.Transform>
الفئة Hash
هي أداة لإنشاء ملخصات تجزئة للبيانات. يمكن استخدامها بإحدى طريقتين:
- كـ تدفق قابل للقراءة والكتابة، حيث تتم كتابة البيانات لإنتاج ملخص تجزئة محسوب على الجانب القابل للقراءة، أو
- باستخدام الأسلوبين
hash.update()
وhash.digest()
لإنتاج التجزئة المحسوبة.
يتم استخدام الأسلوب crypto.createHash()
لإنشاء مثيلات Hash
. لا يجوز إنشاء كائنات Hash
مباشرة باستخدام الكلمة المفتاحية new
.
مثال: استخدام كائنات Hash
كتدفقات:
const {
createHash,
} = await import('node:crypto');
const hash = createHash('sha256');
hash.on('readable', () => {
// سيتم إنتاج عنصر واحد فقط بواسطة
// تدفق التجزئة.
const data = hash.read();
if (data) {
console.log(data.toString('hex'));
// يطبع:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
}
});
hash.write('some data to hash');
hash.end();
const {
createHash,
} = require('node:crypto');
const hash = createHash('sha256');
hash.on('readable', () => {
// سيتم إنتاج عنصر واحد فقط بواسطة
// تدفق التجزئة.
const data = hash.read();
if (data) {
console.log(data.toString('hex'));
// يطبع:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
}
});
hash.write('some data to hash');
hash.end();
مثال: استخدام Hash
وتدفقات الأنابيب:
import { createReadStream } from 'node:fs';
import { stdout } from 'node:process';
const { createHash } = await import('node:crypto');
const hash = createHash('sha256');
const input = createReadStream('test.js');
input.pipe(hash).setEncoding('hex').pipe(stdout);
const { createReadStream } = require('node:fs');
const { createHash } = require('node:crypto');
const { stdout } = require('node:process');
const hash = createHash('sha256');
const input = createReadStream('test.js');
input.pipe(hash).setEncoding('hex').pipe(stdout);
مثال: استخدام الأسلوبين hash.update()
و hash.digest()
:
const {
createHash,
} = await import('node:crypto');
const hash = createHash('sha256');
hash.update('some data to hash');
console.log(hash.digest('hex'));
// يطبع:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
const {
createHash,
} = require('node:crypto');
const hash = createHash('sha256');
hash.update('some data to hash');
console.log(hash.digest('hex'));
// يطبع:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
hash.copy([options])
أُضيف في: v13.1.0
options
<Object>stream.transform
خيارات- الإرجاع: <Hash>
ينشئ كائن Hash
جديد يحتوي على نسخة طبق الأصل وعميقة للحالة الداخلية لكائن Hash
الحالي.
تتحكم وسيطة options
الاختيارية في سلوك التدفق. بالنسبة لوظائف تجزئة XOF مثل 'shake256'
، يمكن استخدام خيار outputLength
لتحديد طول الإخراج المطلوب بالبايت.
يتم طرح خطأ عند محاولة نسخ كائن Hash
بعد استدعاء التابع hash.digest()
الخاص به.
// حساب تجزئة متجددة.
const {
createHash,
} = await import('node:crypto');
const hash = createHash('sha256');
hash.update('one');
console.log(hash.copy().digest('hex'));
hash.update('two');
console.log(hash.copy().digest('hex'));
hash.update('three');
console.log(hash.copy().digest('hex'));
// إلخ.
// حساب تجزئة متجددة.
const {
createHash,
} = require('node:crypto');
const hash = createHash('sha256');
hash.update('one');
console.log(hash.copy().digest('hex'));
hash.update('two');
console.log(hash.copy().digest('hex'));
hash.update('three');
console.log(hash.copy().digest('hex'));
// إلخ.
hash.digest([encoding])
أُضيف في: v0.1.92
يحسب ملخص جميع البيانات التي تم تمريرها ليتم تجزئتها (باستخدام التابع hash.update()
). إذا تم توفير encoding
، فسيتم إرجاع سلسلة؛ وإلا فسيتم إرجاع Buffer
.
لا يمكن استخدام كائن Hash
مرة أخرى بعد استدعاء التابع hash.digest()
. ستؤدي الاستدعاءات المتعددة إلى حدوث خطأ.
hash.update(data[, inputEncoding])
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار v6.0.0 | تم تغيير inputEncoding الافتراضي من binary إلى utf8 . |
الإصدار v0.1.92 | تمت إضافته في: v0.1.92 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> ترميز سلسلةdata
.
يقوم بتحديث محتوى الهاش بالبيانات المعطاة data
، والتي يتم تحديد ترميزها في inputEncoding
. إذا لم يتم توفير encoding
وكانت data
سلسلة، فسيتم فرض ترميز 'utf8'
. إذا كانت data
عبارة عن Buffer
أو TypedArray
أو DataView
، فسيتم تجاهل inputEncoding
.
يمكن استدعاء هذا عدة مرات ببيانات جديدة أثناء دفقها.
الفئة: Hmac
تمت الإضافة في: v0.1.94
- يمتد: <stream.Transform>
الفئة Hmac
هي أداة لإنشاء ملخصات HMAC مشفرة. يمكن استخدامه بإحدى طريقتين:
- كـ دفق قابل للقراءة والكتابة على حد سواء، حيث تتم كتابة البيانات لإنتاج ملخص HMAC محسوب على الجانب القابل للقراءة، أو
- باستخدام الأسلوبين
hmac.update()
وhmac.digest()
لإنتاج ملخص HMAC المحسوب.
يتم استخدام الأسلوب crypto.createHmac()
لإنشاء مثيلات Hmac
. لا يجوز إنشاء كائنات Hmac
مباشرةً باستخدام الكلمة الأساسية new
.
مثال: استخدام كائنات Hmac
كدفق:
const {
createHmac,
} = await import('node:crypto');
const hmac = createHmac('sha256', 'a secret');
hmac.on('readable', () => {
// Only one element is going to be produced by the
// hash stream.
const data = hmac.read();
if (data) {
console.log(data.toString('hex'));
// Prints:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
}
});
hmac.write('some data to hash');
hmac.end();
const {
createHmac,
} = require('node:crypto');
const hmac = createHmac('sha256', 'a secret');
hmac.on('readable', () => {
// Only one element is going to be produced by the
// hash stream.
const data = hmac.read();
if (data) {
console.log(data.toString('hex'));
// Prints:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
}
});
hmac.write('some data to hash');
hmac.end();
مثال: استخدام Hmac
ودفقات الأنابيب:
import { createReadStream } from 'node:fs';
import { stdout } from 'node:process';
const {
createHmac,
} = await import('node:crypto');
const hmac = createHmac('sha256', 'a secret');
const input = createReadStream('test.js');
input.pipe(hmac).pipe(stdout);
const {
createReadStream,
} = require('node:fs');
const {
createHmac,
} = require('node:crypto');
const { stdout } = require('node:process');
const hmac = createHmac('sha256', 'a secret');
const input = createReadStream('test.js');
input.pipe(hmac).pipe(stdout);
مثال: استخدام الأسلوبين hmac.update()
و hmac.digest()
:
const {
createHmac,
} = await import('node:crypto');
const hmac = createHmac('sha256', 'a secret');
hmac.update('some data to hash');
console.log(hmac.digest('hex'));
// Prints:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
const {
createHmac,
} = require('node:crypto');
const hmac = createHmac('sha256', 'a secret');
hmac.update('some data to hash');
console.log(hmac.digest('hex'));
// Prints:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
hmac.digest([encoding])
أُضيف في: الإصدار v0.1.94
لحساب ملخص HMAC لجميع البيانات التي تم تمريرها باستخدام hmac.update()
. إذا تم توفير encoding
، فسيتم إرجاع سلسلة؛ وإلا فسيتم إرجاع Buffer
؛
لا يمكن استخدام كائن Hmac
مرة أخرى بعد استدعاء hmac.digest()
. ستؤدي المكالمات المتعددة لـ hmac.digest()
إلى ظهور خطأ.
hmac.update(data[, inputEncoding])
[السجل]
الإصدار | التغييرات |
---|---|
v6.0.0 | تم تغيير inputEncoding الافتراضي من binary إلى utf8 . |
v0.1.94 | أُضيف في: الإصدار v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> تشفير سلسلةdata
.
لتحديث محتوى Hmac
بالبيانات data
المُعطاة، والتي يتم تحديد تشفيرها في inputEncoding
. إذا لم يتم توفير encoding
، وكانت data
سلسلة، فسيتم فرض تشفير 'utf8'
. إذا كانت data
هي Buffer
أو TypedArray
أو DataView
، فسيتم تجاهل inputEncoding
.
يمكن استدعاء هذا عدة مرات ببيانات جديدة أثناء تدفقها.
الفئة: KeyObject
[السجل]
الإصدار | التغييرات |
---|---|
v14.5.0, v12.19.0 | يمكن الآن تمرير مثيلات هذه الفئة إلى سلاسل العامل باستخدام postMessage . |
v11.13.0 | يتم الآن تصدير هذه الفئة. |
v11.6.0 | أُضيف في: الإصدار v11.6.0 |
يستخدم Node.js فئة KeyObject
لتمثيل مفتاح متماثل أو غير متماثل، ويكشف كل نوع من المفاتيح عن وظائف مختلفة. يتم استخدام الطرق crypto.createSecretKey()
و crypto.createPublicKey()
و crypto.createPrivateKey()
لإنشاء مثيلات KeyObject
. لا يجوز إنشاء كائنات KeyObject
مباشرةً باستخدام الكلمة الأساسية new
.
يجب على معظم التطبيقات التفكير في استخدام واجهة برمجة التطبيقات KeyObject
الجديدة بدلاً من تمرير المفاتيح كسلاسل أو Buffer
s نظرًا لميزات الأمان المحسّنة.
يمكن تمرير مثيلات KeyObject
إلى سلاسل أخرى عبر postMessage()
. يحصل المستلم على KeyObject
مستنسخ، ولا يلزم إدراج KeyObject
في وسيطة transferList
.
طريقة ثابتة: KeyObject.from(key)
أُضيفت في: v15.0.0
key
<CryptoKey>- الإرجاع: <KeyObject>
مثال: تحويل نسخة CryptoKey
إلى KeyObject
:
const { KeyObject } = await import('node:crypto');
const { subtle } = globalThis.crypto;
const key = await subtle.generateKey({
name: 'HMAC',
hash: 'SHA-256',
length: 256,
}, true, ['sign', 'verify']);
const keyObject = KeyObject.from(key);
console.log(keyObject.symmetricKeySize);
// Prints: 32 (symmetric key size in bytes)
const { KeyObject } = require('node:crypto');
const { subtle } = globalThis.crypto;
(async function() {
const key = await subtle.generateKey({
name: 'HMAC',
hash: 'SHA-256',
length: 256,
}, true, ['sign', 'verify']);
const keyObject = KeyObject.from(key);
console.log(keyObject.symmetricKeySize);
// Prints: 32 (symmetric key size in bytes)
})();
keyObject.asymmetricKeyDetails
[السجل]
الإصدار | التغييرات |
---|---|
v16.9.0 | كشف معلمات تسلسل RSASSA-PSS-params لمفاتيح RSA-PSS. |
v15.7.0 | أُضيفت في: v15.7.0 |
- <Object>
modulusLength
: <number> حجم المفتاح بالبت (RSA, DSA).publicExponent
: <bigint> الأس العام (RSA).hashAlgorithm
: <string> اسم ملخص الرسالة (RSA-PSS).mgf1HashAlgorithm
: <string> اسم ملخص الرسالة المستخدم بواسطة MGF1 (RSA-PSS).saltLength
: <number> الحد الأدنى لطول الملح بالبايت (RSA-PSS).divisorLength
: <number> حجمq
بالبت (DSA).namedCurve
: <string> اسم المنحنى (EC).
هذه الخاصية موجودة فقط على المفاتيح غير المتماثلة. اعتمادًا على نوع المفتاح، يحتوي هذا الكائن على معلومات حول المفتاح. لا يمكن استخدام أي من المعلومات التي تم الحصول عليها من خلال هذه الخاصية لتحديد مفتاح بشكل فريد أو لتعريض أمان المفتاح للخطر.
بالنسبة لمفاتيح RSA-PSS، إذا كانت مادة المفتاح تحتوي على تسلسل RSASSA-PSS-params
، فسيتم تعيين خصائص hashAlgorithm
و mgf1HashAlgorithm
و saltLength
.
قد يتم كشف تفاصيل المفتاح الأخرى عبر واجهة برمجة التطبيقات هذه باستخدام سمات إضافية.
keyObject.asymmetricKeyType
[السجل]
الإصدار | التغييرات |
---|---|
v13.9.0, v12.17.0 | تمت إضافة دعم لـ 'dh' . |
v12.0.0 | تمت إضافة دعم لـ 'rsa-pss' . |
v12.0.0 | تُرجع هذه الخاصية الآن undefined لمثيل KeyObject من النوع غير المعروف بدلاً من الإجهاض. |
v12.0.0 | تمت إضافة دعم لـ 'x25519' و 'x448' . |
v12.0.0 | تمت إضافة دعم لـ 'ed25519' و 'ed448' . |
v11.6.0 | أضيفت في: v11.6.0 |
بالنسبة للمفاتيح غير المتماثلة، تمثل هذه الخاصية نوع المفتاح. أنواع المفاتيح المدعومة هي:
'rsa'
(OID 1.2.840.113549.1.1.1)'rsa-pss'
(OID 1.2.840.113549.1.1.10)'dsa'
(OID 1.2.840.10040.4.1)'ec'
(OID 1.2.840.10045.2.1)'x25519'
(OID 1.3.101.110)'x448'
(OID 1.3.101.111)'ed25519'
(OID 1.3.101.112)'ed448'
(OID 1.3.101.113)'dh'
(OID 1.2.840.113549.1.3.1)
هذه الخاصية هي undefined
لأنواع KeyObject
غير المعروفة والمفاتيح المتماثلة.
keyObject.equals(otherKeyObject)
أضيفت في: v17.7.0, v16.15.0
otherKeyObject
: <KeyObject> كائنKeyObject
للمقارنة معkeyObject
.- الإرجاع: <boolean>
يُرجع true
أو false
اعتمادًا على ما إذا كانت المفاتيح لها نفس النوع والقيمة والمعلمات تمامًا. هذه الطريقة ليست وقتًا ثابتًا.
keyObject.export([options])
[السجل]
الإصدار | التغييرات |
---|---|
v15.9.0 | تمت إضافة دعم لتنسيق 'jwk' . |
v11.6.0 | أضيفت في: v11.6.0 |
بالنسبة للمفاتيح المتماثلة، يمكن استخدام خيارات الترميز التالية:
format
: <string> يجب أن يكون'buffer'
(افتراضي) أو'jwk'
.
بالنسبة للمفاتيح العامة، يمكن استخدام خيارات الترميز التالية:
type
: <string> يجب أن يكون أحد'pkcs1'
(RSA فقط) أو'spki'
.format
: <string> يجب أن يكون'pem'
أو'der'
أو'jwk'
.
بالنسبة للمفاتيح الخاصة، يمكن استخدام خيارات الترميز التالية:
type
: <string> يجب أن يكون أحد'pkcs1'
(RSA فقط) أو'pkcs8'
أو'sec1'
(EC فقط).format
: <string> يجب أن يكون'pem'
أو'der'
أو'jwk'
.cipher
: <string> إذا تم تحديده، فسيتم تشفير المفتاح الخاص باستخدامcipher
وpassphrase
المحدد باستخدام تشفير قائم على كلمة مرور PKCS#5 v2.0.passphrase
: <string> | <Buffer> عبارة المرور المستخدمة للتشفير، راجعcipher
.
يعتمد نوع النتيجة على تنسيق الترميز المحدد، عندما يكون PEM تكون النتيجة سلسلة، وعندما يكون DER فسيكون مخزنًا مؤقتًا يحتوي على البيانات المشفرة بتنسيق DER، وعندما يكون JWK فسيكون كائنًا.
عندما تم تحديد تنسيق ترميز JWK، يتم تجاهل جميع خيارات الترميز الأخرى.
يمكن تشفير مفاتيح نوع PKCS#1 و SEC1 و PKCS#8 باستخدام مجموعة من خياري cipher
و format
. يمكن استخدام type
الخاص بـ PKCS#8 مع أي format
لتشفير أي خوارزمية مفتاح (RSA أو EC أو DH) عن طريق تحديد cipher
. لا يمكن تشفير PKCS#1 و SEC1 إلا عن طريق تحديد cipher
عند استخدام format
الخاص بـ PEM. لتحقيق أقصى قدر من التوافق، استخدم PKCS#8 للمفاتيح الخاصة المشفرة. نظرًا لأن PKCS#8 يحدد آلية التشفير الخاصة به، فإن تشفير مستوى PEM غير مدعوم عند تشفير مفتاح PKCS#8. راجع RFC 5208 لتشفير PKCS#8 و RFC 1421 لتشفير PKCS#1 و SEC1.
keyObject.symmetricKeySize
تمت الإضافة في: الإصدار v11.6.0
بالنسبة للمفاتيح السرية، يمثل هذا الخاصية حجم المفتاح بالبايت. هذه الخاصية undefined
للمفاتيح غير المتماثلة.
keyObject.toCryptoKey(algorithm, extractable, keyUsages)
تمت الإضافة في: الإصدار v23.0.0
algorithm
: <AlgorithmIdentifier> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>
extractable
: <boolean>
keyUsages
: <string[]> راجع استخدامات المفاتيح.الإرجاع: <CryptoKey>
يحول مثيل KeyObject
إلى CryptoKey
.
keyObject.type
تمت الإضافة في: الإصدار v11.6.0
اعتمادًا على نوع KeyObject
هذا، تكون هذه الخاصية إما 'secret'
للمفاتيح السرية (المتماثلة)، أو 'public'
للمفاتيح العامة (غير المتماثلة)، أو 'private'
للمفاتيح الخاصة (غير المتماثلة).
الفئة: Sign
تمت الإضافة في: الإصدار v0.1.92
- يمتد: <stream.Writable>
الفئة Sign
هي أداة لإنشاء التواقيع. يمكن استخدامه بإحدى طريقتين:
- كـ تدفق قابل للكتابة، حيث تتم كتابة البيانات المراد توقيعها ويتم استخدام الطريقة
sign.sign()
لإنشاء التوقيع وإرجاعه، أو - باستخدام الطريقتين
sign.update()
وsign.sign()
لإنتاج التوقيع.
يتم استخدام الطريقة crypto.createSign()
لإنشاء مثيلات Sign
. الوسيطة هي اسم سلسلة دالة التجزئة المراد استخدامها. لا يجوز إنشاء كائنات Sign
مباشرةً باستخدام الكلمة المفتاحية new
.
مثال: استخدام كائنات Sign
و Verify
كتدفقات:
const {
generateKeyPairSync,
createSign,
createVerify,
} = await import('node:crypto');
const { privateKey, publicKey } = generateKeyPairSync('ec', {
namedCurve: 'sect239k1',
});
const sign = createSign('SHA256');
sign.write('some data to sign');
sign.end();
const signature = sign.sign(privateKey, 'hex');
const verify = createVerify('SHA256');
verify.write('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature, 'hex'));
// Prints: true
const {
generateKeyPairSync,
createSign,
createVerify,
} = require('node:crypto');
const { privateKey, publicKey } = generateKeyPairSync('ec', {
namedCurve: 'sect239k1',
});
const sign = createSign('SHA256');
sign.write('some data to sign');
sign.end();
const signature = sign.sign(privateKey, 'hex');
const verify = createVerify('SHA256');
verify.write('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature, 'hex'));
// Prints: true
مثال: استخدام الطريقتين sign.update()
و verify.update()
:
const {
generateKeyPairSync,
createSign,
createVerify,
} = await import('node:crypto');
const { privateKey, publicKey } = generateKeyPairSync('rsa', {
modulusLength: 2048,
});
const sign = createSign('SHA256');
sign.update('some data to sign');
sign.end();
const signature = sign.sign(privateKey);
const verify = createVerify('SHA256');
verify.update('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature));
// Prints: true
const {
generateKeyPairSync,
createSign,
createVerify,
} = require('node:crypto');
const { privateKey, publicKey } = generateKeyPairSync('rsa', {
modulusLength: 2048,
});
const sign = createSign('SHA256');
sign.update('some data to sign');
sign.end();
const signature = sign.sign(privateKey);
const verify = createVerify('SHA256');
verify.update('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature));
// Prints: true
sign.sign(privateKey[, outputEncoding])
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن يكون privateKey أيضًا ArrayBuffer و CryptoKey. |
v13.2.0, v12.16.0 | تدعم هذه الوظيفة الآن توقيعات IEEE-P1363 DSA و ECDSA. |
v12.0.0 | تدعم هذه الوظيفة الآن مفاتيح RSA-PSS. |
v11.6.0 | تدعم هذه الوظيفة الآن كائنات المفاتيح. |
v8.0.0 | تمت إضافة دعم RSASSA-PSS وخيارات إضافية. |
v0.1.92 | تمت الإضافة في: v0.1.92 |
privateKey
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>
يحسب التوقيع على جميع البيانات التي تم تمريرها باستخدام إما sign.update()
أو sign.write()
.
إذا لم يكن privateKey
KeyObject
، فإن هذه الوظيفة تتصرف كما لو تم تمرير privateKey
إلى crypto.createPrivateKey()
. إذا كان كائنًا، فيمكن تمرير الخصائص الإضافية التالية:
dsaEncoding
<string> بالنسبة إلى DSA و ECDSA، يحدد هذا الخيار تنسيق التوقيع الذي تم إنشاؤه. يمكن أن يكون واحدًا مما يلي:'der'
(افتراضي): هيكل توقيع ASN.1 المشفر DER الذي يشفر(r, s)
.'ieee-p1363'
: تنسيق التوقيعr || s
كما هو مقترح في IEEE-P1363.
padding
<integer> قيمة الحشو الاختيارية لـ RSA، واحدة مما يلي:crypto.constants.RSA_PKCS1_PADDING
(افتراضي)crypto.constants.RSA_PKCS1_PSS_PADDING
سيستخدم RSA_PKCS1_PSS_PADDING
MGF1 مع نفس دالة التجزئة المستخدمة لتوقيع الرسالة كما هو محدد في القسم 3.1 من RFC 4055، ما لم يتم تحديد دالة تجزئة MGF1 كجزء من المفتاح وفقًا للقسم 3.3 من RFC 4055.
saltLength
<integer> طول الملح عندما يكون الحشوRSA_PKCS1_PSS_PADDING
. القيمة الخاصةcrypto.constants.RSA_PSS_SALTLEN_DIGEST
تعين طول الملح إلى حجم الملخص،crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(افتراضي) يعينه إلى القيمة القصوى المسموح بها.
إذا تم توفير outputEncoding
، فسيتم إرجاع سلسلة؛ وإلا يتم إرجاع Buffer
.
لا يمكن استخدام كائن Sign
مرة أخرى بعد استدعاء طريقة sign.sign()
. ستؤدي الاستدعاءات المتعددة لـ sign.sign()
إلى حدوث خطأ.
sign.update(data[, inputEncoding])
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v6.0.0 | تم تغيير inputEncoding الافتراضي من binary إلى utf8 . |
v0.1.92 | تمت الإضافة في: v0.1.92 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> تشفير سلسلةdata
.
يقوم بتحديث محتوى Sign
بالبيانات data
المحددة، والتي يتم تحديد تشفيرها في inputEncoding
. إذا لم يتم توفير encoding
، وكانت data
عبارة عن سلسلة، فسيتم فرض تشفير 'utf8'
. إذا كانت data
عبارة عن Buffer
أو TypedArray
أو DataView
، فسيتم تجاهل inputEncoding
.
يمكن استدعاء هذا عدة مرات ببيانات جديدة أثناء تدفقها.
الفئة: Verify
تمت الإضافة في: v0.1.92
- يمتد: <stream.Writable>
الفئة Verify
هي أداة للتحقق من التوقيعات. يمكن استخدامه بإحدى طريقتين:
- كـ تدفق قابل للكتابة حيث تُستخدم البيانات المكتوبة للتحقق من صحة التوقيع المقدم، أو
- باستخدام الطرق
verify.update()
وverify.verify()
للتحقق من التوقيع.
تُستخدم الطريقة crypto.createVerify()
لإنشاء مثيلات Verify
. لا يجوز إنشاء كائنات Verify
مباشرةً باستخدام الكلمة الأساسية new
.
انظر Sign
للأمثلة.
verify.update(data[, inputEncoding])
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v6.0.0 | تم تغيير inputEncoding الافتراضي من binary إلى utf8 . |
v0.1.92 | تمت الإضافة في: v0.1.92 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> تشفير سلسلةdata
.
يقوم بتحديث محتوى Verify
بالبيانات data
المحددة، والتي يتم تحديد تشفيرها في inputEncoding
. إذا لم يتم توفير inputEncoding
، وكانت data
عبارة عن سلسلة، فسيتم فرض تشفير 'utf8'
. إذا كانت data
عبارة عن Buffer
أو TypedArray
أو DataView
، فسيتم تجاهل inputEncoding
.
يمكن استدعاء هذا عدة مرات ببيانات جديدة أثناء تدفقها.
verify.verify(object, signature[, signatureEncoding])
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن يكون الكائن أيضًا ArrayBuffer و CryptoKey. |
v13.2.0, v12.16.0 | تدعم هذه الدالة الآن تواقيع IEEE-P1363 DSA و ECDSA. |
v12.0.0 | تدعم هذه الدالة الآن مفاتيح RSA-PSS. |
v11.7.0 | يمكن أن يكون المفتاح الآن مفتاحًا خاصًا. |
v8.0.0 | تمت إضافة دعم لـ RSASSA-PSS وخيارات إضافية. |
v0.1.92 | تمت الإضافة في: v0.1.92 |
object
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>signature
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>إرجاع: <boolean>
true
أوfalse
اعتمادًا على صلاحية التوقيع للبيانات والمفتاح العام.
للتحقق من البيانات المقدمة باستخدام object
و signature
المحددتين.
إذا لم يكن object
هو KeyObject
، تتصرف هذه الدالة كما لو تم تمرير object
إلى crypto.createPublicKey()
. إذا كان كائنًا، يمكن تمرير الخصائص الإضافية التالية:
dsaEncoding
<string> بالنسبة لـ DSA و ECDSA، يحدد هذا الخيار تنسيق التوقيع. يمكن أن يكون أحد ما يلي:'der'
(افتراضي): بنية توقيع ASN.1 المشفرة بـ DER لتشفير(r, s)
.'ieee-p1363'
: تنسيق التوقيعr || s
كما هو مقترح في IEEE-P1363.
padding
<integer> قيمة الحشو الاختيارية لـ RSA، إحدى القيم التالية:crypto.constants.RSA_PKCS1_PADDING
(افتراضي)crypto.constants.RSA_PKCS1_PSS_PADDING
سيستخدم RSA_PKCS1_PSS_PADDING
MGF1 مع نفس دالة التجزئة المستخدمة للتحقق من الرسالة كما هو محدد في القسم 3.1 من RFC 4055، ما لم يتم تحديد دالة تجزئة MGF1 كجزء من المفتاح بما يتوافق مع القسم 3.3 من RFC 4055.
saltLength
<integer> طول الملح عندما يكون الحشوRSA_PKCS1_PSS_PADDING
. تحدد القيمة الخاصةcrypto.constants.RSA_PSS_SALTLEN_DIGEST
طول الملح لحجم الملخص،crypto.constants.RSA_PSS_SALTLEN_AUTO
(افتراضي) يتسبب في تحديده تلقائيًا.
الوسيطة signature
هي التوقيع المحسوب مسبقًا للبيانات، في signatureEncoding
. إذا تم تحديد signatureEncoding
، فمن المتوقع أن يكون signature
سلسلة؛ وإلا فمن المتوقع أن يكون signature
عبارة عن Buffer
أو TypedArray
أو DataView
.
لا يمكن استخدام كائن verify
مرة أخرى بعد استدعاء verify.verify()
. ستؤدي المكالمات المتعددة إلى verify.verify()
إلى حدوث خطأ.
نظرًا لأنه يمكن اشتقاق المفاتيح العامة من المفاتيح الخاصة، يمكن تمرير مفتاح خاص بدلاً من مفتاح عام.
الفئة: X509Certificate
تمت إضافتها في: الإصدار 15.6.0
تغلف شهادة X509 وتوفر وصولًا للقراءة فقط إلى معلوماتها.
const { X509Certificate } = await import('node:crypto');
const x509 = new X509Certificate('{... شهادة مشفرة بتنسيق pem ...}');
console.log(x509.subject);
const { X509Certificate } = require('node:crypto');
const x509 = new X509Certificate('{... شهادة مشفرة بتنسيق pem ...}');
console.log(x509.subject);
new X509Certificate(buffer)
تمت إضافتها في: الإصدار 15.6.0
buffer
<string> | <TypedArray> | <Buffer> | <DataView> شهادة X509 مشفرة بتنسيق PEM أو DER.
x509.ca
تمت إضافتها في: الإصدار 15.6.0
- النوع: <boolean> سيكون
true
إذا كانت هذه شهادة سلطة مصدقة (CA).
x509.checkEmail(email[, options])
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار 18.0.0 | خيار الموضوع يعتمد الآن على 'default' . |
الإصدار 17.5.0, الإصدار 16.15.0 | يمكن الآن تعيين خيار الموضوع إلى 'default' . |
الإصدار 17.5.0, الإصدار 16.14.1 | تمت إزالة خيارات wildcards و partialWildcards و multiLabelWildcards و singleLabelSubdomains لأنها لم يكن لها أي تأثير. |
الإصدار 15.6.0 | تمت إضافتها في: الإصدار 15.6.0 |
email
<string>options
<Object>subject
<string>'default'
، أو'always'
، أو'never'
. الافتراضي:'default'
.
الإرجاع: <string> | <undefined> تُرجع
email
إذا كانت الشهادة متطابقة، وundefined
إذا لم تكن كذلك.
تتحقق مما إذا كانت الشهادة تطابق عنوان البريد الإلكتروني المحدد.
إذا كان خيار 'subject'
غير محدد أو تم تعيينه على 'default'
، فسيتم أخذ موضوع الشهادة في الاعتبار فقط إذا كان ملحق اسم الموضوع البديل إما غير موجود أو لا يحتوي على أي عناوين بريد إلكتروني.
إذا تم تعيين خيار 'subject'
على 'always'
وإذا كان ملحق اسم الموضوع البديل إما غير موجود أو لا يحتوي على عنوان بريد إلكتروني مطابق، فسيتم أخذ موضوع الشهادة في الاعتبار.
إذا تم تعيين خيار 'subject'
على 'never'
، فلن يتم أخذ موضوع الشهادة في الاعتبار أبدًا، حتى إذا كانت الشهادة لا تحتوي على أي أسماء موضوع بديلة.
x509.checkHost(name[, options])
[History]
Version | Changes |
---|---|
v18.0.0 | تم تعيين خيار الموضوع الآن على 'default' افتراضيًا. |
v17.5.0, v16.15.0 | يمكن الآن تعيين خيار الموضوع على 'default' . |
v15.6.0 | تمت الإضافة في: v15.6.0 |
name
<string>options
<Object>Returns: <string> | <undefined> يُرجع اسم موضوع يطابق
name
، أوundefined
إذا لم يتطابق أي اسم موضوع معname
.
للتحقق مما إذا كانت الشهادة تطابق اسم المضيف المحدد.
إذا كانت الشهادة تطابق اسم المضيف المحدد، فسيتم إرجاع اسم الموضوع المطابق. قد يكون الاسم الذي تم إرجاعه مطابقًا تمامًا (على سبيل المثال، foo.example.com
) أو قد يحتوي على أحرف بدل (على سبيل المثال، *.example.com
). نظرًا لأن مقارنات اسم المضيف غير حساسة لحالة الأحرف، فقد يختلف اسم الموضوع الذي تم إرجاعه أيضًا عن name
المحدد في حالة الأحرف.
إذا كان خيار 'subject'
غير محدد أو تم تعيينه على 'default'
، فسيتم اعتبار موضوع الشهادة فقط إذا كان ملحق اسم الموضوع البديل إما غير موجود أو لا يحتوي على أي أسماء DNS. يتوافق هذا السلوك مع RFC 2818 ("HTTP Over TLS").
إذا تم تعيين خيار 'subject'
على 'always'
وإذا كان ملحق اسم الموضوع البديل إما غير موجود أو لا يحتوي على اسم DNS مطابق، فسيتم اعتبار موضوع الشهادة.
إذا تم تعيين خيار 'subject'
على 'never'
، فلن يتم اعتبار موضوع الشهادة أبدًا، حتى إذا كانت الشهادة لا تحتوي على أي أسماء موضوع بديلة.
x509.checkIP(ip)
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v17.5.0, v16.14.1 | تمت إزالة وسيطة options لأنه ليس لها أي تأثير. |
v15.6.0 | أُضيف في: v15.6.0 |
ip
<string>- الإرجاع: <string> | <undefined> يُرجع
ip
إذا تطابقت الشهادة، أوundefined
إذا لم تتطابق.
يتحقق مما إذا كانت الشهادة تطابق عنوان IP المحدد (IPv4 أو IPv6).
يتم فقط النظر في أسماء البدائل للموضوع iPAddress
من RFC 5280، ويجب أن تتطابق تمامًا مع عنوان ip
المحدد. يتم تجاهل أسماء البدائل الأخرى للموضوع بالإضافة إلى حقل الموضوع في الشهادة.
x509.checkIssued(otherCert)
أُضيف في: v15.6.0
otherCert
<X509Certificate>- الإرجاع: <boolean>
يتحقق مما إذا كانت هذه الشهادة قد تم إصدارها بواسطة otherCert
المحددة.
x509.checkPrivateKey(privateKey)
أُضيف في: v15.6.0
privateKey
<KeyObject> مفتاح خاص.- الإرجاع: <boolean>
يتحقق مما إذا كان المفتاح العام لهذه الشهادة متوافقًا مع المفتاح الخاص المحدد.
x509.extKeyUsage
أُضيف في: v15.6.0
- النوع: <string[]>
مصفوفة تفصل استخدامات المفتاح الموسعة لهذه الشهادة.
x509.fingerprint
أُضيف في: v15.6.0
- النوع: <string>
بصمة SHA-1 لهذه الشهادة.
نظرًا لأن SHA-1 معطلة من الناحية المشفرة ولأن أمان SHA-1 أسوأ بكثير من أمان الخوارزميات المستخدمة بشكل شائع لتوقيع الشهادات، ففكر في استخدام x509.fingerprint256
بدلاً من ذلك.
x509.fingerprint256
تمت الإضافة في: v15.6.0
- النوع: <string>
بصمة SHA-256 لهذه الشهادة.
x509.fingerprint512
تمت الإضافة في: v17.2.0, v16.14.0
- النوع: <string>
بصمة SHA-512 لهذه الشهادة.
نظرًا لأن حساب بصمة SHA-256 عادةً ما يكون أسرع ولأنه يمثل نصف حجم بصمة SHA-512 فقط، فقد يكون x509.fingerprint256
خيارًا أفضل. على الرغم من أن SHA-512 من المفترض أن توفر مستوى أمان أعلى بشكل عام، إلا أن أمان SHA-256 يطابق أمان معظم الخوارزميات المستخدمة بشكل شائع لتوقيع الشهادات.
x509.infoAccess
[السجل]
الإصدار | التغييرات |
---|---|
v17.3.1, v16.13.2 | قد يتم ترميز أجزاء من هذا السلسلة كسلاسل JSON حرفية استجابةً لـ CVE-2021-44532. |
v15.6.0 | تمت الإضافة في: v15.6.0 |
- النوع: <string>
تمثيل نصي لامتداد معلومات الوصول إلى سلطة الشهادة.
هذه قائمة بوصف الوصول مفصولة بفواصل الأسطر. يبدأ كل سطر بطريقة الوصول ونوع موقع الوصول، متبوعًا بنقطتين والقيمة المرتبطة بموقع الوصول.
بعد البادئة التي تدل على طريقة الوصول ونوع موقع الوصول، قد يتم تضمين بقية كل سطر بين علامتي اقتباس للإشارة إلى أن القيمة عبارة عن سلسلة JSON حرفية. لتحقيق التوافق مع الإصدارات السابقة، يستخدم Node.js فقط سلاسل JSON حرفية داخل هذه الخاصية عند الضرورة لتجنب الغموض. يجب أن يكون رمز الطرف الثالث مستعدًا للتعامل مع كلا تنسيقات الإدخال المحتملة.
x509.issuer
تمت الإضافة في: v15.6.0
- النوع: <string>
معرف الجهة المُصدرة المدرج في هذه الشهادة.
x509.issuerCertificate
أُضيف في: الإصدار v15.9.0
- النوع: <X509Certificate>
شهادة المُصدر أو undefined
إذا لم تكن شهادة المُصدر متاحة.
x509.publicKey
أُضيف في: الإصدار v15.6.0
- النوع: <KeyObject>
المفتاح العام <KeyObject> لهذه الشهادة.
x509.raw
أُضيف في: الإصدار v15.6.0
- النوع: <Buffer>
Buffer
يحتوي على ترميز DER لهذه الشهادة.
x509.serialNumber
أُضيف في: الإصدار v15.6.0
- النوع: <string>
الرقم التسلسلي لهذه الشهادة.
يتم تعيين الأرقام التسلسلية من قبل سلطات الشهادات ولا تحدد الشهادات بشكل فريد. ضع في اعتبارك استخدام x509.fingerprint256
كمعرف فريد بدلاً من ذلك.
x509.subject
أُضيف في: الإصدار v15.6.0
- النوع: <string>
الموضوع الكامل لهذه الشهادة.
x509.subjectAltName
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v17.3.1, v16.13.2 | قد يتم ترميز أجزاء من هذه السلسلة كنصوص JSON حرفية استجابةً لـ CVE-2021-44532. |
v15.6.0 | أُضيف في: الإصدار v15.6.0 |
- النوع: <string>
الاسم البديل للموضوع المحدد لهذه الشهادة.
هذه قائمة مفصولة بفواصل للأسماء البديلة للموضوع. يبدأ كل إدخال بسلسلة تحدد نوع الاسم البديل للموضوع متبوعًا بنقطتين والقيمة المرتبطة بالإدخال.
افترضت الإصدارات السابقة من Node.js بشكل غير صحيح أنه من الآمن تقسيم هذه الخاصية عند التسلسل المكون من حرفين ', '
(انظر CVE-2021-44532). ومع ذلك، يمكن أن تحتوي الشهادات الخبيثة والشرعية على حد سواء على أسماء بديلة للموضوع تتضمن هذا التسلسل عند تمثيلها كسلسلة.
بعد البادئة التي تدل على نوع الإدخال، قد يتم تضمين بقية كل إدخال بين علامتي اقتباس للإشارة إلى أن القيمة عبارة عن نص JSON حرفي. من أجل التوافق مع الإصدارات السابقة، يستخدم Node.js نصوص JSON الحرفية فقط داخل هذه الخاصية عند الضرورة لتجنب الغموض. يجب أن يكون كود الطرف الثالث مستعدًا للتعامل مع كلا تنسيقي الإدخال المحتملين.
x509.toJSON()
تمت إضافته في: v15.6.0
- النوع: <string>
لا يوجد ترميز JSON قياسي لشهادات X509. تُرجع طريقة toJSON()
سلسلة تحتوي على الشهادة المشفرة PEM.
x509.toLegacyObject()
تمت إضافته في: v15.6.0
- النوع: <Object>
تُرجع معلومات حول هذه الشهادة باستخدام ترميز كائن الشهادة القديم.
x509.toString()
تمت إضافته في: v15.6.0
- النوع: <string>
تُرجع الشهادة المشفرة PEM.
x509.validFrom
تمت إضافته في: v15.6.0
- النوع: <string>
تاريخ/وقت بدء صلاحية هذه الشهادة.
x509.validFromDate
تمت إضافته في: v23.0.0
- النوع: <Date>
تاريخ/وقت بدء صلاحية هذه الشهادة، مُغلفًا في كائن Date
.
x509.validTo
تمت إضافته في: v15.6.0
- النوع: <string>
تاريخ/وقت انتهاء صلاحية هذه الشهادة.
x509.validToDate
تمت إضافته في: v23.0.0
- النوع: <Date>
تاريخ/وقت انتهاء صلاحية هذه الشهادة، مُغلفًا في كائن Date
.
x509.verify(publicKey)
تمت إضافته في: v15.6.0
publicKey
<KeyObject> مفتاح عام.- الإرجاع: <boolean>
يتحقق مما إذا كانت هذه الشهادة قد تم توقيعها بواسطة المفتاح العام المحدد. لا يجري أي فحوصات تحقق أخرى على الشهادة.
طرق وخصائص وحدة node:crypto
crypto.checkPrime(candidate[, options], callback)
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | تمرير رد نداء غير صالح إلى وسيط callback يطرح الآن ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK . |
v15.8.0 | تمت الإضافة في: v15.8.0 |
candidate
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint> أولي محتمل مشفر كسلسلة من الثمانيات ذات النهاية الكبيرة ذات طول عشوائي.options
<Object>checks
<number> عدد تكرارات اختبار أولية ميلر-رابين الاحتمالية التي يجب إجراؤها. عندما تكون القيمة0
(صفر)، يتم استخدام عدد من الفحوصات التي تؤدي إلى معدل إيجابي خاطئ لا يزيد عن 2 للإدخال العشوائي. يجب توخي الحذر عند تحديد عدد من الفحوصات. ارجع إلى وثائق OpenSSL لوظيفةBN_is_prime_ex
خياراتnchecks
لمزيد من التفاصيل. الافتراضي:0
callback
<Function>
للتحقق من أولية candidate
.
crypto.checkPrimeSync(candidate[, options])
أضيف في: v15.8.0
candidate
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint> عدد أولي محتمل مُشفر كتسلسل لـ big endian octets من طول اعتباطي.options
<Object>checks
<number> عدد تكرارات اختبار Miller-Rabin لاحتمالية الأعداد الأولية التي سيتم إجراؤها. عندما تكون القيمة0
(صفر)، يتم استخدام عدد من الفحوصات التي تعطي معدل إيجابية كاذبة لا يزيد عن 2 للإدخال العشوائي. يجب توخي الحذر عند تحديد عدد من الفحوصات. ارجع إلى وثائق OpenSSL الخاصة بـBN_is_prime_ex
للخياراتnchecks
لمزيد من التفاصيل. الافتراضي:0
Returns: <boolean>
true
إذا كان المرشح عددًا أوليًا مع احتمال خطأ أقل من0.25 ** options.checks
.
يتحقق من أوليّة candidate
.
crypto.constants
أضيف في: v6.3.0
كائن يحتوي على ثوابت شائعة الاستخدام لعمليات التشفير والأمان ذات الصلة. يتم وصف الثوابت المحددة حاليًا في ثوابت التشفير.
crypto.createCipheriv(algorithm, key, iv[, options])
[السجل]
الإصدار | التغييرات |
---|---|
v17.9.0, v16.17.0 | الآن خيار authTagLength اختياري عند استخدام الشيفرة chacha20-poly1305 ويأخذ القيمة الافتراضية 16 بايت. |
v15.0.0 | يمكن أن تكون وسيطات كلمة المرور و iv عبارة عن ArrayBuffer وتقتصر كل منها على 2 ** 31 - 1 بايت كحد أقصى. |
v11.6.0 | يمكن أن تكون وسيطة key الآن KeyObject . |
v11.2.0, v10.17.0 | الآن الشيفرة chacha20-poly1305 (المتغير IETF من ChaCha20-Poly1305) مدعومة. |
v10.10.0 | الآن الشيفرات في وضع OCB مدعومة. |
v10.2.0 | يمكن الآن استخدام خيار authTagLength لإنتاج علامات مصادقة أقصر في وضع GCM ويأخذ القيمة الافتراضية 16 بايت. |
v9.9.0 | قد تكون الآن المعلمة iv قيمة null للشيفرات التي لا تحتاج إلى متجه تهيئة. |
v0.1.94 | تمت إضافته في: v0.1.94 |
algorithm
<string>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>iv
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <null>options
<Object>stream.transform
options- Returns: <Cipher>
ينشئ ويعيد كائن Cipher
، مع algorithm
وkey
ومتجه التهيئة (iv
) المحدد.
تتحكم وسيطة options
في سلوك الدفق وهي اختيارية إلا عند استخدام شيفرة في وضع CCM أو OCB (على سبيل المثال 'aes-128-ccm'
). في هذه الحالة، يكون خيار authTagLength
مطلوبًا ويحدد طول علامة المصادقة بالبايت، انظر وضع CCM. في وضع GCM، خيار authTagLength
ليس مطلوبًا ولكن يمكن استخدامه لتعيين طول علامة المصادقة التي سيتم إرجاعها بواسطة getAuthTag()
ويأخذ القيمة الافتراضية 16 بايت. بالنسبة إلى chacha20-poly1305
، يأخذ خيار authTagLength
القيمة الافتراضية 16 بايت.
يعتمد algorithm
على OpenSSL، والأمثلة هي 'aes192'
، إلخ. في إصدارات OpenSSL الحديثة، ستعرض openssl list -cipher-algorithms
خوارزميات الشيفرة المتاحة.
key
هو المفتاح الخام المستخدم بواسطة algorithm
و iv
هو متجه تهيئة. يجب أن تكون كلتا الوسيطتين عبارة عن سلاسل مشفرة بـ 'utf8'
أو Buffers أو TypedArray
أو DataView
. قد يكون key
اختياريًا KeyObject
من النوع secret
. إذا كانت الشيفرة لا تحتاج إلى متجه تهيئة، فقد يكون iv
قيمة null
.
عند تمرير سلاسل لـ key
أو iv
، يرجى مراعاة المحاذير عند استخدام السلاسل كمدخلات لواجهات برمجة التطبيقات المشفرة.
يجب أن تكون متجهات التهيئة غير قابلة للتنبؤ وفريدة؛ من الناحية المثالية، ستكون عشوائية مشفرة. ليس من الضروري أن تكون سرية: تتم إضافة IVs عادةً إلى رسائل النص المشفر غير مشفرة. قد يبدو الأمر متناقضًا أن شيئًا ما يجب أن يكون غير متوقع وفريدًا، ولكن ليس من الضروري أن يكون سريًا؛ تذكر أنه يجب ألا يكون المهاجم قادرًا على التنبؤ مسبقًا بما سيكون عليه IV معين.
crypto.createDecipheriv(algorithm, key, iv[, options])
[السجل]
الإصدار | التغييرات |
---|---|
v17.9.0, v16.17.0 | أصبح الخيار authTagLength اختياريًا الآن عند استخدام شيفرة chacha20-poly1305 ويأخذ القيمة الافتراضية 16 بايت. |
v11.6.0 | يمكن أن تكون الوسيطة key الآن KeyObject . |
v11.2.0, v10.17.0 | يتم دعم الشيفرة chacha20-poly1305 (متغير IETF من ChaCha20-Poly1305) الآن. |
v10.10.0 | يتم دعم الشيفرات في وضع OCB الآن. |
v10.2.0 | يمكن الآن استخدام الخيار authTagLength لتقييد أطوال علامة مصادقة GCM المقبولة. |
v9.9.0 | قد تكون المعلمة iv الآن null للشيفرات التي لا تحتاج إلى متجه تهيئة. |
v0.1.94 | تمت الإضافة في: v0.1.94 |
algorithm
<string>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>iv
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <null>options
<Object> خياراتstream.transform
- Returns: <Decipher>
يقوم بإنشاء وإرجاع كائن Decipher
يستخدم algorithm
و key
ومتجه التهيئة (iv
) المحدد.
تتحكم الوسيطة options
في سلوك التدفق وهي اختيارية باستثناء عند استخدام شيفرة في وضع CCM أو OCB (مثل 'aes-128-ccm'
). في هذه الحالة، يكون الخيار authTagLength
مطلوبًا ويحدد طول علامة المصادقة بالبايت، انظر وضع CCM. بالنسبة إلى AES-GCM و chacha20-poly1305
، يأخذ الخيار authTagLength
القيمة الافتراضية 16 بايت ويجب تعيينه على قيمة مختلفة إذا تم استخدام طول مختلف.
يعتمد algorithm
على OpenSSL، والأمثلة هي 'aes192'
، وما إلى ذلك. في إصدارات OpenSSL الحديثة، ستعرض openssl list -cipher-algorithms
خوارزميات الشيفرة المتاحة.
key
هو المفتاح الخام المستخدم بواسطة algorithm
و iv
هو متجه تهيئة. يجب أن تكون كلتا الوسيطتين سلاسل مشفرة 'utf8'
أو Buffers أو TypedArray
أو DataView
s. يمكن أن يكون key
اختياريًا KeyObject
من النوع secret
. إذا كانت الشيفرة لا تحتاج إلى متجه تهيئة، فقد يكون iv
هو null
.
عند تمرير سلاسل لـ key
أو iv
، يرجى مراعاة محاذير استخدام السلاسل كمدخلات لواجهات برمجة تطبيقات التشفير.
يجب أن تكون متجهات التهيئة غير قابلة للتنبؤ وفريدة من نوعها؛ من الناحية المثالية، ستكون عشوائية مشفرة. لا يجب أن تكون سرية: عادةً ما تتم إضافة IVs إلى رسائل النص المشفر غير المشفرة. قد يبدو الأمر متناقضًا أن شيئًا ما يجب أن يكون غير متوقع وفريدًا، ولكن ليس من الضروري أن يكون سريًا؛ تذكر أنه يجب ألا يكون المهاجم قادرًا على التنبؤ مسبقًا بمتجه تهيئة معين.
crypto.createDiffieHellman(prime[, primeEncoding][, generator][, generatorEncoding])
[السجل]
الإصدار | التغييرات |
---|---|
v8.0.0 | يمكن أن يكون المعامل prime الآن أي TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون المعامل prime الآن Uint8Array . |
v6.0.0 | تم تغيير الإعداد الافتراضي لمعلمات الترميز من binary إلى utf8 . |
v0.11.12 | تمت إضافته في: v0.11.12 |
prime
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>primeEncoding
<string> ترميز سلسلةprime
.generator
<number> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> افتراضي:2
generatorEncoding
<string> ترميز سلسلةgenerator
.- الإرجاع: <DiffieHellman>
ينشئ كائن تبادل مفاتيح DiffieHellman
باستخدام prime
الموفر ومولد
اختياري محدد.
يمكن أن يكون المعامل generator
رقمًا أو سلسلة أو Buffer
. إذا لم يتم تحديد مولد
، فسيتم استخدام القيمة 2
.
إذا تم تحديد primeEncoding
، فمن المتوقع أن يكون prime
سلسلة؛ وإلا فمن المتوقع أن يكون Buffer
أو TypedArray
أو DataView
.
إذا تم تحديد generatorEncoding
، فمن المتوقع أن يكون مولد
سلسلة؛ وإلا فمن المتوقع أن يكون رقمًا أو Buffer
أو TypedArray
أو DataView
.
crypto.createDiffieHellman(primeLength[, generator])
تمت الإضافة في: v0.5.0
primeLength
<number>generator
<number> افتراضي:2
- الإرجاع: <DiffieHellman>
ينشئ كائن تبادل مفاتيح DiffieHellman
ويولد عددًا أوليًا بطول primeLength
من البتات باستخدام generator
رقمي اختياري محدد. إذا لم يتم تحديد generator
، فسيتم استخدام القيمة 2
.
crypto.createDiffieHellmanGroup(name)
تمت الإضافة في: v0.9.3
name
<string>- الإرجاع: <DiffieHellmanGroup>
اسم مستعار لـ crypto.getDiffieHellman()
crypto.createECDH(curveName)
تمت الإضافة في: v0.11.14
ينشئ كائن تبادل مفاتيح منحنى إهليلجي ديفي-هيلمان (ECDH
) باستخدام منحنى محدد مسبقًا تحدده سلسلة curveName
. استخدم crypto.getCurves()
للحصول على قائمة بأسماء المنحنيات المتاحة. في إصدارات OpenSSL الحديثة، سيعرض openssl ecparam -list_curves
أيضًا اسم ووصف كل منحنى إهليلجي متاح.
crypto.createHash(algorithm[, options])
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v12.8.0 | تمت إضافة خيار outputLength لدوال تجزئة XOF. |
v0.1.92 | تمت الإضافة في: v0.1.92 |
algorithm
<string>options
<Object>stream.transform
options- الإرجاع: <Hash>
ينشئ ويُرجع كائن Hash
يمكن استخدامه لإنشاء ملخصات تجزئة باستخدام algorithm
المحدد. تتحكم وسيطة options
الاختيارية في سلوك الدفق. بالنسبة لوظائف تجزئة XOF مثل 'shake256'
، يمكن استخدام الخيار outputLength
لتحديد طول الإخراج المطلوب بالبايت.
تعتمد algorithm
على الخوارزميات المتاحة التي تدعمها نسخة OpenSSL على النظام الأساسي. ومن الأمثلة 'sha256'
، 'sha512'
، إلخ. في الإصدارات الحديثة من OpenSSL، سيعرض openssl list -digest-algorithms
خوارزميات التجزئة المتاحة.
مثال: إنشاء مجموع sha256 لملف
import {
createReadStream,
} from 'node:fs';
import { argv } from 'node:process';
const {
createHash,
} = await import('node:crypto');
const filename = argv[2];
const hash = createHash('sha256');
const input = createReadStream(filename);
input.on('readable', () => {
// Only one element is going to be produced by the
// hash stream.
const data = input.read();
if (data)
hash.update(data);
else {
console.log(`${hash.digest('hex')} ${filename}`);
}
});
const {
createReadStream,
} = require('node:fs');
const {
createHash,
} = require('node:crypto');
const { argv } = require('node:process');
const filename = argv[2];
const hash = createHash('sha256');
const input = createReadStream(filename);
input.on('readable', () => {
// Only one element is going to be produced by the
// hash stream.
const data = input.read();
if (data)
hash.update(data);
else {
console.log(`${hash.digest('hex')} ${filename}`);
}
});
crypto.createHmac(algorithm, key[, options])
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن يكون المفتاح أيضًا ArrayBuffer أو CryptoKey. تمت إضافة خيار الترميز. لا يمكن أن يحتوي المفتاح على أكثر من 2 ** 32 - 1 بايت. |
v11.6.0 | يمكن أن تكون وسيطة key الآن KeyObject . |
v0.1.94 | تمت الإضافة في: v0.1.94 |
algorithm
<string>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>options
<Object>stream.transform
optionsencoding
<string> ترميز السلسلة المراد استخدامه عندما تكونkey
سلسلة.
الإرجاع: <Hmac>
ينشئ ويرجع كائن Hmac
الذي يستخدم algorithm
و key
المحددين. تتحكم وسيطة options
الاختيارية في سلوك التدفق.
يعتمد algorithm
على الخوارزميات المتاحة التي تدعمها نسخة OpenSSL على النظام الأساسي. ومن الأمثلة على ذلك 'sha256'
و 'sha512'
وما إلى ذلك. في الإصدارات الحديثة من OpenSSL، ستعرض openssl list -digest-algorithms
خوارزميات التلخيص المتاحة.
key
هو مفتاح HMAC المستخدم لإنشاء تجزئة HMAC المشفرة. إذا كان KeyObject
، فيجب أن يكون نوعه secret
. إذا كانت سلسلة، فيرجى مراعاة المحاذير عند استخدام السلاسل كمدخلات لواجهات برمجة التطبيقات المشفرة. إذا تم الحصول عليه من مصدر إنتروبيا آمن مشفر، مثل crypto.randomBytes()
أو crypto.generateKey()
، فيجب ألا يتجاوز طوله حجم الكتلة algorithm
(على سبيل المثال، 512 بت لـ SHA-256).
مثال: إنشاء sha256 HMAC لملف
import {
createReadStream,
} from 'node:fs';
import { argv } from 'node:process';
const {
createHmac,
} = await import('node:crypto');
const filename = argv[2];
const hmac = createHmac('sha256', 'a secret');
const input = createReadStream(filename);
input.on('readable', () => {
// Only one element is going to be produced by the
// hash stream.
const data = input.read();
if (data)
hmac.update(data);
else {
console.log(`${hmac.digest('hex')} ${filename}`);
}
});
const {
createReadStream,
} = require('node:fs');
const {
createHmac,
} = require('node:crypto');
const { argv } = require('node:process');
const filename = argv[2];
const hmac = createHmac('sha256', 'a secret');
const input = createReadStream(filename);
input.on('readable', () => {
// Only one element is going to be produced by the
// hash stream.
const data = input.read();
if (data)
hmac.update(data);
else {
console.log(`${hmac.digest('hex')} ${filename}`);
}
});
crypto.createPrivateKey(key)
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v15.12.0 | يمكن أن يكون المفتاح أيضًا كائن JWK. |
v15.0.0 | يمكن أن يكون المفتاح أيضًا ArrayBuffer. تمت إضافة خيار الترميز. لا يمكن أن يحتوي المفتاح على أكثر من 2 ** 32 - 1 بايت. |
v11.6.0 | تمت إضافته في: v11.6.0 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
: <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <Object> مادة المفتاح، إما بتنسيق PEM أو DER أو JWK.format
: <string> يجب أن يكون'pem'
أو'der'
أو'jwk'
. الافتراضي:'pem'
.type
: <string> يجب أن يكون'pkcs1'
أو'pkcs8'
أو'sec1'
. هذا الخيار مطلوب فقط إذا كانformat
هو'der'
ويتم تجاهله بخلاف ذلك.passphrase
: <string> | <Buffer> عبارة المرور المستخدمة لفك التشفير.encoding
: <string> ترميز السلسلة المراد استخدامه عندما يكونkey
سلسلة.
Returns: <KeyObject>
ينشئ ويعيد كائن مفتاح جديد يحتوي على مفتاح خاص. إذا كان key
عبارة عن سلسلة أو Buffer
، فسيُفترض أن format
هو 'pem'
؛ بخلاف ذلك، يجب أن يكون key
كائنًا بالخصائص الموضحة أعلاه.
إذا كان المفتاح الخاص مشفرًا، فيجب تحديد passphrase
. يقتصر طول عبارة المرور على 1024 بايت.
crypto.createPublicKey(key)
[السجل]
الإصدار | التغييرات |
---|---|
v15.12.0 | يمكن أن يكون المفتاح أيضًا كائن JWK. |
v15.0.0 | يمكن أن يكون المفتاح أيضًا ArrayBuffer. تمت إضافة خيار الترميز. لا يمكن أن يحتوي المفتاح على أكثر من 2 ** 32 - 1 بايت. |
v11.13.0 | يمكن أن تكون وسيطة key الآن KeyObject من النوع private . |
v11.7.0 | يمكن أن تكون وسيطة key الآن مفتاحًا خاصًا. |
v11.6.0 | أُضيف في: v11.6.0 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
: <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <Object> مادة المفتاح، إما بتنسيق PEM أو DER أو JWK.format
: <string> يجب أن يكون'pem'
أو'der'
أو'jwk'
. الافتراضي:'pem'
.type
: <string> يجب أن يكون'pkcs1'
أو'spki'
. هذا الخيار مطلوب فقط إذا كانformat
هو'der'
ويتم تجاهله بخلاف ذلك.encoding
<string> ترميز السلسلة المراد استخدامه عندما يكونkey
سلسلة.
Returns: <KeyObject>
يقوم بإنشاء وإرجاع كائن مفتاح جديد يحتوي على مفتاح عام. إذا كان key
سلسلة أو Buffer
، فيُفترض أن يكون format
هو 'pem'
؛ إذا كان key
هو KeyObject
من النوع 'private'
، فسيتم اشتقاق المفتاح العام من المفتاح الخاص المحدد؛ بخلاف ذلك، يجب أن يكون key
كائنًا بالخصائص الموضحة أعلاه.
إذا كان التنسيق 'pem'
، فقد يكون 'key'
أيضًا شهادة X.509.
نظرًا لأنه يمكن اشتقاق المفاتيح العامة من المفاتيح الخاصة، فيمكن تمرير مفتاح خاص بدلاً من المفتاح العام. في هذه الحالة، تتصرف هذه الدالة كما لو تم استدعاء crypto.createPrivateKey()
، باستثناء أن نوع KeyObject
المُرجع سيكون 'public'
وأنه لا يمكن استخراج المفتاح الخاص من KeyObject
المُرجع. وبالمثل، إذا تم إعطاء KeyObject
من النوع 'private'
، فسيتم إرجاع KeyObject
جديد من النوع 'public'
وسيكون من المستحيل استخراج المفتاح الخاص من الكائن المُرجع.
crypto.createSecretKey(key[, encoding])
[السجل]
الإصدار | التغييرات |
---|---|
v18.8.0, v16.18.0 | يمكن أن يكون المفتاح الآن بطول صفر. |
v15.0.0 | يمكن أن يكون المفتاح أيضًا ArrayBuffer أو سلسلة. تمت إضافة وسيطة الترميز. لا يمكن أن يحتوي المفتاح على أكثر من 2 ** 32 - 1 بايت. |
v11.6.0 | تمت الإضافة في: v11.6.0 |
key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> ترميز السلسلة عندما تكونkey
سلسلة.- إرجاع: <KeyObject>
ينشئ ويرجع كائن مفتاح جديد يحتوي على مفتاح سري للتشفير المتماثل أو Hmac
.
crypto.createSign(algorithm[, options])
تمت الإضافة في: v0.1.92
algorithm
<string>options
<Object>stream.Writable
options- إرجاع: <Sign>
ينشئ ويرجع كائن Sign
يستخدم algorithm
المحدد. استخدم crypto.getHashes()
للحصول على أسماء خوارزميات التلخيص المتاحة. تتحكم وسيطة options
الاختيارية في سلوك stream.Writable
.
في بعض الحالات، يمكن إنشاء مثيل Sign
باستخدام اسم خوارزمية توقيع، مثل 'RSA-SHA256'
، بدلاً من خوارزمية تلخيص. سيؤدي ذلك إلى استخدام خوارزمية التلخيص المقابلة. هذا لا يعمل مع جميع خوارزميات التوقيع، مثل 'ecdsa-with-SHA256'
، لذلك من الأفضل دائمًا استخدام أسماء خوارزميات التلخيص.
crypto.createVerify(algorithm[, options])
أضيف في: v0.1.92
algorithm
<string>options
<Object>stream.Writable
options- Returns: <Verify>
ينشئ ويعيد كائن Verify
يستخدم الخوارزمية المعطاة. استخدم crypto.getHashes()
للحصول على مصفوفة بأسماء خوارزميات التوقيع المتاحة. تتحكم وسيطة options
الاختيارية في سلوك stream.Writable
.
في بعض الحالات، يمكن إنشاء مثيل Verify
باستخدام اسم خوارزمية التوقيع، مثل 'RSA-SHA256'
، بدلاً من خوارزمية الملخص. سيؤدي هذا إلى استخدام خوارزمية الملخص المقابلة. لا يعمل هذا مع جميع خوارزميات التوقيع، مثل 'ecdsa-with-SHA256'
، لذا فمن الأفضل دائمًا استخدام أسماء خوارزميات الملخص.
crypto.diffieHellman(options)
أضيف في: v13.9.0, v12.17.0
options
: <Object>privateKey
: <KeyObject>publicKey
: <KeyObject>
Returns: <Buffer>
يحسب سر Diffie-Hellman بناءً على privateKey
و publicKey
. يجب أن يكون لكلا المفتاحين نفس asymmetricKeyType
، والتي يجب أن تكون واحدة من 'dh'
(لـ Diffie-Hellman)، أو 'ec'
، أو 'x448'
، أو 'x25519'
(لـ ECDH).
crypto.fips
أضيف في: v6.0.0
تم الإيقاف منذ: v10.0.0
[Stable: 0 - Deprecated]
Stable: 0 Stability: 0 - تم الإيقاف
خاصية للتحقق والتحكم فيما إذا كان مزود تشفير متوافق مع FIPS قيد الاستخدام حاليًا. يتطلب الضبط على true بناءً FIPS من Node.js.
تم إيقاف هذه الخاصية. يرجى استخدام crypto.setFips()
و crypto.getFips()
بدلاً من ذلك.
crypto.generateKey(type, options, callback)
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | تمرير استدعاء غير صالح إلى وسيطة callback يطرح الآن ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK . |
v15.0.0 | تمت إضافته في: v15.0.0 |
type
: <string> الاستخدام المقصود للمفتاح السري الذي تم إنشاؤه. القيم المقبولة حاليًا هي'hmac'
و'aes'
.options
: <Object>length
: <number> طول بت المفتاح المراد إنشاؤه. يجب أن تكون هذه قيمة أكبر من 0.- إذا كان
type
هو'hmac'
، فإن الحد الأدنى هو 8، والطول الأقصى هو 2-1. إذا لم تكن القيمة من مضاعفات 8، فسيتم اقتطاع المفتاح الذي تم إنشاؤه إلىMath.floor(length / 8)
. - إذا كان
type
هو'aes'
، فيجب أن يكون الطول واحدًا من128
أو192
أو256
.
callback
: <Function>err
: <Error>key
: <KeyObject>
يقوم بشكل غير متزامن بإنشاء مفتاح سري عشوائي جديد بالطول المحدد. سيحدد type
عمليات التحقق التي سيتم إجراؤها على length
.
const {
generateKey,
} = await import('node:crypto');
generateKey('hmac', { length: 512 }, (err, key) => {
if (err) throw err;
console.log(key.export().toString('hex')); // 46e..........620
});
const {
generateKey,
} = require('node:crypto');
generateKey('hmac', { length: 512 }, (err, key) => {
if (err) throw err;
console.log(key.export().toString('hex')); // 46e..........620
});
يجب ألا يتجاوز حجم مفتاح HMAC الذي تم إنشاؤه حجم الكتلة لوظيفة التجزئة الأساسية. راجع crypto.createHmac()
لمزيد من المعلومات.
crypto.generateKeyPair(type, options, callback)
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | يؤدي تمرير استدعاء غير صالح إلى وسيطة callback الآن إلى ظهور ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK . |
v16.10.0 | إضافة القدرة على تحديد معلمات تسلسل RSASSA-PSS-params لأزواج مفاتيح RSA-PSS. |
v13.9.0, v12.17.0 | إضافة دعم لـ Diffie-Hellman. |
v12.0.0 | إضافة دعم لأزواج مفاتيح RSA-PSS. |
v12.0.0 | إضافة القدرة على إنشاء أزواج مفاتيح X25519 و X448. |
v12.0.0 | إضافة القدرة على إنشاء أزواج مفاتيح Ed25519 و Ed448. |
v11.6.0 | تنتج الدالتان generateKeyPair و generateKeyPairSync الآن كائنات مفاتيح إذا لم يتم تحديد أي ترميز. |
v10.12.0 | تمت الإضافة في: v10.12.0 |
type
: <string> يجب أن يكون'rsa'
أو'rsa-pss'
أو'dsa'
أو'ec'
أو'ed25519'
أو'ed448'
أو'x25519'
أو'x448'
أو'dh'
.options
: <Object>modulusLength
: <number> حجم المفتاح بالبت (RSA, DSA).publicExponent
: <number> الأس العام (RSA). افتراضي:0x10001
.hashAlgorithm
: <string> اسم خلاصة الرسالة (RSA-PSS).mgf1HashAlgorithm
: <string> اسم خلاصة الرسالة المستخدمة بواسطة MGF1 (RSA-PSS).saltLength
: <number> الحد الأدنى لطول الملح بالبايت (RSA-PSS).divisorLength
: <number> حجمq
بالبت (DSA).namedCurve
: <string> اسم المنحنى المراد استخدامه (EC).prime
: <Buffer> معلمة العدد الأولي (DH).primeLength
: <number> طول العدد الأولي بالبت (DH).generator
: <number> مولد مخصص (DH). افتراضي:2
.groupName
: <string> اسم مجموعة Diffie-Hellman (DH). انظرcrypto.getDiffieHellman()
.paramEncoding
: <string> يجب أن يكون'named'
أو'explicit'
(EC). افتراضي:'named'
.publicKeyEncoding
: <Object> انظرkeyObject.export()
.privateKeyEncoding
: <Object> انظرkeyObject.export()
.
callback
: <Function>err
: <Error>publicKey
: <string> | <Buffer> | <KeyObject>privateKey
: <string> | <Buffer> | <KeyObject>
ينشئ زوج مفاتيح غير متماثل جديد من النوع المحدد type
. يتم دعم RSA و RSA-PSS و DSA و EC و Ed25519 و Ed448 و X25519 و X448 و DH حاليًا.
إذا تم تحديد publicKeyEncoding
أو privateKeyEncoding
، فسلوك هذه الدالة كما لو تم استدعاء keyObject.export()
على نتيجتها. بخلاف ذلك، يتم إرجاع الجزء الخاص بالمفتاح كـ KeyObject
.
يوصى بترميز المفاتيح العامة كـ 'spki'
والمفاتيح الخاصة كـ 'pkcs8'
مع التشفير للتخزين طويل الأجل:
const {
generateKeyPair,
} = await import('node:crypto');
generateKeyPair('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret',
},
}, (err, publicKey, privateKey) => {
// معالجة الأخطاء واستخدام زوج المفاتيح الذي تم إنشاؤه.
});
const {
generateKeyPair,
} = require('node:crypto');
generateKeyPair('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret',
},
}, (err, publicKey, privateKey) => {
// معالجة الأخطاء واستخدام زوج المفاتيح الذي تم إنشاؤه.
});
عند الاكتمال، سيتم استدعاء callback
مع تعيين err
على undefined
و publicKey
/ privateKey
تمثل زوج المفاتيح الذي تم إنشاؤه.
إذا تم استدعاء هذه الطريقة كنسختها util.promisify()
ed، فإنها ترجع Promise
لـ Object
بخصائص publicKey
و privateKey
.
crypto.generateKeyPairSync(type, options)
[السجل]
الإصدار | التغييرات |
---|---|
v16.10.0 | إضافة القدرة على تحديد معلمات تسلسل RSASSA-PSS-params لأزواج مفاتيح RSA-PSS. |
v13.9.0, v12.17.0 | إضافة دعم Diffie-Hellman. |
v12.0.0 | إضافة دعم أزواج مفاتيح RSA-PSS. |
v12.0.0 | إضافة القدرة على إنشاء أزواج مفاتيح X25519 و X448. |
v12.0.0 | إضافة القدرة على إنشاء أزواج مفاتيح Ed25519 و Ed448. |
v11.6.0 | تُنتج الآن وظائف generateKeyPair و generateKeyPairSync كائنات مفاتيح إذا لم يتم تحديد أي ترميز. |
v10.12.0 | تمت إضافته في: v10.12.0 |
type
: <string> يجب أن يكون'rsa'
، أو'rsa-pss'
، أو'dsa'
، أو'ec'
، أو'ed25519'
، أو'ed448'
، أو'x25519'
، أو'x448'
، أو'dh'
.options
: <Object>modulusLength
: <number> حجم المفتاح بالبت (RSA، DSA).publicExponent
: <number> الأس العام (RSA). الافتراضي:0x10001
.hashAlgorithm
: <string> اسم خلاصة الرسالة (RSA-PSS).mgf1HashAlgorithm
: <string> اسم خلاصة الرسالة المستخدمة بواسطة MGF1 (RSA-PSS).saltLength
: <number> الحد الأدنى لطول الملح بالبايت (RSA-PSS).divisorLength
: <number> حجمq
بالبت (DSA).namedCurve
: <string> اسم المنحنى المراد استخدامه (EC).prime
: <Buffer> معلمة الأولي (DH).primeLength
: <number> طول الأولي بالبت (DH).generator
: <number> مولد مخصص (DH). الافتراضي:2
.groupName
: <string> اسم مجموعة Diffie-Hellman (DH). انظرcrypto.getDiffieHellman()
.paramEncoding
: <string> يجب أن يكون'named'
أو'explicit'
(EC). الافتراضي:'named'
.publicKeyEncoding
: <Object> انظرkeyObject.export()
.privateKeyEncoding
: <Object> انظرkeyObject.export()
.
الإرجاع: <Object>
publicKey
: <string> | <Buffer> | <KeyObject>privateKey
: <string> | <Buffer> | <KeyObject>
ينشئ زوج مفاتيح غير متماثل جديد من type
المحدد. يتم دعم RSA و RSA-PSS و DSA و EC و Ed25519 و Ed448 و X25519 و X448 و DH حاليًا.
إذا تم تحديد publicKeyEncoding
أو privateKeyEncoding
، فسيكون سلوك هذه الوظيفة كما لو تم استدعاء keyObject.export()
على نتيجتها. وإلا، فسيتم إرجاع الجزء الخاص بالمفتاح كـ KeyObject
.
عند ترميز المفاتيح العامة، يوصى باستخدام 'spki'
. عند ترميز المفاتيح الخاصة، يوصى باستخدام 'pkcs8'
مع عبارة مرور قوية، والحفاظ على سرية عبارة المرور.
const {
generateKeyPairSync,
} = await import('node:crypto');
const {
publicKey,
privateKey,
} = generateKeyPairSync('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret',
},
});
const {
generateKeyPairSync,
} = require('node:crypto');
const {
publicKey,
privateKey,
} = generateKeyPairSync('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret',
},
});
تمثل القيمة المرجعة { publicKey, privateKey }
زوج المفاتيح الذي تم إنشاؤه. عند تحديد ترميز PEM، سيكون المفتاح المقابل سلسلة، وإلا فسيكون مخزنًا مؤقتًا يحتوي على البيانات المشفرة بتنسيق DER.
crypto.generateKeySync(type, options)
تمت الإضافة في: الإصدار 15.0.0
type
: <string> الاستخدام المقصود للمفتاح السري الذي تم إنشاؤه. القيم المقبولة حاليًا هي'hmac'
و'aes'
.options
: <Object>length
: <number> طول البت للمفتاح المراد إنشاؤه.- إذا كان
type
هو'hmac'
، فإن الحد الأدنى هو 8، والطول الأقصى هو 2-1. إذا لم تكن القيمة من مضاعفات 8، فسيتم اقتطاع المفتاح الذي تم إنشاؤه إلىMath.floor(length / 8)
. - إذا كان
type
هو'aes'
، فيجب أن يكون الطول واحدًا من128
أو192
أو256
.
الإرجاع: <KeyObject>
ينشئ بشكل متزامن مفتاحًا سريًا عشوائيًا جديدًا بالطول المحدد. سيحدد type
عمليات التحقق التي سيتم إجراؤها على length
.
const {
generateKeySync,
} = await import('node:crypto');
const key = generateKeySync('hmac', { length: 512 });
console.log(key.export().toString('hex')); // e89..........41e
const {
generateKeySync,
} = require('node:crypto');
const key = generateKeySync('hmac', { length: 512 });
console.log(key.export().toString('hex')); // e89..........41e
يجب ألا يتجاوز حجم مفتاح HMAC الذي تم إنشاؤه حجم الكتلة لدالة التجزئة الأساسية. راجع crypto.createHmac()
لمزيد من المعلومات.
crypto.generatePrime(size[, options[, callback]])
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v18.0.0 | تمرير دالة رد نداء غير صالحة إلى الوسيطة callback يطرح الآن ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK . |
v15.8.0 | تمت الإضافة في: الإصدار 15.8.0 |
size
<number> حجم (بالبتات) العدد الأولي المراد إنشاؤه.options
<Object>add
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>rem
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>safe
<boolean> افتراضي:false
.bigint
<boolean> عندما تكونtrue
، يتم إرجاع العدد الأولي الذي تم إنشاؤه كـbigint
.
callback
<Function>err
<Error>prime
<ArrayBuffer> | <bigint>
ينشئ عددًا أوليًا شبه عشوائي بحجم size
بت.
إذا كانت options.safe
هي true
، فسيكون العدد الأولي عددًا أوليًا آمنًا - أي أن (prime - 1) / 2
سيكون أيضًا عددًا أوليًا.
يمكن استخدام المعلمات options.add
و options.rem
لفرض متطلبات إضافية، على سبيل المثال، لـ Diffie-Hellman:
- إذا تم تعيين كل من
options.add
وoptions.rem
، فسوف يفي العدد الأولي بالشرطprime % add = rem
. - إذا تم تعيين
options.add
فقط ولم تكنoptions.safe
هيtrue
، فسوف يفي العدد الأولي بالشرطprime % add = 1
. - إذا تم تعيين
options.add
فقط وتم تعيينoptions.safe
علىtrue
، فسوف يفي العدد الأولي بدلاً من ذلك بالشرطprime % add = 3
. هذا ضروري لأنprime % add = 1
لـoptions.add \> 2
سيتعارض مع الشرط الذي تفرضهoptions.safe
. - يتم تجاهل
options.rem
إذا لم يتم إعطاءoptions.add
.
يجب ترميز كل من options.add
و options.rem
كسلاسل كبيرة النهاية إذا تم إعطاؤهما كـ ArrayBuffer
أو SharedArrayBuffer
أو TypedArray
أو Buffer
أو DataView
.
بشكل افتراضي، يتم ترميز العدد الأولي كسلسلة كبيرة النهاية من الثمانيات في <ArrayBuffer>. إذا كان الخيار bigint
هو true
، فسيتم توفير <bigint>.
crypto.generatePrimeSync(size[, options])
تمت إضافتها في: v15.8.0
size
<number> حجم (بالبت) العدد الأولي المراد إنشاؤه.options
<Object>add
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>rem
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>safe
<boolean> افتراضي:false
.bigint
<boolean> عندما تكونtrue
، يتم إرجاع العدد الأولي الذي تم إنشاؤه كـbigint
.
الإرجاع: <ArrayBuffer> | <bigint>
يقوم بإنشاء عدد أولي شبه عشوائي بحجم size
من البتات.
إذا كانت options.safe
هي true
، فسيكون العدد الأولي آمنًا - أي أن (prime - 1) / 2
سيكون أيضًا عددًا أوليًا.
يمكن استخدام المعاملات options.add
و options.rem
لفرض متطلبات إضافية، على سبيل المثال، لـ Diffie-Hellman:
- إذا تم تعيين كل من
options.add
وoptions.rem
، فسوف يفي العدد الأولي بالشرطprime % add = rem
. - إذا تم تعيين
options.add
فقط وكانتoptions.safe
ليستtrue
، فسوف يفي العدد الأولي بالشرطprime % add = 1
. - إذا تم تعيين
options.add
فقط وتم تعيينoptions.safe
علىtrue
، فسوف يفي العدد الأولي بدلاً من ذلك بالشرطprime % add = 3
. هذا ضروري لأنprime % add = 1
لـoptions.add \> 2
سيتعارض مع الشرط الذي تفرضهoptions.safe
. - يتم تجاهل
options.rem
إذا لم يتم إعطاءoptions.add
.
يجب ترميز كل من options.add
و options.rem
كتسلسلات كبيرة النهاية إذا تم إعطاؤها كـ ArrayBuffer
أو SharedArrayBuffer
أو TypedArray
أو Buffer
أو DataView
.
بشكل افتراضي، يتم ترميز العدد الأولي كتسلسل كبير النهاية من الثمانيات في <ArrayBuffer>. إذا كان خيار bigint
هو true
، فسيتم توفير <bigint>.
crypto.getCipherInfo(nameOrNid[, options])
تمت إضافته في: v15.0.0
nameOrNid
: <string> | <number> اسم أو معرف التشفير المراد الاستعلام عنه.options
: <Object>Returns: <Object>
name
<string> اسم التشفيرnid
<number> معرف التشفيرblockSize
<number> حجم كتلة التشفير بالبايت. يتم حذف هذه الخاصية عندما يكونmode
هو'stream'
.ivLength
<number> الطول المتوقع أو الافتراضي لمتجه التهيئة بالبايت. يتم حذف هذه الخاصية إذا لم يستخدم التشفير متجه تهيئة.keyLength
<number> الطول المتوقع أو الافتراضي للمفتاح بالبايت.mode
<string> وضع التشفير. أحد'cbc'
أو'ccm'
أو'cfb'
أو'ctr'
أو'ecb'
أو'gcm'
أو'ocb'
أو'ofb'
أو'stream'
أو'wrap'
أو'xts'
.
إرجاع معلومات حول تشفير معين.
تقبل بعض التشفيرات مفاتيح ومتجهات تهيئة متغيرة الطول. بشكل افتراضي، ستُرجع طريقة crypto.getCipherInfo()
القيم الافتراضية لهذه التشفيرات. لاختبار ما إذا كان طول مفتاح أو طول متجه تهيئة معين مقبولًا لتشفير معين، استخدم الخيارات keyLength
و ivLength
. إذا كانت القيم المعطاة غير مقبولة، فسيتم إرجاع undefined
.
crypto.getCiphers()
تمت الإضافة في: v0.9.3
- الإرجاع: <string[]> مصفوفة تحتوي على أسماء خوارزميات التشفير المدعومة.
const {
getCiphers,
} = await import('node:crypto');
console.log(getCiphers()); // ['aes-128-cbc', 'aes-128-ccm', ...]
const {
getCiphers,
} = require('node:crypto');
console.log(getCiphers()); // ['aes-128-cbc', 'aes-128-ccm', ...]
crypto.getCurves()
تمت الإضافة في: v2.3.0
- الإرجاع: <string[]> مصفوفة تحتوي على أسماء المنحنيات الإهليلجية المدعومة.
const {
getCurves,
} = await import('node:crypto');
console.log(getCurves()); // ['Oakley-EC2N-3', 'Oakley-EC2N-4', ...]
const {
getCurves,
} = require('node:crypto');
console.log(getCurves()); // ['Oakley-EC2N-3', 'Oakley-EC2N-4', ...]
crypto.getDiffieHellman(groupName)
تمت الإضافة في: v0.7.5
groupName
<string>- الإرجاع: <DiffieHellmanGroup>
يقوم بإنشاء كائن تبادل مفاتيح DiffieHellmanGroup
محدد مسبقًا. يتم سرد المجموعات المدعومة في الوثائق الخاصة بـ DiffieHellmanGroup
.
يحاكي الكائن الذي تم إرجاعه واجهة الكائنات التي تم إنشاؤها بواسطة crypto.createDiffieHellman()
، ولكنه لن يسمح بتغيير المفاتيح (باستخدام diffieHellman.setPublicKey()
، على سبيل المثال). ميزة استخدام هذه الطريقة هي أن الأطراف ليسوا مضطرين إلى إنشاء أو تبادل معامل المجموعة مسبقًا، مما يوفر وقت المعالج ووقت الاتصال.
مثال (الحصول على سر مشترك):
const {
getDiffieHellman,
} = await import('node:crypto');
const alice = getDiffieHellman('modp14');
const bob = getDiffieHellman('modp14');
alice.generateKeys();
bob.generateKeys();
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');
/* aliceSecret and bobSecret should be the same */
console.log(aliceSecret === bobSecret);
const {
getDiffieHellman,
} = require('node:crypto');
const alice = getDiffieHellman('modp14');
const bob = getDiffieHellman('modp14');
alice.generateKeys();
bob.generateKeys();
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');
/* aliceSecret and bobSecret should be the same */
console.log(aliceSecret === bobSecret);
crypto.getFips()
أُضيف في: v10.0.0
- الإرجاع: <number>
1
إذا وفقط إذا كان مُزوِّد التشفير المتوافق مع معيار FIPS قيد الاستخدام حاليًا، و0
خلاف ذلك. قد يؤدي إصدار رئيسي semver مستقبلي إلى تغيير نوع الإرجاع لواجهة برمجة التطبيقات هذه إلى <boolean>.
crypto.getHashes()
أُضيف في: v0.9.3
- الإرجاع: <string[]> مصفوفة بأسماء خوارزميات التجزئة المدعومة، مثل
'RSA-SHA256'
. تُسمى خوارزميات التجزئة أيضًا خوارزميات "التلخيص".
const {
getHashes,
} = await import('node:crypto');
console.log(getHashes()); // ['DSA', 'DSA-SHA', 'DSA-SHA1', ...]
const {
getHashes,
} = require('node:crypto');
console.log(getHashes()); // ['DSA', 'DSA-SHA', 'DSA-SHA1', ...]
crypto.getRandomValues(typedArray)
أُضيف في: v17.4.0
typedArray
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer>- الإرجاع: <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> تُرجع
typedArray
.
اسم مستعار مناسب لـ crypto.webcrypto.getRandomValues()
. هذا التنفيذ غير متوافق مع مواصفات Web Crypto، لكتابة كود متوافق مع الويب، استخدم crypto.webcrypto.getRandomValues()
بدلاً من ذلك.
crypto.hash(algorithm, data[, outputEncoding])
تمت الإضافة في: v21.7.0, v20.12.0
[مستقر: 1 - تجريبي]
مستقر: 1 الاستقرار: 1.2 - مرشح للإصدار
algorithm
<string> | <undefined>data
<string> | <Buffer> | <TypedArray> | <DataView> عندما تكونdata
سلسلة، سيتم ترميزها كـ UTF-8 قبل تجزئتها. إذا كانت هناك حاجة إلى ترميز إدخال مختلف لسلسلة الإدخال، يمكن للمستخدم ترميز السلسلة فيTypedArray
باستخدامTextEncoder
أوBuffer.from()
وتمريرTypedArray
المشفر إلى واجهة برمجة التطبيقات هذه بدلاً من ذلك.outputEncoding
<string> | <undefined> ترميز يستخدم لترميز الملخص الذي تم إرجاعه. الافتراضي:'hex'
.- الإرجاع: <string> | <Buffer>
أداة لإنشاء ملخصات تجزئة لمرة واحدة للبيانات. يمكن أن تكون أسرع من crypto.createHash()
المستندة إلى الكائنات عند تجزئة كمية أصغر من البيانات (<= 5 ميجابايت) المتوفرة بسهولة. إذا كانت البيانات كبيرة أو إذا تم بثها، فلا يزال يوصى باستخدام crypto.createHash()
بدلاً من ذلك.
تعتمد algorithm
على الخوارزميات المتاحة التي تدعمها نسخة OpenSSL على المنصة. الأمثلة هي 'sha256'
و 'sha512'
وما إلى ذلك. في الإصدارات الحديثة من OpenSSL، ستقوم openssl list -digest-algorithms
بعرض خوارزميات التجزئة المتاحة.
مثال:
const crypto = require('node:crypto');
const { Buffer } = require('node:buffer');
// تجزئة سلسلة وإرجاع النتيجة كسلسلة مرمزة بنظام hex.
const string = 'Node.js';
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string));
// ترميز سلسلة مرمزة بنظام base64 في Buffer وتجزئتها وإرجاع
// النتيجة كـ buffer.
const base64 = 'Tm9kZS5qcw==';
// <Buffer 10 b3 49 32 87 f8 31 e8 1a 43 88 11 a1 ff ba 01 f8 ce c4 b7>
console.log(crypto.hash('sha1', Buffer.from(base64, 'base64'), 'buffer'));
import crypto from 'node:crypto';
import { Buffer } from 'node:buffer';
// تجزئة سلسلة وإرجاع النتيجة كسلسلة مرمزة بنظام hex.
const string = 'Node.js';
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string));
// ترميز سلسلة مرمزة بنظام base64 في Buffer وتجزئتها وإرجاع
// النتيجة كـ buffer.
const base64 = 'Tm9kZS5qcw==';
// <Buffer 10 b3 49 32 87 f8 31 e8 1a 43 88 11 a1 ff ba 01 f8 ce c4 b7>
console.log(crypto.hash('sha1', Buffer.from(base64, 'base64'), 'buffer'));
crypto.hkdf(digest, ikm, salt, info, keylen, callback)
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | يؤدي تمرير رد اتصال غير صالح إلى وسيطة callback الآن إلى طرح ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK . |
v18.8.0, v16.18.0 | يمكن أن تكون مادة التأشير المدخلة الآن ذات طول صفري. |
v15.0.0 | تمت إضافته في: v15.0.0 |
digest
<string> خوارزمية الملخص المراد استخدامها.ikm
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> مادة التأشير المدخلة. يجب توفيرها ولكن يمكن أن تكون ذات طول صفري.salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> قيمة الملح. يجب توفيرها ولكن يمكن أن تكون ذات طول صفري.info
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> قيمة معلومات إضافية. يجب توفيرها ولكن يمكن أن تكون ذات طول صفري، ولا يمكن أن يزيد حجمها عن 1024 بايت.keylen
<number> طول المفتاح المراد إنشاؤه. يجب أن يكون أكبر من 0. القيمة القصوى المسموح بها هي255
ضعف عدد البايتات التي تنتجها وظيفة الملخص المحددة (على سبيل المثال،sha512
تنتج تجزئات 64 بايت، مما يجعل الحد الأقصى لإخراج HKDF هو 16320 بايت).callback
<Function>err
<Error>derivedKey
<ArrayBuffer>
HKDF هي دالة اشتقاق مفتاح بسيطة معرفة في RFC 5869. يتم استخدام ikm
و salt
و info
المعطاة مع digest
لاشتقاق مفتاح بطول keylen
بايت.
يتم استدعاء دالة callback
المتوفرة مع وسيطتين: err
و derivedKey
. إذا حدث خطأ أثناء اشتقاق المفتاح، فسيتم تعيين err
؛ وإلا سيكون err
هو null
. سيتم تمرير derivedKey
الذي تم إنشاؤه بنجاح إلى رد الاتصال كـ <ArrayBuffer>. سيتم طرح خطأ إذا كانت أي من وسيطات الإدخال تحدد قيمًا أو أنواعًا غير صالحة.
import { Buffer } from 'node:buffer';
const {
hkdf,
} = await import('node:crypto');
hkdf('sha512', 'key', 'salt', 'info', 64, (err, derivedKey) => {
if (err) throw err;
console.log(Buffer.from(derivedKey).toString('hex')); // '24156e2...5391653'
});
const {
hkdf,
} = require('node:crypto');
const { Buffer } = require('node:buffer');
hkdf('sha512', 'key', 'salt', 'info', 64, (err, derivedKey) => {
if (err) throw err;
console.log(Buffer.from(derivedKey).toString('hex')); // '24156e2...5391653'
});
crypto.hkdfSync(digest, ikm, salt, info, keylen)
[السجل]
الإصدار | التغييرات |
---|---|
v18.8.0, v16.18.0 | يمكن أن تكون مادة مفتاح الإدخال الآن ذات طول صفري. |
v15.0.0 | تمت الإضافة في: v15.0.0 |
digest
<string> خوارزمية التلخيص المراد استخدامها.ikm
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> مادة مفتاح الإدخال. يجب توفيرها ولكن يمكن أن يكون طولها صفريًا.salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> قيمة الملح. يجب توفيرها ولكن يمكن أن يكون طولها صفريًا.info
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> قيمة معلومات إضافية. يجب توفيرها ولكن يمكن أن يكون طولها صفريًا، ولا يمكن أن يزيد عن 1024 بايت.keylen
<number> طول المفتاح المراد إنشاؤه. يجب أن يكون أكبر من 0. القيمة القصوى المسموح بها هي255
ضعف عدد البايتات التي تنتجها وظيفة التلخيص المحددة (على سبيل المثال،sha512
ينتج خلاصات بحجم 64 بايت، مما يجعل أقصى إخراج HKDF هو 16320 بايت).- Returns: <ArrayBuffer>
يوفر وظيفة اشتقاق مفتاح HKDF متزامنة كما هو محدد في RFC 5869. يتم استخدام ikm
و salt
و info
المحدد مع digest
لاشتقاق مفتاح بطول keylen
بايت.
سيتم إرجاع derivedKey
الذي تم إنشاؤه بنجاح كـ <ArrayBuffer>.
سيتم طرح خطأ إذا كانت أي من وسيطات الإدخال تحدد قيمًا أو أنواعًا غير صالحة، أو إذا تعذر إنشاء المفتاح المشتق.
import { Buffer } from 'node:buffer';
const {
hkdfSync,
} = await import('node:crypto');
const derivedKey = hkdfSync('sha512', 'key', 'salt', 'info', 64);
console.log(Buffer.from(derivedKey).toString('hex')); // '24156e2...5391653'
const {
hkdfSync,
} = require('node:crypto');
const { Buffer } = require('node:buffer');
const derivedKey = hkdfSync('sha512', 'key', 'salt', 'info', 64);
console.log(Buffer.from(derivedKey).toString('hex')); // '24156e2...5391653'
crypto.pbkdf2(password, salt, iterations, keylen, digest, callback)
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | تمرير دالة رد نداء غير صالحة إلى وسيطة callback الآن يطرح ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK . |
v15.0.0 | يمكن أن تكون وسيطات كلمة المرور والملح أيضًا مثيلات ArrayBuffer. |
v14.0.0 | يتم الآن تقييد معلمة iterations بالقيم الموجبة. كانت الإصدارات السابقة تعامل القيم الأخرى على أنها واحدة. |
v8.0.0 | معلمة digest مطلوبة دائمًا الآن. |
v6.0.0 | استدعاء هذه الدالة بدون تمرير معلمة digest مهمل الآن وسيصدر تحذيرًا. |
v6.0.0 | الترميز الافتراضي لـ password إذا كان سلسلة قد تغير من binary إلى utf8 . |
v0.5.5 | تمت الإضافة في: v0.5.5 |
password
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>iterations
<number>keylen
<number>digest
<string>callback
<Function>
يوفر تطبيقًا غير متزامن لوظيفة اشتقاق المفتاح المستندة إلى كلمة المرور 2 (PBKDF2). يتم تطبيق خوارزمية تجزئة HMAC محددة بواسطة digest
لاشتقاق مفتاح بطول البايت المطلوب (keylen
) من password
و salt
و iterations
.
يتم استدعاء دالة callback
المتوفرة بوسيطتين: err
و derivedKey
. إذا حدث خطأ أثناء اشتقاق المفتاح، فسيتم تعيين err
؛ وإلا فسيكون err
هو null
. بشكل افتراضي، سيتم تمرير derivedKey
الذي تم إنشاؤه بنجاح إلى رد النداء كـ Buffer
. سيتم طرح خطأ إذا كانت أي من وسيطات الإدخال تحدد قيمًا أو أنواعًا غير صالحة.
يجب أن تكون وسيطة iterations
رقمًا يتم تعيينه بأعلى قدر ممكن. كلما زاد عدد التكرارات، زاد أمان المفتاح المشتق، ولكنه سيستغرق وقتًا أطول لإكماله.
يجب أن يكون salt
فريدًا قدر الإمكان. يوصى بأن يكون الملح عشوائيًا وطوله 16 بايتًا على الأقل. راجع NIST SP 800-132 للحصول على التفاصيل.
عند تمرير سلاسل لـ password
أو salt
، يرجى مراعاة المحاذير عند استخدام السلاسل كمدخلات لواجهات برمجة التطبيقات المشفرة.
const {
pbkdf2,
} = await import('node:crypto');
pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae'
});
const {
pbkdf2,
} = require('node:crypto');
pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae'
});
يمكن استرداد مصفوفة من وظائف التجزئة المدعومة باستخدام crypto.getHashes()
.
تستخدم واجهة برمجة التطبيقات هذه مجموعة مؤشرات الترابط الخاصة بـ libuv، والتي يمكن أن يكون لها آثار أداء مفاجئة وسلبية على بعض التطبيقات؛ راجع وثائق UV_THREADPOOL_SIZE
لمزيد من المعلومات.
crypto.pbkdf2Sync(password, salt, iterations, keylen, digest)
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v14.0.0 | تم تقييد المعامل iterations الآن بالقيم الموجبة. الإصدارات السابقة تعاملت مع القيم الأخرى على أنها واحد. |
v6.0.0 | استدعاء هذه الدالة بدون تمرير المعامل digest مهمل الآن وسيصدر تحذيرًا. |
v6.0.0 | الترميز الافتراضي لـ password إذا كان سلسلة نصية تغير من binary إلى utf8 . |
v0.9.3 | تمت الإضافة في: v0.9.3 |
password
<string> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <Buffer> | <TypedArray> | <DataView>iterations
<number>keylen
<number>digest
<string>- الإرجاع: <Buffer>
توفر تطبيقًا متزامنًا لوظيفة اشتقاق المفتاح المستندة إلى كلمة المرور 2 (PBKDF2). يتم تطبيق خوارزمية تجزئة HMAC محددة بواسطة digest
لاشتقاق مفتاح بطول البايت المطلوب (keylen
) من password
و salt
و iterations
.
إذا حدث خطأ، فسيتم طرح Error
، وإلا سيتم إرجاع المفتاح المشتق كـ Buffer
.
يجب أن يكون الوسيطة iterations
رقمًا يتم تعيينه بأعلى قيمة ممكنة. كلما زاد عدد التكرارات، زاد أمان المفتاح المشتق، ولكنه سيستغرق وقتًا أطول لإكماله.
يجب أن يكون salt
فريدًا قدر الإمكان. يوصى بأن يكون الملح عشوائيًا وطوله 16 بايت على الأقل. انظر NIST SP 800-132 للحصول على التفاصيل.
عند تمرير سلاسل نصية لـ password
أو salt
، يرجى مراعاة المحاذير عند استخدام السلاسل النصية كمدخلات إلى واجهات برمجة تطبيقات التشفير.
const {
pbkdf2Sync,
} = await import('node:crypto');
const key = pbkdf2Sync('secret', 'salt', 100000, 64, 'sha512');
console.log(key.toString('hex')); // '3745e48...08d59ae'
const {
pbkdf2Sync,
} = require('node:crypto');
const key = pbkdf2Sync('secret', 'salt', 100000, 64, 'sha512');
console.log(key.toString('hex')); // '3745e48...08d59ae'
يمكن استرداد مجموعة من دوال التجزئة المدعومة باستخدام crypto.getHashes()
.
crypto.privateDecrypt(privateKey, buffer)
[السجل]
الإصدار | التغييرات |
---|---|
v21.6.2, v20.11.1, v18.19.1 | تم تعطيل الحشو RSA_PKCS1_PADDING ما لم يكن إصدار OpenSSL يدعم الرفض الضمني. |
v15.0.0 | تمت إضافة string و ArrayBuffer و CryptoKey كأنواع مفاتيح مسموح بها. يمكن أن يكون oaepLabel عبارة عن ArrayBuffer. يمكن أن يكون المخزن المؤقت عبارة عن string أو ArrayBuffer. جميع الأنواع التي تقبل المخازن المؤقتة تقتصر على حد أقصى 2 ** 31 - 1 بايت. |
v12.11.0 | تمت إضافة خيار oaepLabel . |
v12.9.0 | تمت إضافة خيار oaepHash . |
v11.6.0 | تدعم هذه الوظيفة الآن كائنات المفاتيح. |
v0.11.14 | تمت إضافتها في: v0.11.14 |
privateKey
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>oaepHash
<string> دالة التجزئة المراد استخدامها لـ OAEP padding و MGF1. افتراضي:'sha1'
oaepLabel
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> العلامة المراد استخدامها لـ OAEP padding. إذا لم يتم تحديدها، فلن يتم استخدام أي علامة.padding
<crypto.constants> قيمة حشو اختيارية محددة فيcrypto.constants
، والتي قد تكون:crypto.constants.RSA_NO_PADDING
أوcrypto.constants.RSA_PKCS1_PADDING
أوcrypto.constants.RSA_PKCS1_OAEP_PADDING
.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Returns: <Buffer>
Buffer
جديد مع المحتوى الذي تم فك تشفيره.
يفك تشفير buffer
باستخدام privateKey
. تم تشفير buffer
مسبقًا باستخدام المفتاح العام المقابل، على سبيل المثال باستخدام crypto.publicEncrypt()
.
إذا لم يكن privateKey
عبارة عن KeyObject
، فإن هذه الوظيفة تتصرف كما لو تم تمرير privateKey
إلى crypto.createPrivateKey()
. إذا كان كائنًا، فيمكن تمرير الخاصية padding
. بخلاف ذلك، تستخدم هذه الوظيفة RSA_PKCS1_OAEP_PADDING
.
يتطلب استخدام crypto.constants.RSA_PKCS1_PADDING
في crypto.privateDecrypt()
أن يدعم OpenSSL الرفض الضمني (rsa_pkcs1_implicit_rejection
). إذا كان إصدار OpenSSL الذي تستخدمه Node.js لا يدعم هذه الميزة، فستفشل محاولة استخدام RSA_PKCS1_PADDING
.
crypto.privateEncrypt(privateKey, buffer)
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | تمت إضافة السلسلة و ArrayBuffer و CryptoKey كأنواع مفاتيح مسموح بها. يمكن أن تكون عبارة المرور ArrayBuffer. يمكن أن يكون المخزن المؤقت سلسلة أو ArrayBuffer. تقتصر جميع الأنواع التي تقبل المخازن المؤقتة على 2 ** 31 - 1 بايت كحد أقصى. |
v11.6.0 | تدعم هذه الدالة الآن كائنات المفاتيح. |
v1.1.0 | تمت إضافتها في: v1.1.0 |
privateKey
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey> مفتاح خاص مشفر بـ PEM.passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> عبارة مرور اختيارية للمفتاح الخاص.padding
<crypto.constants> قيمة حشو اختيارية محددة فيcrypto.constants
، والتي قد تكون:crypto.constants.RSA_NO_PADDING
أوcrypto.constants.RSA_PKCS1_PADDING
.encoding
<string> ترميز السلسلة المراد استخدامه عندما تكونbuffer
أوkey
أوpassphrase
سلاسل.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Returns: <Buffer>
Buffer
جديد مع المحتوى المشفر.
يقوم بتشفير buffer
باستخدام privateKey
. يمكن فك تشفير البيانات التي تم إرجاعها باستخدام المفتاح العام المقابل، على سبيل المثال باستخدام crypto.publicDecrypt()
.
إذا لم يكن privateKey
عبارة عن KeyObject
، فإن هذه الدالة تتصرف كما لو تم تمرير privateKey
إلى crypto.createPrivateKey()
. إذا كان كائنًا، فيمكن تمرير خاصية padding
. بخلاف ذلك، تستخدم هذه الدالة RSA_PKCS1_PADDING
.
crypto.publicDecrypt(key, buffer)
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
الإصدار 15.0.0 | تمت إضافة السلسلة، و ArrayBuffer، و CryptoKey كأنواع مفاتيح مسموح بها. يمكن أن تكون عبارة المرور ArrayBuffer. يمكن أن تكون المخزن المؤقت سلسلة أو ArrayBuffer. تقتصر جميع الأنواع التي تقبل المخازن المؤقتة على حد أقصى يبلغ 2 ** 31 - 1 بايت. |
الإصدار 11.6.0 | تدعم هذه الوظيفة الآن كائنات المفاتيح. |
الإصدار 1.1.0 | تمت الإضافة في: الإصدار 1.1.0 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> عبارة مرور اختيارية للمفتاح الخاص.padding
<crypto.constants> قيمة حشو اختيارية محددة فيcrypto.constants
، والتي قد تكون:crypto.constants.RSA_NO_PADDING
أوcrypto.constants.RSA_PKCS1_PADDING
.encoding
<string> ترميز السلسلة المراد استخدامه عندما تكونbuffer
أوkey
أوpassphrase
عبارة عن سلاسل.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Returns: <Buffer>
Buffer
جديد بالمحتوى الذي تم فك تشفيره.
يفك تشفير buffer
باستخدام key
. تم تشفير buffer
مسبقًا باستخدام المفتاح الخاص المقابل، على سبيل المثال باستخدام crypto.privateEncrypt()
.
إذا لم يكن key
هو KeyObject
، فإن هذه الوظيفة تتصرف كما لو تم تمرير key
إلى crypto.createPublicKey()
. إذا كان كائنًا، فيمكن تمرير خاصية padding
. بخلاف ذلك، تستخدم هذه الوظيفة RSA_PKCS1_PADDING
.
نظرًا لأنه يمكن اشتقاق المفاتيح العمومية RSA من المفاتيح الخاصة، فيمكن تمرير مفتاح خاص بدلاً من المفتاح العام.
crypto.publicEncrypt(key, buffer)
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | تمت إضافة السلسلة و ArrayBuffer و CryptoKey كأنواع مفاتيح مسموح بها. يمكن أن يكون oaepLabel و passphrase من النوع ArrayBuffers. يمكن أن يكون المخزن المؤقت سلسلة أو ArrayBuffer. تقتصر جميع الأنواع التي تقبل المخازن المؤقتة على 2 ** 31 - 1 بايت كحد أقصى. |
v12.11.0 | تمت إضافة خيار oaepLabel . |
v12.9.0 | تمت إضافة خيار oaepHash . |
v11.6.0 | تدعم هذه الدالة الآن كائنات المفاتيح. |
v0.11.14 | تمت إضافتها في: v0.11.14 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey> مفتاح عام أو خاص مشفر بتنسيق PEM، أو <KeyObject>، أو <CryptoKey>.oaepHash
<string> دالة التجزئة لاستخدامها لحشو OAEP و MGF1. الافتراضي:'sha1'
oaepLabel
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> التسمية المراد استخدامها لحشو OAEP. إذا لم يتم تحديدها، فلن يتم استخدام أي تسمية.passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> عبارة مرور اختيارية للمفتاح الخاص.padding
<crypto.constants> قيمة حشو اختيارية محددة فيcrypto.constants
، والتي قد تكون:crypto.constants.RSA_NO_PADDING
أوcrypto.constants.RSA_PKCS1_PADDING
أوcrypto.constants.RSA_PKCS1_OAEP_PADDING
.encoding
<string> ترميز السلسلة المراد استخدامه عندما تكونbuffer
أوkey
أوoaepLabel
أوpassphrase
سلاسل.
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>Returns: <Buffer>
Buffer
جديد يحتوي على المحتوى المشفر.
يقوم بتشفير محتوى buffer
باستخدام key
ويعيد Buffer
جديدًا يحتوي على المحتوى المشفر. يمكن فك تشفير البيانات التي تم إرجاعها باستخدام المفتاح الخاص المقابل، على سبيل المثال باستخدام crypto.privateDecrypt()
.
إذا لم يكن key
من النوع KeyObject
، فإن هذه الدالة تتصرف كما لو تم تمرير key
إلى crypto.createPublicKey()
. إذا كان كائنًا، فيمكن تمرير الخاصية padding
. وإلا، فإن هذه الدالة تستخدم RSA_PKCS1_OAEP_PADDING
.
نظرًا لأنه يمكن اشتقاق المفاتيح العامة RSA من المفاتيح الخاصة، فيمكن تمرير مفتاح خاص بدلاً من مفتاح عام.
crypto.randomBytes(size[, callback])
[التاريخ]
الإصدار | التغييرات |
---|---|
v18.0.0 | تمرير دالة رد نداء غير صالحة إلى وسيط callback سيؤدي الآن إلى طرح ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK . |
v9.0.0 | تمرير null كوسيط callback سيؤدي الآن إلى طرح ERR_INVALID_CALLBACK . |
v0.5.8 | تمت إضافته في: v0.5.8 |
size
<number> عدد البايتات التي سيتم إنشاؤها. يجب ألا يكونsize
أكبر من2**31 - 1
.callback
<Function>الإرجاع: <Buffer> إذا لم يتم توفير دالة
callback
.
يولد بيانات عشوائية زائفة قوية مشفرة. الوسيط size
هو رقم يشير إلى عدد البايتات التي سيتم إنشاؤها.
إذا تم توفير دالة callback
، فسيتم إنشاء البايتات بشكل غير متزامن وسيتم استدعاء دالة callback
بوسيطين: err
و buf
. إذا حدث خطأ، فسيكون err
كائن Error
؛ وإلا فإنه سيكون null
. الوسيط buf
هو Buffer
يحتوي على البايتات التي تم إنشاؤها.
// غير متزامن
const {
randomBytes,
} = await import('node:crypto');
randomBytes(256, (err, buf) => {
if (err) throw err;
console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`);
});
// غير متزامن
const {
randomBytes,
} = require('node:crypto');
randomBytes(256, (err, buf) => {
if (err) throw err;
console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`);
});
إذا لم يتم توفير دالة callback
، فسيتم إنشاء البايتات العشوائية بشكل متزامن وإرجاعها كـ Buffer
. سيتم طرح خطأ إذا كانت هناك مشكلة في إنشاء البايتات.
// متزامن
const {
randomBytes,
} = await import('node:crypto');
const buf = randomBytes(256);
console.log(
`${buf.length} bytes of random data: ${buf.toString('hex')}`);
// متزامن
const {
randomBytes,
} = require('node:crypto');
const buf = randomBytes(256);
console.log(
`${buf.length} bytes of random data: ${buf.toString('hex')}`);
لن تكتمل طريقة crypto.randomBytes()
حتى تتوفر إنتروبيا كافية. هذا عادة لا يستغرق أكثر من بضعة أجزاء من الثانية. الوقت الوحيد الذي قد يستغرق فيه إنشاء البايتات العشوائية فترة أطول هو مباشرة بعد التشغيل، عندما يكون النظام بأكمله لا يزال يعاني من نقص في الإنتروبيا.
يستخدم هذا الـ API مجمع سلاسل عمليات libuv، والذي قد يكون له آثار أداء مفاجئة وسلبية على بعض التطبيقات؛ راجع وثائق UV_THREADPOOL_SIZE
لمزيد من المعلومات.
يتم تنفيذ النسخة غير المتزامنة من crypto.randomBytes()
في طلب واحد لمجمع سلاسل العمليات. لتقليل الاختلاف في طول مهام مجمع سلاسل العمليات، قم بتقسيم طلبات randomBytes
الكبيرة عند القيام بذلك كجزء من تلبية طلب العميل.
crypto.randomFill(buffer[, offset][, size], callback)
[السجل]
الإصدار | التغييرات |
---|---|
الإصدار v18.0.0 | يؤدي تمرير دالة رد اتصال غير صالحة إلى وسيطة callback الآن إلى ظهور ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK . |
الإصدار v9.0.0 | يمكن أن تكون وسيطة buffer أي TypedArray أو DataView . |
الإصدار v7.10.0, v6.13.0 | تمت إضافته في: v7.10.0, v6.13.0 |
buffer
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> يجب توفيره. يجب ألا يتجاوز حجمbuffer
المقدم2**31 - 1
.offset
<number> الافتراضي:0
size
<number> الافتراضي:buffer.length - offset
. يجب ألا يتجاوزsize
القيمة2**31 - 1
.callback
<Function>function(err, buf) {}
.
تشبه هذه الدالة crypto.randomBytes()
ولكنها تتطلب أن تكون الوسيطة الأولى Buffer
سيتم ملؤها. كما أنها تتطلب تمرير دالة رد اتصال.
إذا لم يتم توفير دالة callback
، فسيتم طرح خطأ.
import { Buffer } from 'node:buffer';
const { randomFill } = await import('node:crypto');
const buf = Buffer.alloc(10);
randomFill(buf, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
randomFill(buf, 5, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
// The above is equivalent to the following:
randomFill(buf, 5, 5, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
const { randomFill } = require('node:crypto');
const { Buffer } = require('node:buffer');
const buf = Buffer.alloc(10);
randomFill(buf, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
randomFill(buf, 5, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
// The above is equivalent to the following:
randomFill(buf, 5, 5, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
يمكن تمرير أي مثيل ArrayBuffer
أو TypedArray
أو DataView
كـ buffer
.
في حين أن هذا يتضمن مثيلات Float32Array
و Float64Array
، يجب عدم استخدام هذه الدالة لإنشاء أرقام عشوائية ذات فاصلة عائمة. قد تحتوي النتيجة على +Infinity
و -Infinity
و NaN
، وحتى إذا كانت المصفوفة تحتوي على أرقام محدودة فقط، فإنها لا يتم سحبها من توزيع عشوائي موحد وليس لها حدود دنيا أو عليا ذات معنى.
import { Buffer } from 'node:buffer';
const { randomFill } = await import('node:crypto');
const a = new Uint32Array(10);
randomFill(a, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
.toString('hex'));
});
const b = new DataView(new ArrayBuffer(10));
randomFill(b, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
.toString('hex'));
});
const c = new ArrayBuffer(10);
randomFill(c, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf).toString('hex'));
});
const { randomFill } = require('node:crypto');
const { Buffer } = require('node:buffer');
const a = new Uint32Array(10);
randomFill(a, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
.toString('hex'));
});
const b = new DataView(new ArrayBuffer(10));
randomFill(b, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
.toString('hex'));
});
const c = new ArrayBuffer(10);
randomFill(c, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf).toString('hex'));
});
تستخدم واجهة برمجة التطبيقات هذه تجمع مؤشرات ترابط libuv، والتي يمكن أن يكون لها آثار أداء مفاجئة وسلبية على بعض التطبيقات؛ راجع وثائق UV_THREADPOOL_SIZE
لمزيد من المعلومات.
يتم تنفيذ الإصدار غير المتزامن من crypto.randomFill()
في طلب واحد لمجمع مؤشرات الترابط. لتقليل التباين في طول مهمة تجمع مؤشرات الترابط، قم بتقسيم طلبات randomFill
الكبيرة عند القيام بذلك كجزء من تلبية طلب العميل.
crypto.randomFillSync(buffer[, offset][, size])
[السجل]
الإصدار | التغييرات |
---|---|
v9.0.0 | يمكن أن تكون الوسيطة buffer أي TypedArray أو DataView . |
v7.10.0, v6.13.0 | تمت الإضافة في: v7.10.0, v6.13.0 |
buffer
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> يجب توفيره. يجب ألا يتجاوز حجمbuffer
المتوفر2**31 - 1
.offset
<number> افتراضي:0
size
<number> افتراضي:buffer.length - offset
. يجب ألا يتجاوزsize
قيمة2**31 - 1
.- الإرجاع: <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> الكائن الذي تم تمريره كوسيطة
buffer
.
نسخة متزامنة من crypto.randomFill()
.
import { Buffer } from 'node:buffer';
const { randomFillSync } = await import('node:crypto');
const buf = Buffer.alloc(10);
console.log(randomFillSync(buf).toString('hex'));
randomFillSync(buf, 5);
console.log(buf.toString('hex'));
// The above is equivalent to the following:
randomFillSync(buf, 5, 5);
console.log(buf.toString('hex'));
const { randomFillSync } = require('node:crypto');
const { Buffer } = require('node:buffer');
const buf = Buffer.alloc(10);
console.log(randomFillSync(buf).toString('hex'));
randomFillSync(buf, 5);
console.log(buf.toString('hex'));
// The above is equivalent to the following:
randomFillSync(buf, 5, 5);
console.log(buf.toString('hex'));
يمكن تمرير أي مثيل ArrayBuffer
أو TypedArray
أو DataView
كوسيطة buffer
.
import { Buffer } from 'node:buffer';
const { randomFillSync } = await import('node:crypto');
const a = new Uint32Array(10);
console.log(Buffer.from(randomFillSync(a).buffer,
a.byteOffset, a.byteLength).toString('hex'));
const b = new DataView(new ArrayBuffer(10));
console.log(Buffer.from(randomFillSync(b).buffer,
b.byteOffset, b.byteLength).toString('hex'));
const c = new ArrayBuffer(10);
console.log(Buffer.from(randomFillSync(c)).toString('hex'));
const { randomFillSync } = require('node:crypto');
const { Buffer } = require('node:buffer');
const a = new Uint32Array(10);
console.log(Buffer.from(randomFillSync(a).buffer,
a.byteOffset, a.byteLength).toString('hex'));
const b = new DataView(new ArrayBuffer(10));
console.log(Buffer.from(randomFillSync(b).buffer,
b.byteOffset, b.byteLength).toString('hex'));
const c = new ArrayBuffer(10);
console.log(Buffer.from(randomFillSync(c)).toString('hex'));
crypto.randomInt([min, ]max[, callback])
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | تمرير استدعاء غير صالح إلى الوسيطة callback يطرح الآن ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK . |
v14.10.0, v12.19.0 | تمت إضافته في: v14.10.0, v12.19.0 |
min
<integer> بداية النطاق العشوائي (شاملة). الافتراضي:0
.max
<integer> نهاية النطاق العشوائي (غير شاملة).callback
<Function>function(err, n) {}
.
إرجاع عدد صحيح عشوائي n
بحيث يكون min \<= n \< max
. يتجنب هذا التنفيذ تحيز القسمة.
يجب أن يكون النطاق (max - min
) أقل من 2. يجب أن يكون min
و max
أعدادًا صحيحة آمنة.
إذا لم يتم توفير دالة callback
، يتم إنشاء العدد الصحيح العشوائي بشكل متزامن.
// غير متزامن
const {
randomInt,
} = await import('node:crypto');
randomInt(3, (err, n) => {
if (err) throw err;
console.log(`Random number chosen from (0, 1, 2): ${n}`);
});
// غير متزامن
const {
randomInt,
} = require('node:crypto');
randomInt(3, (err, n) => {
if (err) throw err;
console.log(`Random number chosen from (0, 1, 2): ${n}`);
});
// متزامن
const {
randomInt,
} = await import('node:crypto');
const n = randomInt(3);
console.log(`Random number chosen from (0, 1, 2): ${n}`);
// متزامن
const {
randomInt,
} = require('node:crypto');
const n = randomInt(3);
console.log(`Random number chosen from (0, 1, 2): ${n}`);
// مع الوسيطة `min`
const {
randomInt,
} = await import('node:crypto');
const n = randomInt(1, 7);
console.log(`The dice rolled: ${n}`);
// مع الوسيطة `min`
const {
randomInt,
} = require('node:crypto');
const n = randomInt(1, 7);
console.log(`The dice rolled: ${n}`);
crypto.randomUUID([options])
تمت الإضافة في: الإصدار v15.6.0، v14.17.0
options
<الكائن>disableEntropyCache
<بولياني> بشكل افتراضي، لتحسين الأداء، يقوم Node.js بإنشاء وتخزين بيانات عشوائية كافية لإنشاء ما يصل إلى 128 UUID عشوائي. لإنشاء UUID بدون استخدام ذاكرة التخزين المؤقت، قم بتعيينdisableEntropyCache
إلىtrue
. افتراضي:false
.
الإرجاع: <سلسلة نصية>
يُنشئ RFC 4122 RFC 4122 الإصدار 4 UUID عشوائي. يتم إنشاء UUID باستخدام مولد أرقام عشوائية زائفة مشفرة.
crypto.scrypt(password, salt, keylen[, options], callback)
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | يؤدي تمرير دالة استدعاء غير صالحة إلى وسيطة callback الآن إلى إطلاق ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK . |
v15.0.0 | يمكن أن تكون وسيطات كلمة المرور والملح أيضًا مثيلات ArrayBuffer. |
v12.8.0, v10.17.0 | يمكن أن تكون قيمة maxmem الآن أي عدد صحيح آمن. |
v10.9.0 | تمت إضافة أسماء الخيارات cost وblockSize وparallelization . |
v10.5.0 | تمت الإضافة في: v10.5.0 |
password
<سلسلة نصية> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>salt
<سلسلة نصية> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>keylen
<عدد>options
<الكائن>cost
<عدد> معلمة تكلفة وحدة المعالجة المركزية/الذاكرة. يجب أن يكون قوة للرقم اثنين أكبر من واحد. افتراضي:16384
.blockSize
<عدد> معلمة حجم الكتلة. افتراضي:8
.parallelization
<عدد> معلمة الموازاة. افتراضي:1
.N
<عدد> اسم بديل لـcost
. يمكن تحديد واحد فقط من الاثنين.r
<عدد> اسم بديل لـblockSize
. يمكن تحديد واحد فقط من الاثنين.p
<عدد> اسم بديل لـparallelization
. يمكن تحديد واحد فقط من الاثنين.maxmem
<عدد> الحد الأعلى للذاكرة. من الخطأ أن يكون (تقريبًا)128 * N * r > maxmem
. افتراضي:32 * 1024 * 1024
.
callback
<دالة>
يوفر تطبيق scrypt غير متزامن. Scrypt هي دالة اشتقاق مفتاح تعتمد على كلمة المرور وهي مصممة لتكون مكلفة حسابيًا ومن حيث الذاكرة من أجل جعل هجمات القوة الغاشمة غير مجدية.
يجب أن يكون salt
فريدًا قدر الإمكان. يوصى بأن يكون الملح عشوائيًا وطوله 16 بايت على الأقل. راجع NIST SP 800-132 للحصول على التفاصيل.
عند تمرير سلاسل نصية لـ password
أو salt
، يرجى مراعاة المحاذير عند استخدام السلاسل النصية كمدخلات لواجهات برمجة التطبيقات المشفرة.
يتم استدعاء دالة callback
مع وسيطتين: err
و derivedKey
. err
هو كائن استثناء عند فشل اشتقاق المفتاح، وإلا فإن err
هو null
. يتم تمرير derivedKey
إلى رد الاتصال كـ Buffer
.
يتم طرح استثناء عندما تحدد أي من وسيطات الإدخال قيمًا أو أنواعًا غير صالحة.
const {
scrypt,
} = await import('node:crypto');
// استخدام الإعدادات الافتراضية للمصنع.
scrypt('password', 'salt', 64, (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae'
});
// استخدام معلمة N مخصصة. يجب أن تكون قوة للرقم اثنين.
scrypt('password', 'salt', 64, { N: 1024 }, (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...aa39b34'
});
const {
scrypt,
} = require('node:crypto');
// استخدام الإعدادات الافتراضية للمصنع.
scrypt('password', 'salt', 64, (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae'
});
// استخدام معلمة N مخصصة. يجب أن تكون قوة للرقم اثنين.
scrypt('password', 'salt', 64, { N: 1024 }, (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...aa39b34'
});
crypto.scryptSync(password, salt, keylen[, options])
[السجل]
الإصدار | التغييرات |
---|---|
v12.8.0, v10.17.0 | يمكن أن تكون قيمة maxmem الآن أي عدد صحيح آمن. |
v10.9.0 | تمت إضافة أسماء الخيارات cost و blockSize و parallelization . |
v10.5.0 | أُضيف في: v10.5.0 |
password
<string> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <Buffer> | <TypedArray> | <DataView>keylen
<number>options
<Object>cost
<number> معامل تكلفة وحدة المعالجة المركزية (CPU)/الذاكرة. يجب أن يكون قوة للرقم اثنين أكبر من واحد. افتراضي:16384
.blockSize
<number> معامل حجم الكتلة. افتراضي:8
.parallelization
<number> معامل التوازي. افتراضي:1
.N
<number> اسم مستعار لـcost
. يمكن تحديد واحد فقط من الاثنين.r
<number> اسم مستعار لـblockSize
. يمكن تحديد واحد فقط من الاثنين.p
<number> اسم مستعار لـparallelization
. يمكن تحديد واحد فقط من الاثنين.maxmem
<number> الحد الأعلى للذاكرة. يعتبر خطأ عندما (تقريبًا)128 * N * r \> maxmem
. افتراضي:32 * 1024 * 1024
.
Returns: <Buffer>
يوفر تطبيق scrypt متزامن. Scrypt هي دالة اشتقاق مفتاح تعتمد على كلمة المرور ومصممة لتكون مكلفة حسابيًا وذاكرة من أجل جعل هجمات القوة الغاشمة غير مجدية.
يجب أن يكون salt
فريدًا قدر الإمكان. يوصى بأن يكون الملح عشوائيًا وطوله 16 بايتًا على الأقل. راجع NIST SP 800-132 للحصول على التفاصيل.
عند تمرير سلاسل نصية لـ password
أو salt
، يرجى مراعاة المحاذير عند استخدام السلاسل النصية كمدخلات إلى واجهات برمجة تطبيقات التشفير.
يتم طرح استثناء عند فشل اشتقاق المفتاح، وإلا يتم إرجاع المفتاح المشتق كـ Buffer
.
يتم طرح استثناء عندما تحدد أي من وسيطات الإدخال قيمًا أو أنواعًا غير صالحة.
const {
scryptSync,
} = await import('node:crypto');
// استخدام الإعدادات الافتراضية للمصنع.
const key1 = scryptSync('password', 'salt', 64);
console.log(key1.toString('hex')); // '3745e48...08d59ae'
// استخدام معلمة N مخصصة. يجب أن تكون قوة للرقم اثنين.
const key2 = scryptSync('password', 'salt', 64, { N: 1024 });
console.log(key2.toString('hex')); // '3745e48...aa39b34'
const {
scryptSync,
} = require('node:crypto');
// استخدام الإعدادات الافتراضية للمصنع.
const key1 = scryptSync('password', 'salt', 64);
console.log(key1.toString('hex')); // '3745e48...08d59ae'
// استخدام معلمة N مخصصة. يجب أن تكون قوة للرقم اثنين.
const key2 = scryptSync('password', 'salt', 64, { N: 1024 });
console.log(key2.toString('hex')); // '3745e48...aa39b34'
crypto.secureHeapUsed()
أُضيف في: v15.6.0
- القيمة المعادة: <Object>
total
<number> الحجم الكلي المخصص للكومة الآمنة كما هو محدد باستخدام علامة سطر الأوامر--secure-heap=n
.min
<number> الحد الأدنى للتخصيص من الكومة الآمنة كما هو محدد باستخدام علامة سطر الأوامر--secure-heap-min
.used
<number> العدد الإجمالي للبايتات المخصصة حاليًا من الكومة الآمنة.utilization
<number> النسبة المحسوبة لـused
إلىtotal
البايتات المخصصة.
crypto.setEngine(engine[, flags])
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v22.4.0, v20.16.0 | دعم المحركات المخصصة في OpenSSL 3 مهمل. |
v0.11.11 | أُضيف في: v0.11.11 |
engine
<string>flags
<crypto.constants> الافتراضي:crypto.constants.ENGINE_METHOD_ALL
قم بتحميل وتعيين engine
لبعض أو كل وظائف OpenSSL (يتم اختيارها بواسطة العلامات). دعم المحركات المخصصة في OpenSSL مهمل بدءًا من OpenSSL 3.
يمكن أن يكون engine
إما معرفًا أو مسارًا إلى المكتبة المشتركة للمحرك.
تستخدم وسيطة flags
الاختيارية ENGINE_METHOD_ALL
بشكل افتراضي. flags
عبارة عن حقل بت يأخذ واحدًا أو مزيجًا من العلامات التالية (المحددة في crypto.constants
):
crypto.constants.ENGINE_METHOD_RSA
crypto.constants.ENGINE_METHOD_DSA
crypto.constants.ENGINE_METHOD_DH
crypto.constants.ENGINE_METHOD_RAND
crypto.constants.ENGINE_METHOD_EC
crypto.constants.ENGINE_METHOD_CIPHERS
crypto.constants.ENGINE_METHOD_DIGESTS
crypto.constants.ENGINE_METHOD_PKEY_METHS
crypto.constants.ENGINE_METHOD_PKEY_ASN1_METHS
crypto.constants.ENGINE_METHOD_ALL
crypto.constants.ENGINE_METHOD_NONE
crypto.setFips(bool)
تمت الإضافة في: v10.0.0
bool
<boolean>true
لتمكين وضع FIPS.
يقوم بتمكين موفر التشفير المتوافق مع FIPS في إصدار Node.js المُمكن لـ FIPS. يطرح خطأ إذا لم يكن وضع FIPS متاحًا.
crypto.sign(algorithm, data, key[, callback])
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | تمرير استدعاء غير صالح إلى وسيطة callback يطرح الآن ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK . |
v15.12.0 | تمت إضافة وسيطة استدعاء اختيارية. |
v13.2.0, v12.16.0 | تدعم هذه الدالة الآن توقيعات IEEE-P1363 DSA و ECDSA. |
v12.0.0 | تمت الإضافة في: v12.0.0 |
algorithm
<string> | <null> | <undefined>data
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>callback
<Function>الإرجاع: <Buffer> إذا لم يتم توفير دالة
callback
.
يحسب ويرجع التوقيع لـ data
باستخدام المفتاح الخاص والخوارزمية المحددين. إذا كانت algorithm
هي null
أو undefined
، فإن الخوارزمية تعتمد على نوع المفتاح (خاصة Ed25519 و Ed448).
إذا لم يكن key
عبارة عن KeyObject
، فإن هذه الدالة تتصرف كما لو تم تمرير key
إلى crypto.createPrivateKey()
. إذا كان كائنًا، فيمكن تمرير الخصائص الإضافية التالية:
dsaEncoding
<string> بالنسبة إلى DSA و ECDSA، يحدد هذا الخيار تنسيق التوقيع الذي تم إنشاؤه. يمكن أن يكون واحدًا مما يلي:'der'
(افتراضي): بنية توقيع ASN.1 مشفرة بـ DER تشفير(r, s)
.'ieee-p1363'
: تنسيق التوقيعr || s
كما هو مقترح في IEEE-P1363.
padding
<integer> قيمة الحشو الاختيارية لـ RSA، واحدة مما يلي:crypto.constants.RSA_PKCS1_PADDING
(افتراضي)crypto.constants.RSA_PKCS1_PSS_PADDING
RSA_PKCS1_PSS_PADDING
سيستخدم MGF1 مع نفس دالة التجزئة المستخدمة لتوقيع الرسالة كما هو محدد في القسم 3.1 من RFC 4055.
saltLength
<integer> طول الملح عندما يكون الحشو هوRSA_PKCS1_PSS_PADDING
. تحدد القيمة الخاصةcrypto.constants.RSA_PSS_SALTLEN_DIGEST
طول الملح لحجم الملخص، بينما تحددcrypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(افتراضي) القيمة القصوى المسموح بها.
إذا تم توفير دالة callback
، تستخدم هذه الدالة مجمع مؤشرات الترابط الخاص بـ libuv.
crypto.subtle
تمت الإضافة في: v17.4.0
- النوع: <SubtleCrypto>
اسم مستعار مناسب لـ crypto.webcrypto.subtle
.
crypto.timingSafeEqual(a, b)
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن تكون الوسيطتان a و b أيضًا ArrayBuffer. |
v6.6.0 | تمت الإضافة في: v6.6.0 |
-
a
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> -
b
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> - الإرجاع: <boolean>
تقارن هذه الدالة البايتات الأساسية التي تمثل مثيلات ArrayBuffer
أو TypedArray
أو DataView
المحددة باستخدام خوارزمية ذات وقت ثابت.
لا تسرب هذه الدالة معلومات التوقيت التي قد تسمح للمهاجم بتخمين إحدى القيم. هذا مناسب لمقارنة ملخصات HMAC أو القيم السرية مثل ملفات تعريف الارتباط الخاصة بالمصادقة أو عناوين URL للقدرات.
يجب أن يكون كل من a
و b
من النوع Buffer
أو TypedArray
أو DataView
، ويجب أن يكون لهما نفس طول البايت. يتم طرح خطأ إذا كان لـ a
و b
أطوال بايت مختلفة.
إذا كان أحد a
و b
على الأقل من النوع TypedArray
مع أكثر من بايت واحد لكل إدخال، مثل Uint16Array
، فسيتم حساب النتيجة باستخدام ترتيب بايتات النظام الأساسي.
عندما يكون كلا المدخلين عبارة عن Float32Array
أو Float64Array
، قد تُرجع هذه الدالة نتائج غير متوقعة بسبب ترميز IEEE 754 للأرقام العشرية. على وجه الخصوص، لا يعني أي من x === y
أو Object.is(x, y)
أن التمثيلات البايتية لرقمين عشريين x
و y
متساويتان.
لا يضمن استخدام crypto.timingSafeEqual
أن يكون الكود المحيط آمنًا من حيث التوقيت. يجب توخي الحذر للتأكد من أن الكود المحيط لا يقدم ثغرات أمنية تتعلق بالتوقيت.
crypto.verify(algorithm, data, key, signature[, callback])
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v18.0.0 | تمرير دالة رد نداء غير صالحة إلى وسيطة callback سيؤدي الآن إلى ظهور ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK . |
v15.12.0 | تمت إضافة وسيطة رد النداء الاختيارية. |
v15.0.0 | يمكن أن تكون وسائط البيانات والمفتاح والتوقيع أيضًا ArrayBuffer. |
v13.2.0, v12.16.0 | تدعم هذه الدالة الآن تواقيع IEEE-P1363 DSA و ECDSA. |
v12.0.0 | تمت إضافته في: v12.0.0 |
algorithm
<string> | <null> | <undefined>data
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>signature
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>callback
<Function>الإرجاع: <boolean>
true
أوfalse
اعتمادًا على صلاحية التوقيع للبيانات والمفتاح العام إذا لم يتم توفير دالةcallback
.
للتحقق من التوقيع المحدد لـ data
باستخدام المفتاح والخوارزمية المحددين. إذا كانت algorithm
هي null
أو undefined
، فإن الخوارزمية تعتمد على نوع المفتاح (خاصة Ed25519 و Ed448).
إذا لم يكن key
هو KeyObject
، فإن هذه الدالة تتصرف كما لو تم تمرير key
إلى crypto.createPublicKey()
. إذا كان كائنًا، فيمكن تمرير الخصائص الإضافية التالية:
dsaEncoding
<string> بالنسبة إلى DSA و ECDSA، يحدد هذا الخيار تنسيق التوقيع. يمكن أن يكون واحدًا مما يلي:'der'
(افتراضي): بنية توقيع ASN.1 المشفرة بـ DER والتي تشفر(r, s)
.'ieee-p1363'
: تنسيق التوقيعr || s
كما هو مقترح في IEEE-P1363.
padding
<integer> قيمة حشو اختيارية لـ RSA، واحدة مما يلي:crypto.constants.RSA_PKCS1_PADDING
(افتراضي)crypto.constants.RSA_PKCS1_PSS_PADDING
سيستخدم RSA_PKCS1_PSS_PADDING
MGF1 بنفس وظيفة التجزئة المستخدمة لتوقيع الرسالة كما هو محدد في القسم 3.1 من RFC 4055.
saltLength
<integer> طول الملح عندما يكون الحشو هوRSA_PKCS1_PSS_PADDING
. القيمة الخاصةcrypto.constants.RSA_PSS_SALTLEN_DIGEST
تحدد طول الملح لحجم الملخص، وcrypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(افتراضي) تحدده للقيمة القصوى المسموح بها.
وسيطة signature
هي التوقيع الذي تم حسابه مسبقًا لـ data
.
نظرًا لأنه يمكن اشتقاق المفاتيح العامة من المفاتيح الخاصة، فيمكن تمرير مفتاح خاص أو مفتاح عام لـ key
.
إذا تم توفير دالة callback
، فستستخدم هذه الدالة تجمع مؤشرات الترابط الخاص بـ libuv.
crypto.webcrypto
أضيف في: الإصدار 15.0.0
النوع: <Crypto> تطبيق لمعيار Web Crypto API.
راجع وثائق Web Crypto API للحصول على التفاصيل.
ملاحظات
استخدام السلاسل كمدخلات لواجهات برمجة تطبيقات التشفير
لأسباب تاريخية، تقبل العديد من واجهات برمجة تطبيقات التشفير التي توفرها Node.js السلاسل كمدخلات حيث تعمل خوارزمية التشفير الأساسية على تسلسلات البايت. تتضمن هذه الحالات النصوص العادية، والنصوص المشفرة، والمفاتيح المتماثلة، ومتجهات التهيئة، وعبارات المرور، والأملاح، وعلامات المصادقة، والبيانات الأصلية الإضافية.
عند تمرير السلاسل إلى واجهات برمجة تطبيقات التشفير، ضع في اعتبارك العوامل التالية.
- ليست كل تسلسلات البايت سلاسل UTF-8 صالحة. لذلك، عندما يتم اشتقاق تسلسل بايت بطول
n
من سلسلة، يكون إنتروبيها بشكل عام أقل من إنتروبيا تسلسل بايت عشوائي أو شبه عشوائي بطولn
. على سبيل المثال، لن تؤدي أي سلسلة UTF-8 إلى تسلسل البايتc0 af
. يجب أن تكون المفاتيح السرية بشكل حصري تقريبًا تسلسلات بايت عشوائية أو شبه عشوائية. - وبالمثل، عند تحويل تسلسلات البايت العشوائية أو شبه العشوائية إلى سلاسل UTF-8، قد يتم استبدال التسلسلات الفرعية التي لا تمثل نقاط رمز صالحة بحرف الاستبدال Unicode (
U+FFFD
). قد لا يكون تمثيل البايت لسلسلة Unicode الناتجة مساويًا لتسلسل البايت الذي تم إنشاء السلسلة منه. إن مخرجات الخوارزميات المشفرة، ووظائف التجزئة، وخوارزميات التوقيع، ووظائف اشتقاق المفاتيح هي تسلسلات بايت شبه عشوائية ولا ينبغي استخدامها كسلاسل Unicode. - عندما يتم الحصول على السلاسل من إدخال المستخدم، يمكن تمثيل بعض أحرف Unicode بطرق مكافئة متعددة تؤدي إلى تسلسلات بايت مختلفة. على سبيل المثال، عند تمرير عبارة مرور مستخدم إلى وظيفة اشتقاق مفتاح، مثل PBKDF2 أو scrypt، تعتمد نتيجة وظيفة اشتقاق المفتاح على ما إذا كانت السلسلة تستخدم أحرفًا مركبة أو مفككة. لا تقوم Node.js بتطبيع تمثيلات الأحرف. يجب على المطورين التفكير في استخدام
String.prototype.normalize()
على مدخلات المستخدم قبل تمريرها إلى واجهات برمجة تطبيقات التشفير.
واجهة برمجة تطبيقات التدفقات القديمة (قبل Node.js 0.10)
تمت إضافة وحدة Crypto إلى Node.js قبل وجود مفهوم واجهة برمجة تطبيقات التدفقات الموحدة، وقبل وجود كائنات Buffer
للتعامل مع البيانات الثنائية. على هذا النحو، تحتوي العديد من فئات crypto
على طرق غير موجودة عادةً في فئات Node.js الأخرى التي تنفذ واجهة برمجة تطبيقات التدفقات (مثل update()
أو final()
أو digest()
). أيضًا، قبلت العديد من الطرق وأرجعت سلاسل مشفرة بـ 'latin1'
افتراضيًا بدلاً من Buffer
s. تم تغيير هذا الافتراضي بعد Node.js v0.8 لاستخدام كائنات Buffer
افتراضيًا بدلاً من ذلك.
دعم الخوارزميات الضعيفة أو المخترقة
لا تزال وحدة node:crypto
تدعم بعض الخوارزميات التي تم اختراقها بالفعل ولا يُنصح باستخدامها. تسمح واجهة برمجة التطبيقات أيضًا باستخدام الأصفار والتجزئة بأحجام مفاتيح صغيرة جدًا وهي ضعيفة جدًا للاستخدام الآمن.
يجب على المستخدمين تحمل المسؤولية الكاملة عن تحديد خوارزمية التشفير وحجم المفتاح وفقًا لمتطلباتهم الأمنية.
بناءً على توصيات NIST SP 800-131A:
- لم يعد MD5 و SHA-1 مقبولين حيث تكون مقاومة التصادم مطلوبة مثل التوقيعات الرقمية.
- يوصى بأن يكون للمفتاح المستخدم مع خوارزميات RSA و DSA و DH 2048 بتًا على الأقل وأن يكون لمنحنى ECDSA و ECDH 224 بتًا على الأقل، ليكون آمنًا للاستخدام لعدة سنوات.
- مجموعات DH الخاصة بـ
modp1
وmodp2
وmodp5
لها حجم مفتاح أصغر من 2048 بتًا ولا يُنصح بها.
راجع المرجع للحصول على توصيات وتفاصيل أخرى.
بعض الخوارزميات التي لها نقاط ضعف معروفة وليس لها أهمية كبيرة في الممارسة العملية متاحة فقط من خلال موفر الإرث، والذي لم يتم تمكينه افتراضيًا.
وضع CCM
CCM هي إحدى خوارزميات AEAD المدعومة. يجب على التطبيقات التي تستخدم هذا الوضع الالتزام بقيود معينة عند استخدام واجهة برمجة تطبيقات التشفير:
- يجب تحديد طول علامة المصادقة أثناء إنشاء التشفير عن طريق تعيين خيار
authTagLength
ويجب أن يكون أحد القيم 4 أو 6 أو 8 أو 10 أو 12 أو 14 أو 16 بايت. - يجب أن يكون طول متجه التهيئة (nonce)
N
بين 7 و 13 بايت (7 ≤ N ≤ 13
). - يقتصر طول النص العادي على
2 ** (8 * (15 - N))
بايت. - عند فك التشفير، يجب تعيين علامة المصادقة عبر
setAuthTag()
قبل استدعاءupdate()
. وإلا، فسيفشل فك التشفير وستطرحfinal()
خطأً امتثالاً للقسم 2.6 من RFC 3610. - قد تفشل طرق التدفق مثل
write(data)
أوend(data)
أوpipe()
في وضع CCM لأن CCM لا يمكنه التعامل مع أكثر من قطعة بيانات واحدة لكل مثيل. - عند تمرير بيانات مصادقة إضافية (AAD)، يجب تمرير طول الرسالة الفعلية بالبايت إلى
setAAD()
عبر خيارplaintextLength
. تتضمن العديد من مكتبات التشفير علامة المصادقة في النص المشفر، مما يعني أنها تنتج نصوصًا مشفرة بطولplaintextLength + authTagLength
. لا تتضمن Node.js علامة المصادقة، لذا فإن طول النص المشفر هو دائمًاplaintextLength
. هذا ليس ضروريًا إذا لم يتم استخدام AAD. - نظرًا لأن CCM يعالج الرسالة بأكملها مرة واحدة، يجب استدعاء
update()
مرة واحدة بالضبط. - على الرغم من أن استدعاء
update()
يكفي لتشفير/فك تشفير الرسالة، إلا أنه يجب على التطبيقات استدعاءfinal()
لحساب علامة المصادقة أو التحقق منها.
import { Buffer } from 'node:buffer';
const {
createCipheriv,
createDecipheriv,
randomBytes,
} = await import('node:crypto');
const key = 'keykeykeykeykeykeykeykey';
const nonce = randomBytes(12);
const aad = Buffer.from('0123456789', 'hex');
const cipher = createCipheriv('aes-192-ccm', key, nonce, {
authTagLength: 16,
});
const plaintext = 'Hello world';
cipher.setAAD(aad, {
plaintextLength: Buffer.byteLength(plaintext),
});
const ciphertext = cipher.update(plaintext, 'utf8');
cipher.final();
const tag = cipher.getAuthTag();
// Now transmit { ciphertext, nonce, tag }.
const decipher = createDecipheriv('aes-192-ccm', key, nonce, {
authTagLength: 16,
});
decipher.setAuthTag(tag);
decipher.setAAD(aad, {
plaintextLength: ciphertext.length,
});
const receivedPlaintext = decipher.update(ciphertext, null, 'utf8');
try {
decipher.final();
} catch (err) {
throw new Error('Authentication failed!', { cause: err });
}
console.log(receivedPlaintext);
const { Buffer } = require('node:buffer');
const {
createCipheriv,
createDecipheriv,
randomBytes,
} = require('node:crypto');
const key = 'keykeykeykeykeykeykeykey';
const nonce = randomBytes(12);
const aad = Buffer.from('0123456789', 'hex');
const cipher = createCipheriv('aes-192-ccm', key, nonce, {
authTagLength: 16,
});
const plaintext = 'Hello world';
cipher.setAAD(aad, {
plaintextLength: Buffer.byteLength(plaintext),
});
const ciphertext = cipher.update(plaintext, 'utf8');
cipher.final();
const tag = cipher.getAuthTag();
// Now transmit { ciphertext, nonce, tag }.
const decipher = createDecipheriv('aes-192-ccm', key, nonce, {
authTagLength: 16,
});
decipher.setAuthTag(tag);
decipher.setAAD(aad, {
plaintextLength: ciphertext.length,
});
const receivedPlaintext = decipher.update(ciphertext, null, 'utf8');
try {
decipher.final();
} catch (err) {
throw new Error('Authentication failed!', { cause: err });
}
console.log(receivedPlaintext);
وضع FIPS
عند استخدام OpenSSL 3، يدعم Node.js معيار FIPS 140-2 عند استخدامه مع موفر OpenSSL 3 مناسب، مثل موفر FIPS من OpenSSL 3 الذي يمكن تثبيته باتباع التعليمات الواردة في ملف README الخاص بـ FIPS من OpenSSL.
لدعم FIPS في Node.js، ستحتاج إلى:
- موفر OpenSSL 3 FIPS مثبت بشكل صحيح.
- ملف تكوين وحدة FIPS الخاص بـ OpenSSL 3.
- ملف تكوين OpenSSL 3 يشير إلى ملف تكوين وحدة FIPS.
يجب تكوين Node.js بملف تكوين OpenSSL يشير إلى موفر FIPS. يبدو ملف التكوين النموذجي كما يلي:
nodejs_conf = nodejs_init
.include /<المسار المطلق>/fipsmodule.cnf
[nodejs_init]
providers = provider_sect
[provider_sect]
default = default_sect
# يجب أن يتطابق اسم قسم fips مع اسم القسم داخل {#the-fips-section-name-should-match-the-section-name-inside-the}
# fipsmodule.cnf المضمن.
fips = fips_sect
[default_sect]
activate = 1
حيث fipsmodule.cnf
هو ملف تكوين وحدة FIPS الذي تم إنشاؤه من خطوة تثبيت موفر FIPS:
openssl fipsinstall
عيّن متغير البيئة OPENSSL_CONF
للإشارة إلى ملف التكوين الخاص بك و OPENSSL_MODULES
إلى موقع المكتبة الديناميكية لموفر FIPS. على سبيل المثال
export OPENSSL_CONF=/<المسار إلى ملف التكوين>/nodejs.cnf
export OPENSSL_MODULES=/<المسار إلى مكتبة openssl>/ossl-modules
يمكن بعد ذلك تمكين وضع FIPS في Node.js إما عن طريق:
- بدء Node.js باستخدام علامات سطر الأوامر
--enable-fips
أو--force-fips
. - استدعاء
crypto.setFips(true)
برمجيًا.
اختياريًا، يمكن تمكين وضع FIPS في Node.js عبر ملف تكوين OpenSSL. على سبيل المثال
nodejs_conf = nodejs_init
.include /<المسار المطلق>/fipsmodule.cnf
[nodejs_init]
providers = provider_sect
alg_section = algorithm_sect
[provider_sect]
default = default_sect
# يجب أن يتطابق اسم قسم fips مع اسم القسم داخل {#included-fipsmodulecnf}
# fipsmodule.cnf المضمن.
fips = fips_sect
[default_sect]
activate = 1
[algorithm_sect]
default_properties = fips=yes
ثوابت التشفير
تنطبق الثوابت التالية التي يتم تصديرها بواسطة crypto.constants
على استخدامات متنوعة لوحدات node:crypto
و node:tls
و node:https
وهي بشكل عام خاصة بـ OpenSSL.
خيارات OpenSSL
راجع قائمة علامات SSL OP للحصول على التفاصيل.
ثابت | الوصف |
---|---|
SSL_OP_ALL | يطبق العديد من الحلول البديلة للأخطاء داخل OpenSSL. انظر https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html للحصول على التفاصيل. |
SSL_OP_ALLOW_NO_DHE_KEX | يعطي تعليمات لـ OpenSSL للسماح بوضع تبادل المفاتيح غير القائم على [EC]DHE لـ TLS v1.3 |
SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION | يسمح بإعادة التفاوض غير الآمنة القديمة بين OpenSSL والعملاء أو الخوادم غير المصححة. انظر https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html . |
SSL_OP_CIPHER_SERVER_PREFERENCE | يحاول استخدام تفضيلات الخادم بدلاً من تفضيلات العميل عند تحديد الشفرة. يعتمد السلوك على إصدار البروتوكول. انظر https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html . |
SSL_OP_CISCO_ANYCONNECT | يعطي تعليمات لـ OpenSSL لاستخدام مُعرّف إصدار Cisco لـ DTLS_BAD_VER. |
SSL_OP_COOKIE_EXCHANGE | يعطي تعليمات لـ OpenSSL لتشغيل تبادل ملفات تعريف الارتباط. |
SSL_OP_CRYPTOPRO_TLSEXT_BUG | يعطي تعليمات لـ OpenSSL لإضافة ملحق ترحيب الخادم من إصدار مبكر من مسودة cryptopro. |
SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS | يعطي تعليمات لـ OpenSSL لتعطيل حل بديل لثغرة أمنية في SSL 3.0/TLS 1.0 تمت إضافته في OpenSSL 0.9.6d. |
SSL_OP_LEGACY_SERVER_CONNECT | يسمح بالاتصال الأولي بالخوادم التي لا تدعم RI. |
SSL_OP_NO_COMPRESSION | يعطي تعليمات لـ OpenSSL لتعطيل دعم ضغط SSL/TLS. |
SSL_OP_NO_ENCRYPT_THEN_MAC | يعطي تعليمات لـ OpenSSL لتعطيل التشفير ثم MAC. |
SSL_OP_NO_QUERY_MTU | |
SSL_OP_NO_RENEGOTIATION | يعطي تعليمات لـ OpenSSL لتعطيل إعادة التفاوض. |
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION | يعطي تعليمات لـ OpenSSL لبدء جلسة جديدة دائمًا عند إجراء إعادة التفاوض. |
SSL_OP_NO_SSLv2 | يعطي تعليمات لـ OpenSSL لإيقاف تشغيل SSL v2 |
SSL_OP_NO_SSLv3 | يعطي تعليمات لـ OpenSSL لإيقاف تشغيل SSL v3 |
SSL_OP_NO_TICKET | يعطي تعليمات لـ OpenSSL لتعطيل استخدام تذاكر RFC4507bis. |
SSL_OP_NO_TLSv1 | يعطي تعليمات لـ OpenSSL لإيقاف تشغيل TLS v1 |
SSL_OP_NO_TLSv1_1 | يعطي تعليمات لـ OpenSSL لإيقاف تشغيل TLS v1.1 |
SSL_OP_NO_TLSv1_2 | يعطي تعليمات لـ OpenSSL لإيقاف تشغيل TLS v1.2 |
SSL_OP_NO_TLSv1_3 | يعطي تعليمات لـ OpenSSL لإيقاف تشغيل TLS v1.3 |
SSL_OP_PRIORITIZE_CHACHA | يعطي تعليمات لخادم OpenSSL لإعطاء الأولوية لـ ChaCha20-Poly1305 عندما يقوم العميل بذلك. ليس لهذا الخيار أي تأثير إذا لم يتم تمكين SSL_OP_CIPHER_SERVER_PREFERENCE . |
SSL_OP_TLS_ROLLBACK_BUG | يعطي تعليمات لـ OpenSSL لتعطيل الكشف عن هجوم التراجع في الإصدار. |
ثوابت محرك OpenSSL
الثابت | الوصف |
---|---|
ENGINE_METHOD_RSA | تقييد استخدام المحرك بـ RSA |
ENGINE_METHOD_DSA | تقييد استخدام المحرك بـ DSA |
ENGINE_METHOD_DH | تقييد استخدام المحرك بـ DH |
ENGINE_METHOD_RAND | تقييد استخدام المحرك بـ RAND |
ENGINE_METHOD_EC | تقييد استخدام المحرك بـ EC |
ENGINE_METHOD_CIPHERS | تقييد استخدام المحرك بـ CIPHERS |
ENGINE_METHOD_DIGESTS | تقييد استخدام المحرك بـ DIGESTS |
ENGINE_METHOD_PKEY_METHS | تقييد استخدام المحرك بـ PKEY_METHS |
ENGINE_METHOD_PKEY_ASN1_METHS | تقييد استخدام المحرك بـ PKEY_ASN1_METHS |
ENGINE_METHOD_ALL | |
ENGINE_METHOD_NONE |
ثوابت OpenSSL أخرى
الثابت | الوصف |
---|---|
DH_CHECK_P_NOT_SAFE_PRIME | |
DH_CHECK_P_NOT_PRIME | |
DH_UNABLE_TO_CHECK_GENERATOR | |
DH_NOT_SUITABLE_GENERATOR | |
RSA_PKCS1_PADDING | |
RSA_SSLV23_PADDING | |
RSA_NO_PADDING | |
RSA_PKCS1_OAEP_PADDING | |
RSA_X931_PADDING | |
RSA_PKCS1_PSS_PADDING | |
RSA_PSS_SALTLEN_DIGEST | يعين طول الملح لـ RSA_PKCS1_PSS_PADDING إلى حجم التلخيص عند التوقيع أو التحقق. |
RSA_PSS_SALTLEN_MAX_SIGN | يعين طول الملح لـ RSA_PKCS1_PSS_PADDING إلى القيمة القصوى المسموح بها عند توقيع البيانات. |
RSA_PSS_SALTLEN_AUTO | يتسبب في تحديد طول الملح لـ RSA_PKCS1_PSS_PADDING تلقائيًا عند التحقق من التوقيع. |
POINT_CONVERSION_COMPRESSED | |
POINT_CONVERSION_UNCOMPRESSED | |
POINT_CONVERSION_HYBRID |
ثوابت تشفير Node.js
الثابت | الوصف |
---|---|
defaultCoreCipherList | يحدد قائمة الشفرات الافتراضية المضمنة المستخدمة بواسطة Node.js. |
defaultCipherList | يحدد قائمة الشفرات الافتراضية النشطة المستخدمة بواسطة عملية Node.js الحالية. |