التشفير
[مستقر: 2 - مستقر]
مستقر: 2 استقرار: 2 - مستقر
رمز المصدر: lib/crypto.js
يوفر الوحدة النمطية node:crypto
وظائف تشفيرية تتضمن مجموعة من أغلفة دالات OpenSSL الخاصة بالهاش وHMAC والتشفير وفك التشفير والتوقيع والتحقق.
const { createHmac } = await import('node:crypto')
const secret = 'abcdefg'
const hash = createHmac('sha256', secret).update('I love cupcakes').digest('hex')
console.log(hash)
// يطبع:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
const { createHmac } = require('node:crypto')
const secret = 'abcdefg'
const hash = createHmac('sha256', secret).update('I love cupcakes').digest('hex')
console.log(hash)
// يطبع:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
تحديد ما إذا كان دعم التشفير غير متوفر
من الممكن إنشاء Node.js بدون تضمين دعم الوحدة النمطية node:crypto
. في مثل هذه الحالات، سيؤدي محاولة import
من crypto
أو استدعاء require('node:crypto')
إلى إرسال خطأ.
عند استخدام CommonJS، يمكن التقاط الخطأ الذي تم إرساله باستخدام try/catch:
let crypto
try {
crypto = require('node:crypto')
} catch (err) {
console.error('دعم التشفير معطل!')
}
عند استخدام الكلمة الأساسية import
لـ ESM النحوية، لا يمكن التقاط الخطأ إلا إذا تم تسجيل مُعالِج لـ process.on('uncaughtException')
قبل أي محاولة لتحميل الوحدة النمطية (باستخدام، على سبيل المثال، وحدة نمطية مُحمّلة مسبقًا).
عند استخدام ESM، إذا كانت هناك فرصة لتنفيذ التعليمات البرمجية على بنية Node.js حيث لم يتم تمكين دعم التشفير، فكر في استخدام دالة import()
بدلاً من الكلمة الأساسية import
النحوية:
let crypto
try {
crypto = await import('node:crypto')
} catch (err) {
console.error('دعم التشفير معطل!')
}
الصنف: Certificate
مُضاف في: v0.11.8
SPKAC هي آلية طلب توقيع الشهادة التي تم تنفيذها في الأصل بواسطة Netscape وتم تحديدها رسميًا كجزء من عنصر keygen
في HTML5.
\<keygen\>
مُعطلة منذ HTML 5.2 ولا يجب استخدام هذا العنصر في المشاريع الجديدة بعد الآن.
يوفر مُعامل node:crypto
الصنف Certificate
للعمل مع بيانات SPKAC. الاستخدام الأكثر شيوعًا هو معالجة المخرجات التي تم إنشاؤها بواسطة عنصر HTML5 \<keygen\>
. يستخدم Node.js تنفيذ OpenSSL لـ SPKAC داخليًا.
الطريقة الثابتة: Certificate.exportChallenge(spkac[, encoding])
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن تكون وسيطة spkac عبارة عن ArrayBuffer. تم تحديد حجم وسيطة spkac بحد أقصى 2**31 - 1 بايت. |
v9.0.0 | مُضاف في: v9.0.0 |
spkac
<سلسلة> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<سلسلة> التشفير لسلسلة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])
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن تكون وسيطة spkac عبارة عن ArrayBuffer. تم تحديد حجم وسيطة spkac بحد أقصى 2**31 - 1 بايت. |
v9.0.0 | تمت الإضافة في: v9.0.0 |
spkac
<سلسلة> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<سلسلة> ترميز التشفير لسلسلة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])
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | يمكن أن تكون وسيطة spkac عبارة عن ArrayBuffer. تمت إضافة التشفير. تم تحديد حجم وسيطة spkac بحد أقصى 2**31 - 1 بايت. |
v9.0.0 | تمت الإضافة في: v9.0.0 |
spkac
<سلسلة> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<سلسلة> ترميز التشفير لسلسلةspkac
.- القيمة المرجعة: <قيمة منطقية>
true
إذا كان هيكل بياناتspkac
المعطى صحيحًا،false
خلاف ذلك.
import { Buffer } from 'node:buffer'
const { Certificate } = await import('node:crypto')
const spkac = getSpkacSomehow()
console.log(Certificate.verifySpkac(Buffer.from(spkac)))
// يطبع: true أو false
const { Buffer } = require('node:buffer')
const { Certificate } = require('node:crypto')
const spkac = getSpkacSomehow()
console.log(Certificate.verifySpkac(Buffer.from(spkac)))
// يطبع: true أو false
واجهة برمجة التطبيقات القديمة (Legacy API)
[مستقر: 0 - مُهمل]
مستقر: 0 استقرار: 0 - مُهمل
باعتبارها واجهة قديمة، من الممكن إنشاء مثيلات جديدة من فئة 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
. /api/buffer#buffers-and-character-encodings- قيمة الإرجاع: <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'
// أولاً، سنقوم بإنشاء المفتاح. يعتمد طول المفتاح على الخوارزمية.
// في هذه الحالة بالنسبة إلى aes192، هو 24 بايت (192 بت).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// بعد ذلك، سنقوم بإنشاء متجه بدء عشوائي
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err
// بمجرد أن نحصل على المفتاح و iv، يمكننا إنشاء واستخدام الشفرة...
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'
// أولاً، سنقوم بإنشاء المفتاح. يعتمد طول المفتاح على الخوارزمية.
// في هذه الحالة بالنسبة إلى aes192، هو 24 بايت (192 بت).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// بعد ذلك، سنقوم بإنشاء متجه بدء عشوائي
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err
// بمجرد أن نحصل على المفتاح و iv، يمكننا إنشاء واستخدام الشفرة...
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'
// أولاً، سنقوم بإنشاء المفتاح. يعتمد طول المفتاح على الخوارزمية.
// في هذه الحالة بالنسبة إلى aes192، هو 24 بايت (192 بت).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// بعد ذلك، سنقوم بإنشاء متجه بدء عشوائي
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'
// أولاً، سنقوم بإنشاء المفتاح. يعتمد طول المفتاح على الخوارزمية.
// في هذه الحالة بالنسبة إلى aes192، هو 24 بايت (192 بت).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// بعد ذلك، سنقوم بإنشاء متجه بدء عشوائي
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'
// أولاً، سنقوم بإنشاء المفتاح. يعتمد طول المفتاح على الخوارزمية.
// في هذه الحالة بالنسبة إلى aes192، هو 24 بايت (192 بت).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// بعد ذلك، سنقوم بإنشاء متجه بدء عشوائي
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'
// أولاً، سنقوم بإنشاء المفتاح. يعتمد طول المفتاح على الخوارزمية.
// في هذه الحالة بالنسبة إلى aes192، هو 24 بايت (192 بت).
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// بعد ذلك، سنقوم بإنشاء متجه بدء عشوائي
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
<string> التشفير لقيمة الإرجاع.- القيمة المُرجعّة: <Buffer> | <string> أي محتوى مشفر متبقي. إذا تم تحديد
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
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>options
<Object> خيارات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])
مضاف في: v0.7.1
autoPadding
<boolean> الافتراضي:true
- القيمة المُرجعة: <Cipher> نفس مثيل
Cipher
لاستخدام الربط بالسلسلة.
عند استخدام خوارزميات تشفير الكتل، ستقوم فئة Cipher
تلقائيًا بإضافة حشو إلى بيانات الإدخال إلى حجم الكتلة المناسب. لإلغاء الحشو الافتراضي، اتصل بـ cipher.setAutoPadding(false)
.
عندما يكون autoPadding
هو false
، يجب أن يكون طول بيانات الإدخال بأكملها مضاعفًا لحجم كتلة التشفير، أو أن cipher.final()
سيرمي خطأ. إن تعطيل الحشو التلقائي مفيد للحشو غير القياسي، على سبيل المثال، باستخدام 0x0
بدلاً من حشو PKCS.
يجب استدعاء طريقة cipher.setAutoPadding()
قبل cipher.final()
.
cipher.update(data[, inputEncoding][, outputEncoding])
[السجل]
الإصدار | التغييرات |
---|---|
v6.0.0 | تغيرت قيمة inputEncoding الافتراضية من binary إلى utf8 . |
v0.1.94 | مضاف في: v0.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'
// يعتمد طول المفتاح على الخوارزمية. في هذه الحالة بالنسبة لـ aes192، هو
// 24 بايت (192 بت).
// استخدم `crypto.scrypt()` غير المتزامن بدلاً من ذلك.
const key = scryptSync(password, 'salt', 24)
// عادةً ما يتم تمرير IV مع نص مشفر.
const iv = Buffer.alloc(16, 0) // متجه البدء.
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)
// يطبع: some clear text data
})
// مشفر بنفس الخوارزمية والمفتاح و 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'
// يعتمد طول المفتاح على الخوارزمية. في هذه الحالة بالنسبة لـ aes192، هو
// 24 بايت (192 بت).
// استخدم `crypto.scrypt()` غير المتزامن بدلاً من ذلك.
const key = scryptSync(password, 'salt', 24)
// عادةً ما يتم تمرير IV مع نص مشفر.
const iv = Buffer.alloc(16, 0) // متجه البدء.
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)
// يطبع: some clear text data
})
// مشفر بنفس الخوارزمية والمفتاح و 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'
// استخدم `crypto.scrypt()` غير المتزامن بدلاً من ذلك.
const key = scryptSync(password, 'salt', 24)
// عادةً ما يتم تمرير IV مع نص مشفر.
const iv = Buffer.alloc(16, 0) // متجه البدء.
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'
// استخدم `crypto.scrypt()` غير المتزامن بدلاً من ذلك.
const key = scryptSync(password, 'salt', 24)
// عادةً ما يتم تمرير IV مع نص مشفر.
const iv = Buffer.alloc(16, 0) // متجه البدء.
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'
// استخدم `crypto.scrypt()` غير المتزامن بدلاً من ذلك.
const key = scryptSync(password, 'salt', 24)
// عادةً ما يتم تمرير IV مع نص مشفر.
const iv = Buffer.alloc(16, 0) // متجه البدء.
const decipher = createDecipheriv(algorithm, key, iv)
// مشفر باستخدام نفس الخوارزمية والمفتاح و IV.
const encrypted = 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'
let decrypted = decipher.update(encrypted, 'hex', 'utf8')
decrypted += decipher.final('utf8')
console.log(decrypted)
// يطبع: 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'
// استخدم `crypto.scrypt()` غير المتزامن بدلاً من ذلك.
const key = scryptSync(password, 'salt', 24)
// عادةً ما يتم تمرير IV مع نص مشفر.
const iv = Buffer.alloc(16, 0) // متجه البدء.
const decipher = createDecipheriv(algorithm, key, iv)
// مشفر باستخدام نفس الخوارزمية والمفتاح و IV.
const encrypted = 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'
let decrypted = decipher.update(encrypted, 'hex', 'utf8')
decrypted += decipher.final('utf8')
console.log(decrypted)
// يطبع: some clear text data
decipher.final([outputEncoding])
مضاف في: v0.1.94
outputEncoding
<string> التشفير لقيمة الإرجاع.- الإرجاع: <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
<سلسلة> | <عازلة> | <ArrayBuffer> | <TypedArray> | <DataView>encoding
<سلسلة> ترميز السلسلة لاستخدامه عندما تكون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>
يقوم بتحديث decipher ببيانات 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
أداةً مساعدةً لإنشاء عمليات تبادل مفاتيح Diffie-Hellman.
يمكن إنشاء مثيلات من صنف DiffieHellman
باستخدام دالة crypto.createDiffieHellman()
.
import assert from 'node:assert'
const { createDiffieHellman } = await import('node:crypto')
// توليد مفاتيح أليس...
const alice = createDiffieHellman(2048)
const aliceKey = alice.generateKeys()
// توليد مفاتيح بوب...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator())
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 { createDiffieHellman } = require('node:crypto')
// توليد مفاتيح أليس...
const alice = createDiffieHellman(2048)
const aliceKey = alice.generateKeys()
// توليد مفاتيح بوب...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator())
const bobKey = bob.generateKeys()
// التبادل وتوليد السر...
const aliceSecret = alice.computeSecret(bobKey)
const bobSecret = bob.computeSecret(aliceKey)
// موافق
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
، فسيتم إرجاع سلسلة ؛ خلاف ذلك ، يتم إرجاع Buffer
.
diffieHellman.getPublicKey([encoding])
مضاف في: v0.5.0
يُعيد المفتاح العام لـ Diffie-Hellman بالتشفير المحدد. إذا تم توفير encoding
، فسيتم إرجاع سلسلة ؛ خلاف ذلك ، يتم إرجاع Buffer
.
diffieHellman.setPrivateKey(privateKey[, encoding])
مضاف في: v0.5.0
privateKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string> التشفير لسلسلة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
Class: 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
أداةً مساعدةً لإنشاء عمليات تبادل مفاتيح إهليلجية منحنى ديفى-هيلمن (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'
- قيمة الإرجاع: <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])
[History]
الإصدار | التغييرات |
---|---|
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
ترميز النقطة ويمكن أن تكون 'compressed'
أو 'uncompressed'
. إذا لم يتم تحديد format
، فسيتم إرجاع النقطة بتنسيق 'uncompressed'
.
إذا تم توفير encoding
، فسيتم إرجاع سلسلة؛ وإلا فسيتم إرجاع Buffer
.
ecdh.getPrivateKey([encoding])
مضاف في: v0.11.14
encoding
<string> ترميز التشفير لقيمة الإرجاع.- القيمة المُرجعة: <Buffer> | <string> مفتاح EC Diffie-Hellman الخاص بالترميز المحدد.
إذا تم تحديد encoding
، فسيتم إرجاع سلسلة؛ وإلا فسيتم إرجاع Buffer
.
ecdh.getPublicKey([encoding][, format])
مضاف في: v0.11.14
encoding
<string> ترميز التشفير لقيمة الإرجاع.format
<string> افتراضي:'uncompressed'
- القيمة المُرجعة: <Buffer> | <string> المفتاح العام لـ EC Diffie-Hellman بالترميز والتنسيق المحددين.
تحدد وسيطة 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
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 الخاصة السابقة. سيكون من غير الحكمة استخدام مفتاح خاص متوقع كهذا في تطبيق حقيقي.
alice.setPrivateKey(createHash('sha256').update('alice', 'utf8').digest())
// يستخدم Bob زوجًا جديدًا من المفاتيح المشفرة بقوة عشوائية زائفة
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 الخاصة السابقة. سيكون من غير الحكمة استخدام مفتاح خاص متوقع كهذا في تطبيق حقيقي.
alice.setPrivateKey(createHash('sha256').update('alice', 'utf8').digest())
// يستخدم Bob زوجًا جديدًا من المفاتيح المشفرة بقوة عشوائية زائفة
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
options- قيمة الإرجاع: <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
<سلسلة> | <عازلة> | <TypedArray> | <DataView>inputEncoding
<سلسلة> ترميز الترميز لسلسلةdata
.
يقوم بتحديث محتوى التجزئة بالبيانات المعطاة data
، وترميزها مُعطى في inputEncoding
. إذا لم يتم توفير encoding
، وكانت data
سلسلة، يتم فرض ترميز 'utf8'
. إذا كانت data
عبارة عن عازلة
، 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', () => {
// سيتم إنتاج عنصر واحد فقط بواسطة
// دفق التجزئة.
const data = hmac.read()
if (data) {
console.log(data.toString('hex'))
// يطبع:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
}
})
hmac.write('some data to hash')
hmac.end()
const { createHmac } = require('node:crypto')
const hmac = createHmac('sha256', 'a secret')
hmac.on('readable', () => {
// سيتم إنتاج عنصر واحد فقط بواسطة
// دفق التجزئة.
const data = hmac.read()
if (data) {
console.log(data.toString('hex'))
// يطبع:
// 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'))
// يطبع:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
const { createHmac } = require('node:crypto')
const hmac = createHmac('sha256', 'a secret')
hmac.update('some data to hash')
console.log(hmac.digest('hex'))
// يطبع:
// 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)
// يطبع: 32 (حجم المفتاح المتماثل بالبايت)
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)
// يطبع: 32 (حجم المفتاح المتماثل بالبايت)
})()
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
.
قد يتم عرض تفاصيل أخرى للمفتاح من خلال هذا API باستخدام سمات إضافية.
keyObject.asymmetricKeyType
[History]
الإصدار | التغييرات |
---|---|
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])
[History]
الإصدار | التغييرات |
---|---|
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 الإصدار 2.0.passphrase
: <string> | <Buffer> كلمة المرور المستخدمة للتشفير، انظرcipher
.
يعتمد نوع النتيجة على تنسيق الترميز المحدد، عندما يكون PEM تكون النتيجة سلسلة، وعندما يكون DER سيكون عازلاً يحتوي على البيانات المشفرة كـ DER، وعندما يكون JWK سيكون كائنًا.
عندما يتم تحديد تنسيق ترميز JWK، يتم تجاهل خيارات الترميز الأخرى.
يمكن تشفير مفاتيح PKCS # 1 و SEC1 و PKCS # 8 باستخدام مزيج من خيارات cipher
و format
. يمكن استخدام نوع PKCS # 8 مع أي format
لتشفير أي خوارزمية مفتاح (RSA أو EC أو DH) عن طريق تحديد cipher
. لا يمكن تشفير PKCS # 1 و SEC1 إلا عن طريق تحديد cipher
عندما يتم استخدام تنسيق 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'
للمفاتيح الخاصة (غير المتماثلة).
Class: Sign
مضاف في: v0.1.92
- يمتد: <stream.Writable>
تُعد فئة Sign
أداة مساعدة لإنشاء التوقيعات. ويمكن استخدامها بإحدى طريقتين:
- كتدفق stream قابل للكتابة، حيث يتم كتابة البيانات المراد توقيعها وتُستخدم طريقة
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'))
// يطبع: 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'))
// يطبع: 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))
// يطبع: 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))
// يطبع: 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])
[History]
الإصدار | التغييرات |
---|---|
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
أداة مساعدة للتحقق من التوقيعات. يمكن استخدامه بإحدى طريقتين:
- كتدفق قابل للكتابة stream حيث تُستخدم البيانات المكتوبة للتحقق من التوقيع المُقدم، أو
- باستخدام طريقتي
verify.update()
وverify.verify()
للتحقق من التوقيع.
تُستخدم طريقة crypto.createVerify()
لإنشاء مثيلات Verify
. لا يجب إنشاء كائنات Verify
مباشرةً باستخدام الكلمة المفتاحية new
.
راجع Sign
للحصول على أمثلة.
verify.update(data[, inputEncoding])
[History]
الإصدار | التغييرات |
---|---|
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
مضاف في: v15.6.0
يُغلف شهادة X509 ويوفر وصولاً للقراءة فقط إلى معلوماتها.
const { X509Certificate } = await import('node:crypto')
const x509 = new X509Certificate('{... pem encoded cert ...}')
console.log(x509.subject)
const { X509Certificate } = require('node:crypto')
const x509 = new X509Certificate('{... pem encoded cert ...}')
console.log(x509.subject)
new X509Certificate(buffer)
مضاف في: v15.6.0
buffer
<string> | <TypedArray> | <Buffer> | <DataView> شهادة X509 مشفرة بترميز PEM أو DER.
x509.ca
مضاف في: v15.6.0
- النوع: <boolean> ستكون
true
إذا كانت هذه شهادة سلطة إصدار الشهادات (CA).
x509.checkEmail(email[, options])
[السجل]
الإصدار | التغييرات |
---|---|
v18.0.0 | خيار الموضوع الآن يفترض افتراضيًا 'default' . |
v17.5.0, v16.15.0 | يمكن الآن تعيين خيار الموضوع إلى 'default' . |
v17.5.0, v16.14.1 | تمت إزالة خيارات wildcards , partialWildcards , multiLabelWildcards , و singleLabelSubdomains نظرًا لعدم تأثيرها. |
v15.6.0 | مضاف في: v15.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]
الإصدار | التغييرات |
---|---|
v18.0.0 | خيار الموضوع الآن افتراضيًا هو 'default' |
v17.5.0, v16.15.0 | يمكن الآن تعيين خيار الموضوع إلى 'default' |
v15.6.0 | تمت الإضافة في: v15.6.0 |
name
<string>options
<Object>الإرجاع: <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> عدد تكرارات البدائية الاحتمالية لـ Miller-Rabin التي سيتم تنفيذها. عندما تكون القيمة هي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> عدد أولي محتمل مشفر كسلسلة من بايتات النهاية الكبيرة ذات طول تعسفي.options
<Object>checks
<number> عدد تكرارات اختبار البدائية الاحتمالية لـ Miller-Rabin التي سيتم إجراؤها. عندما تكون القيمة هي0
(صفر)، يتم استخدام عدد من عمليات الفحص ينتج عنه معدل خطأ إيجابي كاذب لا يتجاوز 2 لإدخال عشوائي. يجب توخي الحذر عند تحديد عدد عمليات الفحص. راجع وثائق OpenSSL لوظيفةBN_is_prime_ex
لخيارnchecks
لمزيد من التفاصيل. افتراضي:0
قيمة الإرجاع: <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- قيمة مُعادة: <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
s. قد يكون key
اختيارياً KeyObject
من نوع secret
. إذا لم تكن هناك حاجة إلى متجه تهيئة للتشفير، فقد يكون iv
null
.
عند تمرير سلاسل لـ key
أو iv
، يرجى مراعاة المحاذير عند استخدام السلاسل كمدخلات لواجهات برمجة التطبيقات التشفيرية.
يجب أن تكون متجهات التهيئة غير قابلة للتنبؤ وفريدة من نوعها؛ من الناحية المثالية، ستكون عشوائية تشفيرياً. ليس من الضروري أن تكون سرية: عادةً ما يتم فقط إضافة IVs إلى رسائل نص مشفر غير مشفرة. قد يبدو متناقضًا أن شيئًا ما يجب أن يكون غير قابل للتنبؤ وفريدًا، لكن ليس من الضروري أن يكون سريًا؛ تذكر أنه يجب ألا يتمكن المهاجم من التنبؤ مسبقًا بما سيكون عليه IV معين.
crypto.createDecipheriv(algorithm, key, iv[, options])
[History]
الإصدار | التغييرات |
---|---|
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
options- 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
، يرجى مراعاة التحذيرات عند استخدام السلاسل كمدخلات لواجهات برمجة التطبيقات المشفرة.
يجب أن تكون متجهات البدء غير قابلة للتنبؤ وفريدة؛ من الناحية المثالية، ستكون عشوائية تشفيرية. لا يجب أن تكون سرية: عادةً ما يتم إضافة متجهات البدء إلى رسائل النص المشفر غير المشفرة. قد يبدو متناقضًا أن يكون شيء ما غير قابل للتنبؤ وفريدًا، لكن لا يجب أن يكون سريًا؛ تذكر أنه يجب ألا يتمكن المهاجم من التنبؤ مسبقًا بما سيكون عليه متجه البدء المعطى.
crypto.createDiffieHellman(prime[, primeEncoding][, generator][, generatorEncoding])
[History]
الإصدار | التغييرات |
---|---|
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
. [/api/buffer#buffers-and-character-encodings]generator
<number> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> الافتراضي:2
generatorEncoding
<string> ترميز سلسلةgenerator
. [/api/buffer#buffers-and-character-encodings]- القيمة المُرجعة: <DiffieHellman>
يُنشئ كائن تبادل مفاتيح DiffieHellman
باستخدام prime
المُعطى ومُولِّد مُحدد اختياري.
يمكن أن تكون وسيطة generator
رقمًا أو سلسلة أو Buffer
. إذا لم يتم تحديد generator
، فسيتم استخدام القيمة 2
.
إذا تم تحديد primeEncoding
، يُتوقع أن يكون prime
سلسلة؛ خلاف ذلك، يُتوقع أن يكون Buffer
، TypedArray
، أو DataView
.
إذا تم تحديد generatorEncoding
، يُتوقع أن يكون generator
سلسلة؛ خلاف ذلك، يُتوقع أن يكون رقمًا، أو Buffer
، TypedArray
، أو DataView
.
crypto.createDiffieHellman(primeLength[, generator])
مضاف في: v0.5.0
primeLength
<number>generator
<number> افتراضي:2
- قيمة الإرجاع: <DiffieHellman>
يقوم بإنشاء كائن تبادل مفاتيح DiffieHellman
ويولد عددًا أوليًا من بتات primeLength
باستخدام مُولِّد رقمي اختياري محدد. إذا لم يتم تحديد generator
، فسيتم استخدام القيمة 2
.
crypto.createDiffieHellmanGroup(name)
مضاف في: v0.9.3
name
<string>- قيمة الإرجاع: <DiffieHellmanGroup>
مُرادف لـ crypto.getDiffieHellman()
crypto.createECDH(curveName)
مضاف في: v0.11.14
يقوم بإنشاء كائن تبادل مفاتيح منحنى إهليلجي Diffie-Hellman (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
- قيمة الإرجاع: <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', () => {
// سيتم إنتاج عنصر واحد فقط بواسطة دفق التجزئة.
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', () => {
// سيتم إنتاج عنصر واحد فقط بواسطة دفق التجزئة.
const data = input.read()
if (data) hash.update(data)
else {
console.log(`${hash.digest('hex')} ${filename}`)
}
})
crypto.createHmac(algorithm, key[, options])
[History]
الإصدار | التغييرات |
---|---|
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).
مثال: إنشاء HMAC sha256 لملف
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', () => {
// سيتم إنتاج عنصر واحد فقط بواسطة دفق التجزئة.
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', () => {
// سيتم إنتاج عنصر واحد فقط بواسطة دفق التجزئة.
const data = input.read()
if (data) hmac.update(data)
else {
console.log(`${hmac.digest('hex')} ${filename}`)
}
})
crypto.createPrivateKey(key)
[History]
الإصدار | التغييرات |
---|---|
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
سلسلة.
الإرجاع: <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
سلسلة.
الإرجاع: <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 أو سلسلة. تمت إضافة وسيطة encoding. لا يمكن أن يحتوي المفتاح على أكثر من 2 ** 32 - 1 بايت. |
v11.6.0 | تمت الإضافة في: v11.6.0 |
key
<سلسلة> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<سلسلة> ترميز السلسلة عندما يكونkey
سلسلة.- القيمة المُرجعة: <KeyObject>
يقوم بإنشاء وإرجاع كائن مفتاح جديد يحتوي على مفتاح سري للتشفير المتماثل أو Hmac
.
crypto.createSign(algorithm[, options])
تمت الإضافة في: v0.1.92
algorithm
<سلسلة>options
<كائن> خياراتstream.Writable
- القيمة المُرجعة: <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- قيمة مُرجعه: <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>
قيمة مُرجعه: <Buffer>
يحسب سر Diffie-Hellman بناءً على privateKey
و publicKey
. يجب أن يكون لدى المفتاحين نفس asymmetricKeyType
، والذي يجب أن يكون أحد 'dh'
(لـ Diffie-Hellman)، 'ec'
، 'x448'
، أو 'x25519'
(لـ ECDH).
crypto.fips
مضاف في: v6.0.0
مُهمل منذ: v10.0.0
[مستقر: 0 - مُهمل]
مستقر: 0 استقرار: 0 - مُهمل
خاصية للتحقق والتحكم فيما إذا كان موفر تشفير متوافق مع FIPS قيد الاستخدام حاليًا. يتطلب التعيين على true إصدارًا من Node.js متوافقًا مع FIPS.
هذه الخاصية مُهملة. يرجى استخدام crypto.setFips()
و crypto.getFips()
بدلاً من ذلك.
crypto.generateKey(type, options, callback)
[History]
الإصدار | التغييرات |
---|---|
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)
[History]
الإصدار | التغييرات |
---|---|
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()
المُعدلة، فإنها تُرجع Promise
لكائن Object
مع خصائص publicKey
و privateKey
.
crypto.generateKeyPairSync(type, options)
[History]
الإصدار | التغييرات |
---|---|
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)
تم الإضافة في: v15.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]])
[History]
الإصدار | التغييرات |
---|---|
v18.0.0 | يؤدي تمرير مُستدعى غير صالح إلى وسيطة callback الآن إلى إرسال ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK . |
v15.8.0 | تم الإضافة في: 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
.
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>قيمة الإرجاع: <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 و bobSecret متطابقين */
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 و bobSecret متطابقين */
console.log(aliceSecret === bobSecret)
crypto.getFips()
مضاف في: v10.0.0
- الإرجاع: <number>
1
إذا وفقط إذا كان موفر تشفير متوافق مع FIPS قيد الاستخدام حاليًا،0
بخلاف ذلك. قد يُغيّر إصدار رئيسي من semver في المستقبل نوع الإرجاع لهذا الـ API إلى <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)
[History]
الإصدار | التغييرات |
---|---|
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)
[History]
الإصدار | التغييرات |
---|---|
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 بايت).- القيمة المُرجعة: <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
<سلسلة> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>salt
<سلسلة> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>iterations
<رقم>keylen
<رقم>digest
<سلسلة>callback
<دالة>
يوفر تنفيذًا غير متزامن لوظيفة اشتقاق مفتاح تعتمد على كلمة المرور 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)
[History]
الإصدار | التغييرات |
---|---|
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)
[History]
الإصدار | التغييرات |
---|---|
v21.6.2، v20.11.1، v18.19.1 | تم تعطيل حشو RSA_PKCS1_PADDING ما لم يدعم بنية OpenSSL الرفض الضمني. |
v15.0.0 | تمت إضافة السلسلة، وArrayBuffer، وCryptoKey كأنواع مفاتيح مسموح بها. يمكن أن يكون oaepLabel عبارة عن ArrayBuffer. يمكن أن يكون المخزن المؤقت سلسلة أو 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 وMGF1. الافتراضي:'sha1'
oaepLabel
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> الملصق الذي سيتم استخدامه لحشو OAEP. إذا لم يتم تحديده، فلن يتم استخدام أي ملصق.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>الإرجاع: <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 | تدعم هذه الوظيفة الآن كائنات المفاتيح. |
1.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>الإرجاع: <Buffer>
Buffer
جديد يحتوي على المحتوى المشفر.
يشفر buffer
باستخدام privateKey
. يمكن فك تشفير البيانات المُرجعة باستخدام المفتاح العام المقابل، على سبيل المثال باستخدام crypto.publicDecrypt()
.
إذا لم يكن privateKey
KeyObject
، فإن هذه الوظيفة تتصرف كما لو تم تمرير privateKey
إلى crypto.createPrivateKey()
. إذا كان كائنًا، فيمكن تمرير خاصية padding
. خلاف ذلك، تستخدم هذه الوظيفة RSA_PKCS1_PADDING
.
crypto.publicDecrypt(key, buffer)
[السجل]
الإصدار | التغييرات |
---|---|
v15.0.0 | تمت إضافة سلسلة، وArrayBuffer، وCryptoKey كأنواع مفاتيح مسموح بها. يمكن أن تكون عبارة المرور ArrayBuffer. يمكن أن تكون العازلة سلسلة أو ArrayBuffer. جميع الأنواع التي تقبل العوازل محدودة بحد أقصى 2 ** 31 - 1 بايت. |
v11.6.0 | تدعم هذه الوظيفة الآن كائنات المفاتيح. |
1.1.0 | تمت الإضافة في: v1.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>الإرجاع: <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 وكلمة المرور 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>الإرجاع: <Buffer>
Buffer
جديد يحتوي على المحتوى المشفر.
يشفر محتوى buffer
باستخدام key
ويعيد Buffer
جديدًا Buffer
يحتوي على المحتوى المشفر. يمكن فك تشفير البيانات المُرجعة باستخدام المفتاح الخاص المقابل، على سبيل المثال باستخدام crypto.privateDecrypt()
.
إذا لم يكن key
KeyObject
، فإن هذه الدالة تتصرف كما لو تم تمرير key
إلى crypto.createPublicKey()
. إذا كان كائنًا، فيمكن تمرير خاصية padding
. خلاف ذلك، تستخدم هذه الدالة RSA_PKCS1_OAEP_PADDING
.
بما أن مفاتيح RSA العامة يمكن اشتقاقها من المفاتيح الخاصة، فيمكن تمرير مفتاح خاص بدلاً من مفتاح عام.
crypto.randomBytes(size[, callback])
[History]
الإصدار | التغييرات |
---|---|
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)
[History]
الإصدار | التغييرات |
---|---|
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'))
})
// ما سبق يعادل ما يلي:
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'))
})
// ما سبق يعادل ما يلي:
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])
[History]
الإصدار | التغييرات |
---|---|
v9.0.0 | جوز argument 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'))
// ما سبق يعادل ما يلي:
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'))
// ما سبق يعادل ما يلي:
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])
[History]
الإصدار | التغييرات |
---|---|
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(`العدد العشوائي المختار من (0، 1، 2): ${n}`)
})
// غير متزامن
const { randomInt } = require('node:crypto')
randomInt(3, (err, n) => {
if (err) throw err
console.log(`العدد العشوائي المختار من (0، 1، 2): ${n}`)
})
// متزامن
const { randomInt } = await import('node:crypto')
const n = randomInt(3)
console.log(`العدد العشوائي المختار من (0، 1، 2): ${n}`)
// متزامن
const { randomInt } = require('node:crypto')
const n = randomInt(3)
console.log(`العدد العشوائي المختار من (0، 1، 2): ${n}`)
// مع وسيطة `min`
const { randomInt } = await import('node:crypto')
const n = randomInt(1, 7)
console.log(`رمي النرد: ${n}`)
// مع وسيطة `min`
const { randomInt } = require('node:crypto')
const n = randomInt(1, 7)
console.log(`رمي النرد: ${n}`)
crypto.randomUUID([options])
مضاف في: v15.6.0، v14.17.0
options
<Object>disableEntropyCache
<boolean> بشكل افتراضي، لتحسين الأداء، يقوم Node.js بإنشاء البيانات العشوائية وتخزينها مؤقتًا بما يكفي لإنشاء ما يصل إلى 128 UUID عشوائيًا. لإنشاء UUID بدون استخدام ذاكرة التخزين المؤقت، عيّنdisableEntropyCache
إلىtrue
. الافتراضي:false
.
الإرجاع: <string>
يُنشئ معرف UUID إصدار 4 عشوائيًا وفقًا لـ RFC 4122. يتم إنشاء معرف 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
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>keylen
<number>options
<Object>cost
<number> معلمة تكلفة وحدة المعالجة المركزية/الذاكرة. يجب أن تكون قوة اثنين أكبر من واحد. الافتراضي: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
.
callback
<Function>
يوفر تطبيقًا غير متزامن لـ 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])
[History]
الإصدار | التغييرات |
---|---|
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> معلمة تكلفة وحدة المعالجة المركزية/الذاكرة. يجب أن تكون قوة اثنين أكبر من واحد. الافتراضي: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
.
قيمة الإرجاع: <Buffer>
يوفر تنفيذًا متزامنًا لـ scrypt. Scrypt هي دالة اشتقاق مفتاح تعتمد على كلمة المرور مصممة لتكون مكلفة من حيث الحساب والذاكرة من أجل جعل هجمات القوة الغاشمة غير مجدية.
يجب أن يكون salt
فريدًا قدر الإمكان. يوصى بأن يكون 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 (يتم اختيارها بواسطة flags). دعم المحركات المخصصة في 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
<سلسلة> | <لا شيء> | <غير مُعرّف>data
<ArrayBuffer> | <عازلة> | <TypedArray> | <DataView>key
<كائن> | <سلسلة> | <ArrayBuffer> | <عازلة> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>signature
<ArrayBuffer> | <عازلة> | <TypedArray> | <DataView>callback
<دالة>err
<خطأ>result
<قيمة منطقية>
القيمة المُرجعة: <قيمة منطقية>
true
أوfalse
بناءً على صحة التوقيع للبيانات والمفتاح العام إذا لم يتم توفير دالةcallback
.
تتحقق من التوقيع المعطى لـ data
باستخدام المفتاح والخوارزمية المعطاة. إذا كان algorithm
يساوي null
أو undefined
، فإن الخوارزمية تعتمد على نوع المفتاح (خاصةً Ed25519 و Ed448).
إذا لم يكن key
KeyObject
، فإن هذه الوظيفة تتصرف كما لو تم تمرير key
إلى crypto.createPublicKey()
. إذا كان كائنًا، فيمكن تمرير خصائص إضافية كما يلي:
dsaEncoding
<سلسلة> بالنسبة إلى DSA و ECDSA، يحدد هذا الخيار تنسيق التوقيع. يمكن أن يكون أحد ما يلي:'der'
(افتراضي): ترميز هيكل توقيع ASN.1 المُشفر بـ DER(r, s)
.'ieee-p1363'
: تنسيق التوقيعr || s
كما هو مُقترح في IEEE-P1363.
padding
<عدد صحيح> قيمة التعبئة الاختيارية لـ RSA، أحد ما يلي:crypto.constants.RSA_PKCS1_PADDING
(افتراضي)crypto.constants.RSA_PKCS1_PSS_PADDING
سيستخدم RSA_PKCS1_PSS_PADDING
MGF1 مع نفس دالة التجزئة المُستخدمة لتوقيع الرسالة كما هو مُحدد في القسم 3.1 من RFC 4055.
saltLength
<عدد صحيح> طول الملح عندما يكون التعبئةRSA_PKCS1_PSS_PADDING
. تُعيّن القيمة الخاصةcrypto.constants.RSA_PSS_SALTLEN_DIGEST
طول الملح إلى حجم التجزئة،crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(افتراضي) تُعيّنه إلى أقصى قيمة مُسموح بها.
وسيطة signature
هي التوقيع المُحسَب سابقًا لـ data
.
بما أن المفاتيح العامة يمكن اشتقاقها من المفاتيح الخاصة، يمكن تمرير مفتاح خاص أو مفتاح عام لـ key
.
إذا تم توفير دالة callback
، فإن هذه الوظيفة تستخدم تجمع خيوط libuv.
crypto.webcrypto
مضاف في: v15.0.0
النوع: <Crypto> تطبيق لمعيار واجهة برمجة التطبيقات Web Crypto.
راجع وثائق واجهة برمجة التطبيقات Web Crypto للحصول على التفاصيل.
ملاحظات
استخدام السلاسل كمدخلات لواجهات برمجة التطبيقات المشفرة
لأسباب تاريخية، تقبل العديد من واجهات برمجة التطبيقات المشفرة التي تقدمها 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 الأخرى التي تُنفذ واجهة برمجة التطبيقات streams (مثل update()
، final()
، أو digest()
). أيضًا، قبلت العديد من الطرق وسلّمت سلاسل مُشفّرة بـ'latin1'
افتراضيًا بدلاً من كائنات Buffer
. تم تغيير هذا الإعداد الافتراضي بعد 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 بايت. - يجب أن يكون طول متجه الإنشاء (الرقم المُستخدم لمرة واحدة)
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 ملف تكوين وحدة FIPS.
- ملف تكوين 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 لإضافة امتداد server-hello من إصدار مبكر من مسودة 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 الحالية. |