الفرق بين المراجعتين لصفحة: «Node.js/crypto»
جميل-بيلوني (نقاش | مساهمات) لا ملخص تعديل |
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}' |
||
(4 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 2: | سطر 2: | ||
الاستقرار: 2-مستقر | الاستقرار: 2-مستقر | ||
توفِّر الوحدة crypto وظيفة التشفير (cryptographic functionality) التي تتضمن مجموعةً من المغلفات (wrappers) التي تُستعمَل من أجل دوال شيفرة Hash في OpenSSL، والتشفير HMAC، والتشفير (cipher)، وفك التشفير (decipher)، والتوقيع (sign)، والتحقق (verify). | توفِّر الوحدة <code>crypto</code> وظيفة التشفير (cryptographic functionality) التي تتضمن مجموعةً من المغلفات (wrappers) التي تُستعمَل من أجل دوال شيفرة Hash في OpenSSL، والتشفير HMAC، والتشفير (cipher)، وفك التشفير (decipher)، والتوقيع (sign)، والتحقق (verify). | ||
استعمل الأمر <code>require('crypto')</code> للوصول إلى هذه الوحدة.<syntaxhighlight lang="javascript"> | استعمل الأمر <code>require('crypto')</code> للوصول إلى هذه الوحدة. | ||
const crypto = require('crypto'); | <syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const secret = 'abcdefg'; | const secret = 'abcdefg'; | ||
سطر 16: | سطر 16: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==التحقق من توافر دعم للوحدة crypto== | ==التحقق من توافر دعم للوحدة crypto== | ||
يُحتمَل في بعض الأحيان أن تُبنَى Node.js دون أن تحوي دعمًا للوحدة <code>crypto</code>. في بعض الحالات، سيؤدي استدعاء الأمر <code>require('crypto')</code> إلى رمي خطأٍ.<syntaxhighlight lang="javascript"> let crypto; | يُحتمَل في بعض الأحيان أن تُبنَى Node.js دون أن تحوي دعمًا للوحدة <code>crypto</code>. في بعض الحالات، سيؤدي استدعاء الأمر <code>require('crypto')</code> إلى رمي خطأٍ.<syntaxhighlight lang="javascript">let crypto; | ||
try { | try { | ||
crypto = require('crypto'); | crypto = require('crypto'); | ||
سطر 35: | سطر 35: | ||
*<code>spkac</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | *<code>spkac</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*القيم المعادة: [[Node.js/buffer|<Buffer>]] مكوِّن تحدي المصادقة (challenge، ويدعى أحيانًا challenge–response authentication) لهيكلية بيانات <code>spkac</code> التي تتضمن مفتاحًا عامًا (public key) وتحدِّيًا للمصادقة. | *القيم المعادة: [[Node.js/buffer|<Buffer>]] مكوِّن تحدي المصادقة (challenge، ويدعى أحيانًا challenge–response authentication) لهيكلية بيانات <code>spkac</code> التي تتضمن مفتاحًا عامًا (public key) وتحدِّيًا للمصادقة. | ||
<syntaxhighlight lang="javascript"> const { Certificate } = require('crypto'); | <syntaxhighlight lang="javascript">const { Certificate } = require('crypto'); | ||
const spkac = getSpkacSomehow(); | const spkac = getSpkacSomehow(); | ||
const challenge = Certificate.exportChallenge(spkac); | const challenge = Certificate.exportChallenge(spkac); | ||
سطر 46: | سطر 46: | ||
*القيم المعادة: [[Node.js/buffer|<Buffer>]] مكون المفتاح العام لهيكلية بيانات <code>spkac</code> التي تتضمن مفتاحًا عامًا (public key) وتحدِّيًا للمصادقة (challenge، ويدعى أيضًا challenge–response authentication). | *القيم المعادة: [[Node.js/buffer|<Buffer>]] مكون المفتاح العام لهيكلية بيانات <code>spkac</code> التي تتضمن مفتاحًا عامًا (public key) وتحدِّيًا للمصادقة (challenge، ويدعى أيضًا challenge–response authentication). | ||
*<code>encoding</code>: [[JavaScript/String|<string>]] | *<code>encoding</code>: [[JavaScript/String|<string>]] | ||
<syntaxhighlight lang="javascript"> const { Certificate } = require('crypto'); | <syntaxhighlight lang="javascript">const { Certificate } = require('crypto'); | ||
const spkac = getSpkacSomehow(); | const spkac = getSpkacSomehow(); | ||
const publicKey = Certificate.exportPublicKey(spkac); | const publicKey = Certificate.exportPublicKey(spkac); | ||
سطر 56: | سطر 56: | ||
*<code>spkac</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | *<code>spkac</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*القيم المعادة: [[JavaScript/Boolean|<boolean>]] القيمة <code>true</code> إن كانت هيكلية بيانات <code>spkac</code> صالحة، أو القيمة <code>false</code> خلاف ذلك. | *القيم المعادة: [[JavaScript/Boolean|<boolean>]] القيمة <code>true</code> إن كانت هيكلية بيانات <code>spkac</code> صالحة، أو القيمة <code>false</code> خلاف ذلك. | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="javascript">const { Certificate } = require('crypto'); | ||
const { Certificate } = require('crypto'); | |||
const spkac = getSpkacSomehow(); | const spkac = getSpkacSomehow(); | ||
console.log(Certificate.verifySpkac(Buffer.from(spkac))); | console.log(Certificate.verifySpkac(Buffer.from(spkac))); | ||
سطر 65: | سطر 64: | ||
لمَّا كانت الواجهات الإرثية (legacy interface) مدعومةً إلى الآن، فيمكن إنشاء نسخ جديدة من الصنف <code>crypto.Certificate</code> كما هو موضح في الأمثلة اللاحقة. | لمَّا كانت الواجهات الإرثية (legacy interface) مدعومةً إلى الآن، فيمكن إنشاء نسخ جديدة من الصنف <code>crypto.Certificate</code> كما هو موضح في الأمثلة اللاحقة. | ||
====<code>new crypto.Certificate()</code>==== | ====<code>new crypto.Certificate()</code>==== | ||
يمكن إنشاء نسخ من الصنف <code>Certificate</code> باستعمال الكلمة المفتاحية <code>new</code> أو عبر استدعاء العبارة <code>crypto.Certificate()</code> كدالة:<syntaxhighlight lang=" | يمكن إنشاء نسخ من الصنف <code>Certificate</code> باستعمال الكلمة المفتاحية <code>new</code> أو عبر استدعاء العبارة <code>crypto.Certificate()</code> كدالة: | ||
const crypto = require('crypto'); | <syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const cert1 = new crypto.Certificate(); | const cert1 = new crypto.Certificate(); | ||
سطر 75: | سطر 74: | ||
*<code>spkac</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | *<code>spkac</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*القيم المعادة: [[Node.js/buffer|<Buffer>]] مكوِّن تحدي المصادقة (challenge، أو يدعى أيضًا challenge–response authentication) لهيكلية بيانات spkac التي تتضمن مفتاحًا عامًا (public key) وتحدِّيًا للمصادقة. | *القيم المعادة: [[Node.js/buffer|<Buffer>]] مكوِّن تحدي المصادقة (challenge، أو يدعى أيضًا challenge–response authentication) لهيكلية بيانات spkac التي تتضمن مفتاحًا عامًا (public key) وتحدِّيًا للمصادقة. | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="javascript">const cert = require('crypto').Certificate(); | ||
const cert = require('crypto').Certificate(); | |||
const spkac = getSpkacSomehow(); | const spkac = getSpkacSomehow(); | ||
const challenge = cert.exportChallenge(spkac); | const challenge = cert.exportChallenge(spkac); | ||
سطر 87: | سطر 85: | ||
*القيم المعادة: [[Node.js/buffer|<Buffer>]] مكون المفتاح العام لهيكلية بيانات <code>spkac</code> التي تتضمن مفتاحًا عامًا (public key) وتحدِّيًا للمصادقة (challenge، أو يدعى أيضًا challenge–response authentication). | *القيم المعادة: [[Node.js/buffer|<Buffer>]] مكون المفتاح العام لهيكلية بيانات <code>spkac</code> التي تتضمن مفتاحًا عامًا (public key) وتحدِّيًا للمصادقة (challenge، أو يدعى أيضًا challenge–response authentication). | ||
*<code>encoding</code>: [[JavaScript/String|<string>]] | *<code>encoding</code>: [[JavaScript/String|<string>]] | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript">const cert = require('crypto').Certificate(); | ||
const cert = require('crypto').Certificate(); | |||
const spkac = getSpkacSomehow(); | const spkac = getSpkacSomehow(); | ||
const publicKey = cert.exportPublicKey(spkac); | const publicKey = cert.exportPublicKey(spkac); | ||
سطر 98: | سطر 95: | ||
*<code>spkac</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | *<code>spkac</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*القيم المعادة: [[JavaScript/Boolean|<boolean>]] القيمة <code>true</code> إن كانت هيكلية بيانات <code>spkac</code> صالحة، أو القيمة <code>false</code> خلاف ذلك. | *القيم المعادة: [[JavaScript/Boolean|<boolean>]] القيمة <code>true</code> إن كانت هيكلية بيانات <code>spkac</code> صالحة، أو القيمة <code>false</code> خلاف ذلك. | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript">const cert = require('crypto').Certificate(); | ||
const cert = require('crypto').Certificate(); | |||
const spkac = getSpkacSomehow(); | const spkac = getSpkacSomehow(); | ||
console.log(cert.verifySpkac(Buffer.from(spkac))); | console.log(cert.verifySpkac(Buffer.from(spkac))); | ||
سطر 112: | سطر 108: | ||
يُستعمَل التابعان <code>[[Node.js/crypto#crypto.createCipher.28algorithm.2C password.5B.2C options.5D.29.E2.80.8E|crypto.createCipher()]]</code> أو <code>[[Node.js/crypto#crypto.createCipheriv.28algorithm.2C key.2C iv.5B.2C options.5D.29.E2.80.8E|crypto.createCipheriv()]]</code> لإنشاء نسخٍ من الصنف <code>Cipher</code>. لا يجب إنشاء الكائنات <code>Cipher</code> باستعمال الكلمة المفتاحية <code>new</code> مباشرةً. | يُستعمَل التابعان <code>[[Node.js/crypto#crypto.createCipher.28algorithm.2C password.5B.2C options.5D.29.E2.80.8E|crypto.createCipher()]]</code> أو <code>[[Node.js/crypto#crypto.createCipheriv.28algorithm.2C key.2C iv.5B.2C options.5D.29.E2.80.8E|crypto.createCipheriv()]]</code> لإنشاء نسخٍ من الصنف <code>Cipher</code>. لا يجب إنشاء الكائنات <code>Cipher</code> باستعمال الكلمة المفتاحية <code>new</code> مباشرةً. | ||
يوضِّح المثال التالي كيفية استعمال الكائنات <code>Cipher</code> كمجرى:<syntaxhighlight lang=" | يوضِّح المثال التالي كيفية استعمال الكائنات <code>Cipher</code> كمجرى: | ||
const crypto = require('crypto'); | <syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const cipher = crypto.createCipher('aes192', 'a password'); | const cipher = crypto.createCipher('aes192', 'a password'); | ||
سطر 129: | سطر 125: | ||
cipher.write('some clear text data'); | cipher.write('some clear text data'); | ||
cipher.end(); | cipher.end(); | ||
</syntaxhighlight>ويوضح المثال التالي كيفية استعمال الصنف <code>Cipher</code> مع نقل محتويات المجاري (piped streams):<syntaxhighlight lang=" | </syntaxhighlight>ويوضح المثال التالي كيفية استعمال الصنف <code>Cipher</code> مع نقل محتويات المجاري (piped streams):<syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const crypto = require('crypto'); | |||
const fs = require('fs'); | const fs = require('fs'); | ||
const cipher = crypto.createCipher('aes192', 'a password'); | const cipher = crypto.createCipher('aes192', 'a password'); | ||
سطر 138: | سطر 133: | ||
input.pipe(cipher).pipe(output); | input.pipe(cipher).pipe(output); | ||
</syntaxhighlight>أمَّا المثال التالي، فيوضِّح كيفية استعمال التابعين <code>[[Node.js/crypto#cipher.update.28data.5B.2C inputEncoding.5D.5B.2C outputEncoding.5D.29.E2.80.8E|cipher.update()]]</code> و [[Node.js/crypto#cipher.final.28.5BoutputEncoding.5D.29|<code>cipher.final()</code>]]:<syntaxhighlight lang="javascript"> | </syntaxhighlight>أمَّا المثال التالي، فيوضِّح كيفية استعمال التابعين <code>[[Node.js/crypto#cipher.update.28data.5B.2C inputEncoding.5D.5B.2C outputEncoding.5D.29.E2.80.8E|cipher.update()]]</code> و [[Node.js/crypto#cipher.final.28.5BoutputEncoding.5D.29|<code>cipher.final()</code>]]: | ||
const crypto = require('crypto'); | <syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const cipher = crypto.createCipher('aes192', 'a password'); | const cipher = crypto.createCipher('aes192', 'a password'); | ||
سطر 169: | سطر 164: | ||
===<code>cipher.setAutoPadding([autoPadding])</code>=== | ===<code>cipher.setAutoPadding([autoPadding])</code>=== | ||
أضيف في الإصدار: v0.7.1. | أضيف في الإصدار: v0.7.1. | ||
*<code>autoPadding</code>: <boolean>قيمة منطقية. القيمة الافتراضية هي: true. | *<code>autoPadding</code>: [[JavaScript/Boolean|<boolean>]]قيمة منطقية. القيمة الافتراضية هي: <code>true</code>. | ||
*القيم المعادة: [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Cipher|<Cipher>]] كائن من النوع [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Cipher|<code>Cipher</code>]] من أجل تقييد التابع (method chaining). | *القيم المعادة: [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Cipher|<Cipher>]] كائن من النوع [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Cipher|<code>Cipher</code>]] من أجل تقييد التابع (method chaining). | ||
عند استعمال خوارزميات التشفير الكتلية (block encryption algorithms)، سيضيف الصنف [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Cipher|<code>Cipher</code>]] حاشية (padding) إلى البيانات المدخلة تلقائيًا لتتلاءم مع حجم الكتلة. لتعطيل هذا السلوك الافتراضي، استدعِ التابع بالشكل <code>cipher.setAutoPadding(false)</code>. | عند استعمال خوارزميات التشفير الكتلية (block encryption algorithms)، سيضيف الصنف [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Cipher|<code>Cipher</code>]] حاشية (padding) إلى البيانات المدخلة تلقائيًا لتتلاءم مع حجم الكتلة. لتعطيل هذا السلوك الافتراضي، استدعِ التابع بالشكل <code>cipher.setAutoPadding(false)</code>. | ||
سطر 188: | سطر 183: | ||
|أضيف هذا التابع. | |أضيف هذا التابع. | ||
|} | |} | ||
*<code>data</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | <TypedArray> | <DataView> | *<code>data</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*<code>inputEncoding</code>: [[JavaScript/String|<string>]] | *<code>inputEncoding</code>: [[JavaScript/String|<string>]] | ||
*<code>outputEncoding</code>: [[JavaScript/String|<string>]] | *<code>outputEncoding</code>: [[JavaScript/String|<string>]] | ||
سطر 203: | سطر 198: | ||
يُستعمَل التابعان <code>[[Node.js/crypto#crypto.createDecipher.28algorithm.2C password.5B.2C options.5D.29.E2.80.8E|crypto.createDecipher()]]</code> أو <code>[[Node.js/crypto#crypto.createDecipheriv.28algorithm.2C key.2C iv.5B.2C options.5D.29.E2.80.8E|crypto.createDecipheriv()]]</code> لإنشاء نسخٍ من الصنف <code>Decipher</code>. لا يجب إنشاء الكائنات <code>Decipher</code> مباشرةً باستعمال الكلمة المفتاحية <code>new</code>. | يُستعمَل التابعان <code>[[Node.js/crypto#crypto.createDecipher.28algorithm.2C password.5B.2C options.5D.29.E2.80.8E|crypto.createDecipher()]]</code> أو <code>[[Node.js/crypto#crypto.createDecipheriv.28algorithm.2C key.2C iv.5B.2C options.5D.29.E2.80.8E|crypto.createDecipheriv()]]</code> لإنشاء نسخٍ من الصنف <code>Decipher</code>. لا يجب إنشاء الكائنات <code>Decipher</code> مباشرةً باستعمال الكلمة المفتاحية <code>new</code>. | ||
يوضح المثال التالي كيفية استعمال الكائنات <code>Decipher</code> كمجاري:<syntaxhighlight lang=" | يوضح المثال التالي كيفية استعمال الكائنات <code>Decipher</code> كمجاري: | ||
const crypto = require('crypto'); | <syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const decipher = crypto.createDecipher('aes192', 'a password'); | const decipher = crypto.createDecipher('aes192', 'a password'); | ||
سطر 222: | سطر 217: | ||
decipher.write(encrypted, 'hex'); | decipher.write(encrypted, 'hex'); | ||
decipher.end(); | decipher.end(); | ||
</syntaxhighlight>ويوضح المثال التالي كيفية استعمال الصنف <code>decipher</code> مع نقل محتويات المجاري (piped streams):<syntaxhighlight lang=" | </syntaxhighlight>ويوضح المثال التالي كيفية استعمال الصنف <code>decipher</code> مع نقل محتويات المجاري (piped streams):<syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const crypto = require('crypto'); | |||
const fs = require('fs'); | const fs = require('fs'); | ||
const decipher = crypto.createDecipher('aes192', 'a password'); | const decipher = crypto.createDecipher('aes192', 'a password'); | ||
سطر 231: | سطر 225: | ||
input.pipe(decipher).pipe(output); | input.pipe(decipher).pipe(output); | ||
</syntaxhighlight>أما المثال التالي، يوضح كيفية استعمال التابعين <code>[[Node.js/crypto#cipher.update.28data.5B.2C inputEncoding.5D.5B.2C outputEncoding.5D.29.E2.80.8E|cipher.update()]]</code> و [[Node.js/crypto#cipher.final.28.5BoutputEncoding.5D.29|<code>cipher.final()</code>]]:<syntaxhighlight lang=" | </syntaxhighlight>أما المثال التالي، يوضح كيفية استعمال التابعين <code>[[Node.js/crypto#cipher.update.28data.5B.2C inputEncoding.5D.5B.2C outputEncoding.5D.29.E2.80.8E|cipher.update()]]</code> و [[Node.js/crypto#cipher.final.28.5BoutputEncoding.5D.29|<code>cipher.final()</code>]]: | ||
const crypto = require('crypto'); | <syntaxhighlight lang="javascript"> const crypto = require('crypto'); | ||
const decipher = crypto.createDecipher('aes192', 'a password'); | const decipher = crypto.createDecipher('aes192', 'a password'); | ||
سطر 259: | سطر 253: | ||
|أضيف هذا التابع. | |أضيف هذا التابع. | ||
|} | |} | ||
*<code>buffer</code>: [[Node.js/buffer|<Buffer>]] | <TypedArray> | <DataView> | *<code>buffer</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*<code>options</code>: <Object> خيارات التابع <code>stream.transform</code>. | *<code>options</code>: <Object> خيارات التابع <code>stream.transform</code>. | ||
**<code>plaintextLength</code>: <number> | **<code>plaintextLength</code>: <number> | ||
سطر 268: | سطر 262: | ||
الوسيط <code>options</code> هو اختياري من أجل الوضع GCM. عند استعمال الوضع CCM، يجب أن يُحدَّد الخيار <code>plaintextLength</code> وأن تُطابِق قيمته طول النص المجرَّد (plaintext) بواحدة البايت. ارجع إلى الوضع CCM في الأسفل للمزيد من المعلومات. | الوسيط <code>options</code> هو اختياري من أجل الوضع GCM. عند استعمال الوضع CCM، يجب أن يُحدَّد الخيار <code>plaintextLength</code> وأن تُطابِق قيمته طول النص المجرَّد (plaintext) بواحدة البايت. ارجع إلى الوضع CCM في الأسفل للمزيد من المعلومات. | ||
يجب أن يستدعى التابع <code>[[Node.js/crypto#decipher.setAAD.28buffer.5B.2C options.5D.29.E2.80.8E|decipher.setAAD()]]</code> قبل استدعاء التابع <code>[[decipher.update()]]</code>. | يجب أن يستدعى التابع <code>[[Node.js/crypto#decipher.setAAD.28buffer.5B.2C options.5D.29.E2.80.8E|decipher.setAAD()]]</code> قبل استدعاء التابع <code>[[Node.js/crypto#decipher.update.28data.5B.2C inputEncoding.5D.5B.2C outputEncoding.5D.29.E2.80.8E|decipher.update()]]</code>. | ||
===<code>decipher.setAuthTag(buffer)</code>=== | ===<code>decipher.setAuthTag(buffer)</code>=== | ||
{| class="wikitable mw-collapsible" | {| class="wikitable mw-collapsible" | ||
سطر 281: | سطر 275: | ||
|أضيف هذا التابع. | |أضيف هذا التابع. | ||
|} | |} | ||
*<code>buffer</code>: [[Node.js/buffer|<Buffer>]] | <TypedArray> | <DataView> | *<code>buffer</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*القيم المعادة: [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Decipher|<Decipher>]] الكائن <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Decipher|Decipher]]</code> من أجل تقييد التابع (method chaining). | *القيم المعادة: [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Decipher|<Decipher>]] الكائن <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Decipher|Decipher]]</code> من أجل تقييد التابع (method chaining). | ||
عند استعمال وضع التشفير الموثوق (authenticated encryption mode) -مثل GCM أو CCM أو OCB المدعومة حاليًا-، تُستعمَل الدالة decipher.setAuthTag() لتمرير بطاقة المصادقة (authentication tag) المُستلمَة. إن لم تُعطَ أية بطاقة أو تم العبث بالنص المشفر، فسيرمي التابع <code>[[Node.js/crypto#decipher.final.28.5BoutputEncoding.5D.29.E2.80.8E|decipher.final()]]</code> خطأً يشير إلى أنَّ النص المشفر يجب إهماله بسبب فشل المصادقة. انتبه إلى أنَّ إصدار Node.js هذا لا يتحقق من طول بطاقات المصادقة في الوضع GCM. يجب تنفيذ مثل هذا التحقق باستعمال تطبيقات أخرى لأهميته الكبيرة في موثوقية البيانات المشفَّرة، وإلا سيتمكن أي مهاجم من استعمال أية بطاقة مصادقة قصيرة اعتباطية لزيادة فرصة اجتياز المصادقة بنجاح (بنسبة تصل إلى 0.39%). يوصى بشدة قرن إحدى القيم 16، أو 15، أو 14، أو 13، أو 12، أو 8، أو 4 بايت مع كل مفتاح للمصادقة على البطاقات التي لها نفس الطول المحدد فقط. انظر أيضًا NIST SP 800-38D. يجب استدعاء التابع decipher.setAuthTag() قبل التابع <code>[[Node.js/crypto#decipher.final.28.5BoutputEncoding.5D.29.E2.80.8E|decipher.final()]]</code>. | عند استعمال وضع التشفير الموثوق (authenticated encryption mode) -مثل GCM أو CCM أو OCB المدعومة حاليًا-، تُستعمَل الدالة decipher.setAuthTag() لتمرير بطاقة المصادقة (authentication tag) المُستلمَة. إن لم تُعطَ أية بطاقة أو تم العبث بالنص المشفر، فسيرمي التابع <code>[[Node.js/crypto#decipher.final.28.5BoutputEncoding.5D.29.E2.80.8E|decipher.final()]]</code> خطأً يشير إلى أنَّ النص المشفر يجب إهماله بسبب فشل المصادقة. انتبه إلى أنَّ إصدار Node.js هذا لا يتحقق من طول بطاقات المصادقة في الوضع GCM. يجب تنفيذ مثل هذا التحقق باستعمال تطبيقات أخرى لأهميته الكبيرة في موثوقية البيانات المشفَّرة، وإلا سيتمكن أي مهاجم من استعمال أية بطاقة مصادقة قصيرة اعتباطية لزيادة فرصة اجتياز المصادقة بنجاح (بنسبة تصل إلى 0.39%). يوصى بشدة قرن إحدى القيم 16، أو 15، أو 14، أو 13، أو 12، أو 8، أو 4 بايت مع كل مفتاح للمصادقة على البطاقات التي لها نفس الطول المحدد فقط. انظر أيضًا NIST SP 800-38D. يجب استدعاء التابع decipher.setAuthTag() قبل التابع <code>[[Node.js/crypto#decipher.final.28.5BoutputEncoding.5D.29.E2.80.8E|decipher.final()]]</code>. | ||
سطر 301: | سطر 295: | ||
|أضيف هذا التابع. | |أضيف هذا التابع. | ||
|} | |} | ||
*<code>data</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | <TypedArray> | <DataView> | *<code>data</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*<code>inputEncoding</code>: [[JavaScript/String|<string>]] | *<code>inputEncoding</code>: [[JavaScript/String|<string>]] | ||
*<code>outputEncoding</code>: [[JavaScript/String|<string>]] | *<code>outputEncoding</code>: [[JavaScript/String|<string>]] | ||
سطر 315: | سطر 309: | ||
الصنف <code>DiffieHellman</code> هو أداة لإنشاء تبادلات مفتاح Diffie-Hellman. | الصنف <code>DiffieHellman</code> هو أداة لإنشاء تبادلات مفتاح Diffie-Hellman. | ||
يمكن إنشاء نسخٍ من الصنف <code>DiffieHellman</code> باستعمال الدالة <code>[[Node.js/crypto#crypto.createDiffieHellman.28prime.5B.2C primeEncoding.5D.5B.2C generator.5D.5B.2C generatorEncoding.5D.29.E2.80.8E|crypto.createDiffieHellman()]]</code>.<syntaxhighlight lang=" | يمكن إنشاء نسخٍ من الصنف <code>DiffieHellman</code> باستعمال الدالة <code>[[Node.js/crypto#crypto.createDiffieHellman.28prime.5B.2C primeEncoding.5D.5B.2C generator.5D.5B.2C generatorEncoding.5D.29.E2.80.8E|crypto.createDiffieHellman()]]</code>.<syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const crypto = require('crypto'); | |||
const assert = require('assert'); | const assert = require('assert'); | ||
سطر 336: | سطر 329: | ||
===<code>diffieHellman.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])</code>=== | ===<code>diffieHellman.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])</code>=== | ||
أضيف في الإصدار: v0.5.0. | أضيف في الإصدار: v0.5.0. | ||
*<code>otherPublicKey</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | <TypedArray> | <DataView> | *<code>otherPublicKey</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*<code>inputEncoding</code>: [[JavaScript/String|<string>]] | *<code>inputEncoding</code>: [[JavaScript/String|<string>]] | ||
*<code>outputEncoding</code>: [[JavaScript/String|<string>]] | *<code>outputEncoding</code>: [[JavaScript/String|<string>]] | ||
سطر 350: | سطر 343: | ||
===<code>diffieHellman.getGenerator([encoding])</code>=== | ===<code>diffieHellman.getGenerator([encoding])</code>=== | ||
أضيف في الإصدار: v0.5.0. | أضيف في الإصدار: v0.5.0. | ||
* <code>Encoding</code>: [[JavaScript/String|<string>]] | *<code>Encoding</code>: [[JavaScript/String|<string>]] | ||
القيم المعادة: [[Node.js/buffer|<Buffer>]] | [[JavaScript/String|<string>]] يعيد هذا التابع مولد Diffie-Hellman مرمزًا بالترميز <code>encoding</code> المعطى، والذي يمكن أن يكون <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>. إن أعطي الوسيط <code>encoding</code>، فستُعاد سلسلة نصية؛ خلا ذلك، سيعاد كائن من النوع <code>[[Node.js/buffer|Buffer]]</code>. | القيم المعادة: [[Node.js/buffer|<Buffer>]] | [[JavaScript/String|<string>]] يعيد هذا التابع مولد Diffie-Hellman مرمزًا بالترميز <code>encoding</code> المعطى، والذي يمكن أن يكون <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>. إن أعطي الوسيط <code>encoding</code>، فستُعاد سلسلة نصية؛ خلا ذلك، سيعاد كائن من النوع <code>[[Node.js/buffer|Buffer]]</code>. | ||
===<code>diffieHellman.getPrime([encoding])</code>=== | ===<code>diffieHellman.getPrime([encoding])</code>=== | ||
سطر 366: | سطر 359: | ||
*<code>encoding</code>: [[JavaScript/String|<string>]] | *<code>encoding</code>: [[JavaScript/String|<string>]] | ||
*القيم المعادة: [[Node.js/buffer|<Buffer>]] | [[JavaScript/String|<string>]] | *القيم المعادة: [[Node.js/buffer|<Buffer>]] | [[JavaScript/String|<string>]] | ||
يعيد هذا التابع مفتاح Diffie-Hellman العام (public key) مرمزًا بالترميز encoding المعطى، والذي يمكن أن يكون <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>. إن أعطي الوسيط <code>encoding</code>، فستُعاد سلسلة نصية؛ خلا ذلك، سيعاد كائن من النوع <code>[[Node.js/buffer|Buffer]]</code>. | يعيد هذا التابع مفتاح Diffie-Hellman العام (public key) مرمزًا بالترميز <code>encoding</code> المعطى، والذي يمكن أن يكون <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>. إن أعطي الوسيط <code>encoding</code>، فستُعاد سلسلة نصية؛ خلا ذلك، سيعاد كائن من النوع <code>[[Node.js/buffer|Buffer]]</code>. | ||
===<code>diffieHellman.setPrivateKey(privateKey[, encoding])</code>=== | ===<code>diffieHellman.setPrivateKey(privateKey[, encoding])</code>=== | ||
أضيف في الإصدار: v0.5.0. | أضيف في الإصدار: v0.5.0. | ||
*<code>privateKey</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | <TypedArray> | <DataView> | *<code>privateKey</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*<code>encoding</code>: [[JavaScript/String|<string>]] | *<code>encoding</code>: [[JavaScript/String|<string>]] | ||
يضبط هذا التابع مفتاح Diffie-Hellman الخاص (private key). إن أعطي الوسيط encoding وكانت قيمته إمَّا <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>، فسيُتوقَع أن يكون الوسيط <code>privateKey</code> سلسلةً نصيةً. أمَّا إن لم يُعطَ الوسيط | يضبط هذا التابع مفتاح Diffie-Hellman الخاص (private key). إن أعطي الوسيط <code>encoding</code> وكانت قيمته إمَّا <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>، فسيُتوقَع أن يكون الوسيط <code>privateKey</code> سلسلةً نصيةً. أمَّا إن لم يُعطَ الوسيط <code>encoding</code>، فسيُتوقَّع أن يكون الوسيط <code>privateKey</code> كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>. | ||
===<code>diffieHellman.setPublicKey(publicKey[, encoding])</code>=== | ===<code>diffieHellman.setPublicKey(publicKey[, encoding])</code>=== | ||
أضيف في الإصدار: v0.5.0. | أضيف في الإصدار: v0.5.0. | ||
*<code>publicKey</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | <TypedArray> | <DataView> | *<code>publicKey</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*<code>encoding</code>: [[JavaScript/String|<string>]] | *<code>encoding</code>: [[JavaScript/String|<string>]] | ||
يضبط هذا التابع مفتاح Diffie-Hellman العام (publicKey key). إن أعطي الوسيط <code>encoding</code> وكانت قيمته إمَّا <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>، فسيُتوقَع أن يكون الوسيط <code>publicKey</code> سلسلةً نصيةً. أمَّا إن لم يُعطَ الوسيط <code>encoding</code>، فسيُتوقَّع أن يكون الوسيط <code>publicKey</code> كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>. | يضبط هذا التابع مفتاح Diffie-Hellman العام (publicKey key). إن أعطي الوسيط <code>encoding</code> وكانت قيمته إمَّا <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>، فسيُتوقَع أن يكون الوسيط <code>publicKey</code> سلسلةً نصيةً. أمَّا إن لم يُعطَ الوسيط <code>encoding</code>، فسيُتوقَّع أن يكون الوسيط <code>publicKey</code> كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>. | ||
سطر 390: | سطر 383: | ||
الصنف <code>ECDH</code> هو أداةٌ لإنشاء تبادلات مفتاح ECDH (اختصارٌ للعبارة Elliptic Curve Diffie-Hellman). | الصنف <code>ECDH</code> هو أداةٌ لإنشاء تبادلات مفتاح ECDH (اختصارٌ للعبارة Elliptic Curve Diffie-Hellman). | ||
يمكن إنشاء نسخٍ من الصنف ECDH باستعمال الدالة <code>[[Node.js/crypto#crypto.createECDH.28curveName.29.E2.80.8E|crypto.createECDH()]]</code>.<syntaxhighlight lang=" | يمكن إنشاء نسخٍ من الصنف ECDH باستعمال الدالة <code>[[Node.js/crypto#crypto.createECDH.28curveName.29.E2.80.8E|crypto.createECDH()]]</code>.<syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const crypto = require('crypto'); | |||
const assert = require('assert'); | const assert = require('assert'); | ||
سطر 411: | سطر 403: | ||
===<code>ECDH.convertKey(key, curve[, inputEncoding[, outputEncoding[, format]]])</code>=== | ===<code>ECDH.convertKey(key, curve[, inputEncoding[, outputEncoding[, format]]])</code>=== | ||
أضيف في الإصدار: v10.0.0. | أضيف في الإصدار: v10.0.0. | ||
*<code>key</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | <TypedArray> | <DataView> | *<code>key</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*<code>curve</code>: [[JavaScript/String|<string>]] | *<code>curve</code>: [[JavaScript/String|<string>]] | ||
*<code>inputEncoding</code>: [[JavaScript/String|<string>]] | *<code>inputEncoding</code>: [[JavaScript/String|<string>]] | ||
سطر 423: | سطر 415: | ||
إن لم يُعطَ الوسيط <code>format</code>، فستُستعمَل الصيغة <code>'uncompressed'</code> الافتراضية. | إن لم يُعطَ الوسيط <code>format</code>، فستُستعمَل الصيغة <code>'uncompressed'</code> الافتراضية. | ||
إن لم يُعطَ الوسيط <code>inputEncoding</code>، فسيُتوقَّع من الوسيط <code>key</code> أن يكون كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>.<syntaxhighlight lang=" | إن لم يُعطَ الوسيط <code>inputEncoding</code>، فسيُتوقَّع من الوسيط <code>key</code> أن يكون كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>. | ||
const { createECDH, ECDH } = require('crypto'); | <syntaxhighlight lang="javascript">const { createECDH, ECDH } = require('crypto'); | ||
const ecdh = createECDH('secp256k1'); | const ecdh = createECDH('secp256k1'); | ||
سطر 454: | سطر 446: | ||
|أضيف هذا التابع. | |أضيف هذا التابع. | ||
|} | |} | ||
*<code>otherPublicKey</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | <TypedArray> | <DataView> | *<code>otherPublicKey</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*<code>inputEncoding</code>: [[JavaScript/String|<string>]] | *<code>inputEncoding</code>: [[JavaScript/String|<string>]] | ||
*<code>outputEncoding</code>: [[JavaScript/String|<string>]] | *<code>outputEncoding</code>: [[JavaScript/String|<string>]] | ||
*القيم المعادة: [[Node.js/buffer|<Buffer>]] | [[JavaScript/String|<string>]] | *القيم المعادة: [[Node.js/buffer|<Buffer>]] | [[JavaScript/String|<string>]] | ||
يحسب هذا التابع السر المشترك (shared secret) مستعملًا الوسيط <code>otherPublicKey</code> على أنَّه المفتاح العام للطرف الآخر ثم يعيده. يُفسَّر المفتاح المعطى باستعمال الترميز inputEncoding المعطى، ويرمَّز السر المعاد بالترميز <code>outputEncoding</code> المحدد. يمكن استعمال أحد الترميزات <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>. إن لم يُعطَ الوسيط <code>inputEncoding</code>، فسيُتوقَّع أن يكون الوسيط <code>otherPublicKey</code> كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>. | يحسب هذا التابع السر المشترك (shared secret) مستعملًا الوسيط <code>otherPublicKey</code> على أنَّه المفتاح العام للطرف الآخر ثم يعيده. يُفسَّر المفتاح المعطى باستعمال الترميز <code>inputEncoding</code> المعطى، ويرمَّز السر المعاد بالترميز <code>outputEncoding</code> المحدد. يمكن استعمال أحد الترميزات <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>. إن لم يُعطَ الوسيط <code>inputEncoding</code>، فسيُتوقَّع أن يكون الوسيط <code>otherPublicKey</code> كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>. | ||
إن أعطي الوسيط <code>outputEncoding</code>، فستُعاد سلسلة نصية؛ خلا ذلك، سيعاد كائن من النوع <code>[[Node.js/buffer|Buffer]]</code>. | إن أعطي الوسيط <code>outputEncoding</code>، فستُعاد سلسلة نصية؛ خلا ذلك، سيعاد كائن من النوع <code>[[Node.js/buffer|Buffer]]</code>. | ||
سطر 475: | سطر 467: | ||
===<code>ecdh.getPrivateKey([encoding])</code>=== | ===<code>ecdh.getPrivateKey([encoding])</code>=== | ||
أضيف في الإصدار: v0.11.14. | أضيف في الإصدار: v0.11.14. | ||
*encoding: [[JavaScript/String|<string>]] | *<code>encoding</code>: [[JavaScript/String|<string>]] | ||
*القيم المعادة: [[Node.js/buffer|<Buffer>]] | [[JavaScript/String|<string>]] | *القيم المعادة: [[Node.js/buffer|<Buffer>]] | [[JavaScript/String|<string>]] | ||
يعيد هذا التابع مفتاح EC Diffie-Hellman الخاص (private key) مرمزًا بالترميز <code>encoding</code> المعطى، والذي يمكن أن يكون <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>. إن أعطي الوسيط <code>encoding</code>، فستُعاد سلسلة نصية؛ خلا ذلك، سيُعاد كائن من النوع <code>[[Node.js/buffer|Buffer]]</code>. | يعيد هذا التابع مفتاح EC Diffie-Hellman الخاص (private key) مرمزًا بالترميز <code>encoding</code> المعطى، والذي يمكن أن يكون <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>. إن أعطي الوسيط <code>encoding</code>، فستُعاد سلسلة نصية؛ خلا ذلك، سيُعاد كائن من النوع <code>[[Node.js/buffer|Buffer]]</code>. | ||
سطر 490: | سطر 482: | ||
===<code>ecdh.setPrivateKey(privateKey[, encoding])</code>=== | ===<code>ecdh.setPrivateKey(privateKey[, encoding])</code>=== | ||
أضيف في الإصدار: v0.11.14. | أضيف في الإصدار: v0.11.14. | ||
*<code>privateKey</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | <TypedArray> | <DataView> | *<code>privateKey</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*<code>encoding</code>: [[JavaScript/String|<string>]] | *<code>encoding</code>: [[JavaScript/String|<string>]] | ||
يضبط هذا التابع مفتاح EC Diffie-Hellman الخاص (private key). إن أعطي الوسيط <code>encoding</code> وكانت قيمته <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>، فسيُتوقَّع أن يكون الوسيط <code>privateKey</code> سلسلةً نصيةً. أمَّا إن لم يعطَ الوسيط <code>encoding</code>، فسيُتوقَّع أن يكون الوسيط <code>privateKey</code> كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>. | يضبط هذا التابع مفتاح EC Diffie-Hellman الخاص (private key). إن أعطي الوسيط <code>encoding</code> وكانت قيمته <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>، فسيُتوقَّع أن يكون الوسيط <code>privateKey</code> سلسلةً نصيةً. أمَّا إن لم يعطَ الوسيط <code>encoding</code>، فسيُتوقَّع أن يكون الوسيط <code>privateKey</code> كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>. | ||
سطر 497: | سطر 489: | ||
===<code>ecdh.setPublicKey(publicKey[, encoding])</code>=== | ===<code>ecdh.setPublicKey(publicKey[, encoding])</code>=== | ||
أضيف في الإصدار: v0.11.14، وأهمل منذ الإصدار: v5.2.0. الاستقرار: 0-مهمل | أضيف في الإصدار: v0.11.14، وأهمل منذ الإصدار: v5.2.0. الاستقرار: 0-مهمل | ||
*<code>publicKey</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | <TypedArray> | <DataView> | *<code>publicKey</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*<code>encoding</code>: [[JavaScript/String|<string>]] | *<code>encoding</code>: [[JavaScript/String|<string>]] | ||
يضبط هذا التابع مفتاح EC Diffie-Hellman العام (public key). إن أعطي الوسيط <code>encoding</code> وكانت قيمته <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>، فسيُتوقَّع أن يكون الوسيط <code>publicKey</code> سلسلةً نصيةً. أمَّا إن لم يعطَ الوسيط <code>encoding</code>، فسيُتوقَّع أن يكون الوسيط <code>privateKey</code> كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>. | يضبط هذا التابع مفتاح EC Diffie-Hellman العام (public key). إن أعطي الوسيط <code>encoding</code> وكانت قيمته <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>، فسيُتوقَّع أن يكون الوسيط <code>publicKey</code> سلسلةً نصيةً. أمَّا إن لم يعطَ الوسيط <code>encoding</code>، فسيُتوقَّع أن يكون الوسيط <code>privateKey</code> كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>. | ||
انتبه إلى أنَّه لا يوجد أي سبب يحيجك إلى استدعاء هذا التابع لأنَّ الكائن <code>ECDH</code> يتطلَّب مفتاحًا خاصًّا ومفتاحًا عامًا من الطرف الآخر فقط لحساب السر المتشارك. سيستدعى عادةً أحد التابعان <code>[[Node.js/crypto#ecdh.generateKeys.28.5Bencoding.5B.2C format.5D.5D.29.E2.80.8E|ecdh.generateKeys()]]</code> أو <code>[[Node.js/crypto#ecdh.setPrivateKey.28privateKey.5B.2C encoding.5D.29.E2.80.8E|ecdh.setPrivateKey()]]</code>. يحاول التابع <code>[[Node.js/crypto#ecdh.setPrivateKey.28privateKey.5B.2C encoding.5D.29.E2.80.8E|ecdh.setPrivateKey()]]</code> توليد المفتاح العام المرتبط بالمفتاح الخاص الذي ضُبِط.<syntaxhighlight lang=" | انتبه إلى أنَّه لا يوجد أي سبب يحيجك إلى استدعاء هذا التابع لأنَّ الكائن <code>ECDH</code> يتطلَّب مفتاحًا خاصًّا ومفتاحًا عامًا من الطرف الآخر فقط لحساب السر المتشارك. سيستدعى عادةً أحد التابعان <code>[[Node.js/crypto#ecdh.generateKeys.28.5Bencoding.5B.2C format.5D.5D.29.E2.80.8E|ecdh.generateKeys()]]</code> أو <code>[[Node.js/crypto#ecdh.setPrivateKey.28privateKey.5B.2C encoding.5D.29.E2.80.8E|ecdh.setPrivateKey()]]</code>. يحاول التابع <code>[[Node.js/crypto#ecdh.setPrivateKey.28privateKey.5B.2C encoding.5D.29.E2.80.8E|ecdh.setPrivateKey()]]</code> توليد المفتاح العام المرتبط بالمفتاح الخاص الذي ضُبِط.<syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const crypto = require('crypto'); | |||
const alice = crypto.createECDH('secp256k1'); | const alice = crypto.createECDH('secp256k1'); | ||
const bob = crypto.createECDH('secp256k1'); | const bob = crypto.createECDH('secp256k1'); | ||
سطر 526: | سطر 517: | ||
الصنف <code>Hash</code> هو أداةٌ لإنشاء القيم hash للبيانات. يمكن استعمال هذا الصنف بإحدى الطريقتين التاليتين: | الصنف <code>Hash</code> هو أداةٌ لإنشاء القيم hash للبيانات. يمكن استعمال هذا الصنف بإحدى الطريقتين التاليتين: | ||
*يُستعمَل [[Node.js/stream|كمجرًى]] قابلًا للقراءة والكتابة، إذ تكتب فيه البيانات لتوليد القيمة hash المقابلة لها في الجانب القابل للقراءة من هذا المجرى، أو | *يُستعمَل [[Node.js/stream|كمجرًى]] قابلًا للقراءة والكتابة، إذ تكتب فيه البيانات لتوليد القيمة hash المقابلة لها في الجانب القابل للقراءة من هذا المجرى، أو | ||
*يُستعمَل التابعان <code>[[Node.js/crypto#hash.update.28data.5B.2C inputEncoding.5D.29.E2.80.8E|hash.update()]]</code> و <code>hash. | *يُستعمَل التابعان <code>[[Node.js/crypto#hash.update.28data.5B.2C inputEncoding.5D.29.E2.80.8E|hash.update()]]</code> و <code>[[Node.js/crypto#hash.digest.28.5Bencoding.5D.29.E2.80.8E|hash.digest()]]</code> لتوليد القيمة hash المحسوبة. | ||
يُستعمَل التابع <code>[[Node.js/crypto#crypto.createHash.28algorithm.5B.2C options.5D.29.E2.80.8E|crypto.createHash()]]</code> لإنشاء نسخٍ من الصنف <code>Hash</code>. لا يجب إنشاء الكائنات <code>Hash</code> باستعمال الكلمة المفتاحية <code>new</code> مباشرةً. | يُستعمَل التابع <code>[[Node.js/crypto#crypto.createHash.28algorithm.5B.2C options.5D.29.E2.80.8E|crypto.createHash()]]</code> لإنشاء نسخٍ من الصنف <code>Hash</code>. لا يجب إنشاء الكائنات <code>Hash</code> باستعمال الكلمة المفتاحية <code>new</code> مباشرةً. | ||
يوضح المثال التالي كيفية استعمال الكائنات <code>Hash</code> كمجاري:<syntaxhighlight lang=" | يوضح المثال التالي كيفية استعمال الكائنات <code>Hash</code> كمجاري: | ||
const crypto = require('crypto'); | <syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const hash = crypto.createHash('sha256'); | const hash = crypto.createHash('sha256'); | ||
سطر 551: | سطر 542: | ||
const input = fs.createReadStream('test.js'); | const input = fs.createReadStream('test.js'); | ||
input.pipe(hash).pipe(process.stdout); | input.pipe(hash).pipe(process.stdout); | ||
</syntaxhighlight>أمَّا المثال التالي، فيوضِّح كيفية استعمال التابعان <code>[[Node.js/crypto#hash.update.28data.5B.2C inputEncoding.5D.29.E2.80.8E|hash.update()]]</code> و <code>hash. | </syntaxhighlight>أمَّا المثال التالي، فيوضِّح كيفية استعمال التابعان <code>[[Node.js/crypto#hash.update.28data.5B.2C inputEncoding.5D.29.E2.80.8E|hash.update()]]</code> و [[Node.js/crypto#hash.digest.28.5Bencoding.5D.29.E2.80.8E|<code>hash.digest()</code>]]: | ||
const crypto = require('crypto'); | <syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const hash = crypto.createHash('sha256'); | const hash = crypto.createHash('sha256'); | ||
سطر 577: | سطر 568: | ||
|أضيف هذا التابع. | |أضيف هذا التابع. | ||
|} | |} | ||
*data: [[JavaScript/String|<string>]] | <Buffer> | <TypedArray> | <DataView> | *<code>data</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*inputEncoding: [[JavaScript/String|<string>]] | *<code>inputEncoding</code>: [[JavaScript/String|<string>]] | ||
يحدِّث هذا التابع محتوى الكائن Hash مع البيانات data المعطاة، وبالترميز inputEncoding المعطى والذي يمكن أن يكون 'utf8'، أو 'ascii'، أو 'latin1'. إن أعطي الوسيط encoding وكانت الوسيط data سلسلةً نصيةً، فسيُفرَض استعمال الترميز 'utf8'. إن كان الوسيط data كائنًا من النوع | يحدِّث هذا التابع محتوى الكائن <code>Hash</code> مع البيانات <code>data</code> المعطاة، وبالترميز <code>inputEncoding</code> المعطى والذي يمكن أن يكون <code>'utf8'</code>، أو <code>'ascii'</code>، أو <code>'latin1'</code>. إن أعطي الوسيط <code>encoding</code> وكانت الوسيط <code>data</code> سلسلةً نصيةً، فسيُفرَض استعمال الترميز <code>'utf8'</code>. إن كان الوسيط <code>data</code> كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>، فسيُتحاهَل حينها الوسيط <code>inputEncoding</code> إن أعطي. يمكن استدعاء هذا التابع عدة مرات مع بيانات جديدة طالما كان متاحًا في المجرى. | ||
==الصنف Hmac== | ==الصنف <code>Hmac</code>== | ||
أضيف في الإصدار: v0.1.94. الصنف Hmac هو أداةٌ لإنشاء التشفير HMAC (اختصارٌ للعبارة keyed-hash message authentication code أو العبارة hash-based message authentication code) للبيانات. يمكن استعمال هذا الصنف بإحدى الطريقتين التاليتين: | أضيف في الإصدار: v0.1.94. الصنف <code>Hmac</code> هو أداةٌ لإنشاء التشفير HMAC (اختصارٌ للعبارة keyed-hash message authentication code أو العبارة hash-based message authentication code) للبيانات. يمكن استعمال هذا الصنف بإحدى الطريقتين التاليتين: | ||
*يُستعمَل كمجرًى قابلًا للقراءة والكتابة، إذ تكتب فيه البيانات لتوليد التشفير HMAC المقابل لها في الجانب القابل للقراءة من هذا المجرى، أو | *يُستعمَل [[Node.js/stream|كمجرًى]] قابلًا للقراءة والكتابة، إذ تكتب فيه البيانات لتوليد التشفير <code>HMAC</code> المقابل لها في الجانب القابل للقراءة من هذا المجرى، أو | ||
*يُستعمَل التابعان | *يُستعمَل التابعان <code>[[Node.js/crypto#hmac.update.28data.5B.2C inputEncoding.5D.29.E2.80.8E|hmac.update()]]</code> و <code>[[Node.js/crypto#hmac.digest.28.5Bencoding.5D.29.E2.80.8E|hmac.digest()]]</code> لتوليد القيمة HMAC المحسوبة. | ||
يُستعمَل التابع crypto.createHmac() لإنشاء نسخٍ من الصنف Hmac. لا يجب إنشاء الكائنات Hmac باستعمال الكلمة المفتاحية new مباشرةً. يوضح المثال التالي كيفية استعمال الكائنات Hmac كمجاري:<syntaxhighlight lang=" | يُستعمَل التابع <code>[[Node.js/crypto#crypto.createHmac.28algorithm.2C key.5B.2C options.5D.29.E2.80.8E|crypto.createHmac()]]</code> لإنشاء نسخٍ من الصنف <code>Hmac</code>. لا يجب إنشاء الكائنات <code>Hmac</code> باستعمال الكلمة المفتاحية <code>new</code> مباشرةً. يوضح المثال التالي كيفية استعمال الكائنات <code>Hmac</code> كمجاري: | ||
const crypto = require('crypto'); | <syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const hmac = crypto.createHmac('sha256', 'a secret'); | const hmac = crypto.createHmac('sha256', 'a secret'); | ||
سطر 599: | سطر 590: | ||
hmac.write('some data to hash'); | hmac.write('some data to hash'); | ||
hmac.end(); | hmac.end(); | ||
</syntaxhighlight>ويوضح المثال التالي كيفية استعمال الصنف Hash مع نقل محتويات المجاري (piped streams):<syntaxhighlight lang="javascript"> | </syntaxhighlight>ويوضح المثال التالي كيفية استعمال الصنف <code>Hash</code> مع نقل محتويات المجاري (piped streams) | ||
const crypto = require('crypto'); | :<syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const fs = require('fs'); | const fs = require('fs'); | ||
const hmac = crypto.createHmac('sha256', 'a secret'); | const hmac = crypto.createHmac('sha256', 'a secret'); | ||
سطر 606: | سطر 597: | ||
const input = fs.createReadStream('test.js'); | const input = fs.createReadStream('test.js'); | ||
input.pipe(hmac).pipe(process.stdout); | input.pipe(hmac).pipe(process.stdout); | ||
</syntaxhighlight>أما المثال التالي، فيُوضِّح كيفية استعمال التابعان hmac.update() و hmac.digest():<syntaxhighlight lang=" | </syntaxhighlight>أما المثال التالي، فيُوضِّح كيفية استعمال التابعان <code>[[Node.js/crypto#hmac.update.28data.5B.2C inputEncoding.5D.29.E2.80.8E|hmac.update()]]</code> و <code>[[Node.js/crypto#hmac.digest.28.5Bencoding.5D.29.E2.80.8E|hmac.digest()]]</code>:<syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const crypto = require('crypto'); | |||
const hmac = crypto.createHmac('sha256', 'a secret'); | const hmac = crypto.createHmac('sha256', 'a secret'); | ||
سطر 615: | سطر 605: | ||
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e | // 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===hmac.digest([encoding])=== | ===<code>hmac.digest([encoding])</code>=== | ||
أضيف في الإصدار: v0.1.94. | أضيف في الإصدار: v0.1.94. | ||
*encoding: [[JavaScript/String|<string>]] | *<code>encoding</code>: [[JavaScript/String|<string>]] | ||
*القيم المعادة: <Buffer> |[[JavaScript/String|<string>]] | *القيم المعادة: [[Node.js/Buffer|<Buffer>]] |[[JavaScript/String|<string>]] | ||
يحسب هذا التابع القيمة hash للتشفير HMAC (إذ يصف المصطلح digest ببساطة عملية إيجاد القيم hash) لجميع البيانات الممررة إليه باستعمال التابع hash.update(). يمكن أن يأخذ الوسيط encoding القيمة | يحسب هذا التابع القيمة hash للتشفير <code>HMAC</code> (إذ يصف المصطلح digest ببساطة عملية إيجاد القيم hash) لجميع البيانات الممررة إليه باستعمال التابع <code>[[Node.js/crypto#hash.update.28data.5B.2C inputEncoding.5D.29.E2.80.8E|hash.update()]]</code>. يمكن أن يأخذ الوسيط <code>encoding</code> القيمة <code>'hex'</code>، أو <code>'latin1'</code>، أو <code>'base64'</code>. إن لم يُعطَ هذا الوسيط، فستُعاد سلسلة نصية؛ خلا ذلك، سيُعاد كائن من النوع <code>[[Node.js.buffer|Buffer]]</code>. لا يمكن استعمال الكائن <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Hmac|Hmac]]</code> مرةً أخرى بعد استدعاء التابع <code>hmac.digest()</code>. سيؤدي استدعاء التابع <code>hmac.digest()</code> عدة مرات إلى رمي خطأٍ. | ||
===hmac.update(data[, inputEncoding])=== | ===<code>hmac.update(data[, inputEncoding])</code>=== | ||
سجل التغييرات | {| class="wikitable mw-collapsible" | ||
|+سجل التغييرات | |||
!الإصدار | |||
*data: [[JavaScript/String|<string>]] | <Buffer> | <TypedArray> | <DataView> | !التغييرات | ||
*inputEncoding: [[JavaScript/String|<string>]] | |- | ||
يحدِّث هذا التابع محتوى الكائن Hmac مع البيانات data المعطاة، وبالترميز inputEncoding المعطى والذي يمكن أن يكون 'utf8'، أو 'ascii'، أو 'latin1'. إن أعطي الوسيط encoding وكانت الوسيط data سلسلة نصية، فسيُفرَض استعمال الترميز 'utf8'. إن كان الوسيط data كائنًا من النوع | |v6.0.0 | ||
==الصنف Sign== | |تغيرت القيمة الافتراضية للوسيط <code>inputEncoding</code> من <code>binary</code> إلى <code>utf8</code>. | ||
أضيف في الإصدار: v0.1.92. الصنف Sign هو أداةٌ لتوليد التواقيع (signatures). يمكن استعمال هذا الصنف بإحدى الطريقتين التاليتين: | |- | ||
*يُستعمَل كمجرًى قابلًا للكتابة، إذ تكتب فيه البيانات المراد توقيعها ثم يُستعمَل التابع sign.sign() لتوليد وإعادة التوقيع، أو | |v0.1.94 | ||
*يُستعمَل التابعان sign.update() و sign.sign() لتوليد التوقيع. | |أضيف هذا التابع. | ||
يُستعمَل التابع crypto.createSign() لإنشاء نسخٍ من الصنف | |} | ||
const crypto = require('crypto'); | *<code>data</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*<code>inputEncoding</code>: [[JavaScript/String|<string>]] | |||
يحدِّث هذا التابع محتوى الكائن <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Hmac|Hmac]]</code> مع البيانات <code>data</code> المعطاة، وبالترميز <code>inputEncoding</code> المعطى والذي يمكن أن يكون <code>'utf8'</code>، أو <code>'ascii'</code>، أو <code>'latin1'</code>. إن أعطي الوسيط <code>encoding</code> وكانت الوسيط <code>data</code> سلسلة نصية، فسيُفرَض استعمال الترميز <code>'utf8'</code>. إن كان الوسيط <code>data</code> كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>، فسيُتحاهَل حينها الوسيط <code>inputEncoding</code> إن أعطي. يمكن استدعاء هذا التابع عدة مرات مع بيانات جديدة طالما كان متاحًا في المجرى. | |||
==الصنف <code>Sign</code>== | |||
أضيف في الإصدار: v0.1.92. الصنف <code>Sign</code> هو أداةٌ لتوليد التواقيع (signatures). يمكن استعمال هذا الصنف بإحدى الطريقتين التاليتين: | |||
*يُستعمَل [[Node.js/stream|كمجرًى]] قابلًا للكتابة، إذ تكتب فيه البيانات المراد توقيعها ثم يُستعمَل التابع <code>[[Node.js/crypto#sign.sign.28privateKey.5B.2C outputFormat.5D.29.E2.80.8E|sign.sign()]]</code> لتوليد وإعادة التوقيع، أو | |||
*يُستعمَل التابعان <code>[[Node.js/crypto#sign.update.28data.5B.2C inputEncoding.5D.29.E2.80.8E|sign.update()]]</code> و <code>[[Node.js/crypto#sign.sign.28privateKey.5B.2C outputFormat.5D.29.E2.80.8E|sign.sign()]]</code> لتوليد التوقيع. | |||
يُستعمَل التابع <code>[[Node.js/crypto#crypto.createSign.28algorithm.5B.2C options.5D.29.E2.80.8E|crypto.createSign()]]</code> لإنشاء نسخٍ من الصنف <code>Sign</code>، إذ تُمرَّر إليه سلسلة نصية تحوي اسم للدالة hash المراد استعمالها. لا يجب إنشاء الكائنات <code>Sign</code> باستعمال الكلمة المفتاحية <code>new</code> مباشرةً. يوضّح المثال التالي كيفية استعمال الكائنات <code>Sign</code> كمجاري:<syntaxhighlight lang="javascript">const crypto = require('crypto'); | |||
const sign = crypto.createSign('SHA256'); | const sign = crypto.createSign('SHA256'); | ||
سطر 644: | سطر 641: | ||
// فيجب استعمال ،EC أما من أجل مفاتيح .(RSASSA-PSS في الأسفل من أجل padding | // فيجب استعمال ،EC أما من أجل مفاتيح .(RSASSA-PSS في الأسفل من أجل padding | ||
// ECDSA الخوارزمية | // ECDSA الخوارزمية | ||
</syntaxhighlight>أما المثال التالي، فيوضِّح كيفية استعمال التابعان sign.update() و sign.sign():<syntaxhighlight lang=" | </syntaxhighlight>أما المثال التالي، فيوضِّح كيفية استعمال التابعان <code>[[Node.js/crypto#sign.update.28data.5B.2C inputEncoding.5D.29.E2.80.8E|sign.update()]]</code> و <code>[[Node.js/crypto#sign.sign.28privateKey.5B.2C outputFormat.5D.29.E2.80.8E|sign.sign()]]</code>:<syntaxhighlight lang="javascript"> | ||
const crypto = require('crypto'); | const crypto = require('crypto'); | ||
const sign = crypto.createSign('SHA256'); | const sign = crypto.createSign('SHA256'); | ||
سطر 653: | سطر 650: | ||
console.log(sign.sign(privateKey, 'hex')); | console.log(sign.sign(privateKey, 'hex')); | ||
// سيُطبَع التوقيع المحسوب | // سيُطبَع التوقيع المحسوب | ||
</syntaxhighlight>في بعض الحالات، يمكن إنشاء النسخة Sign أيضًا عبر تمرير اسم خوارزمية التوقيع، مثل 'RSA-SHA256'؛ سيؤدي هذا إلى استعمال الخوارزمية المقابلة لحساب القيمة hash. انتبه إلى أنَّ هذا الأمر لا ينطبق على كل خوارزميات التوقيع، مثل الخوارزمية 'ecdsa-with-SHA256'. في مثل هذه الحالة، استعمل أسماء خوارزميات hash عوضًا عن ذلك. يوضح المثال التالي كيفية حساب قيمة توقيع باستعمال اسم خوارزمية توقيع إرثية (legacy signature algorithm):<syntaxhighlight lang=" | </syntaxhighlight>في بعض الحالات، يمكن إنشاء النسخة <code>Sign</code> أيضًا عبر تمرير اسم خوارزمية التوقيع، مثل 'RSA-SHA256'؛ سيؤدي هذا إلى استعمال الخوارزمية المقابلة لحساب القيمة hash. انتبه إلى أنَّ هذا الأمر لا ينطبق على كل خوارزميات التوقيع، مثل الخوارزمية 'ecdsa-with-SHA256'. في مثل هذه الحالة، استعمل أسماء خوارزميات hash عوضًا عن ذلك. يوضح المثال التالي كيفية حساب قيمة توقيع باستعمال اسم خوارزمية توقيع إرثية (legacy signature algorithm):<syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const crypto = require('crypto'); | |||
const sign = crypto.createSign('RSA-SHA256'); | const sign = crypto.createSign('RSA-SHA256'); | ||
سطر 663: | سطر 659: | ||
// سيُطبَع التوقيع المحسوب | // سيُطبَع التوقيع المحسوب | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===sign.sign(privateKey[, outputFormat])=== | ===<code>sign.sign(privateKey[, outputFormat])</code>=== | ||
سجل التغييرات | {| class="wikitable mw-collapsible" | ||
|+سجل التغييرات | |||
!الإصدار | |||
!التغييرات | |||
|- | |||
|v8.0.0 | |||
|أضيف دعمٌ للخوارزمية RSASSA-PSS وخيارات أخرى. | |||
|- | |||
|v0.1.92 | |||
|أضيف هذا التابع. | |||
|} | |||
*<code>privateKey</code>: [[JavaScript/String|<string>]] | [[JavaScript/Object|<Object>]] | |||
**<code>key</code>: [[JavaScript/String|<string>]] | |||
**<code>passphrase</code>: [[JavaScript/String|<string>]] | |||
*<code>outputFormat</code>: [[JavaScript/String|<string>]] | |||
*القيم المعادة: [[Node.js/buffer|<Buffer>]] | [[JavaScript/String|<string>]] | |||
يحسب هذا التابع التوقيع لكل البيانات المُمرَّرة إليه باستعمال إمَّا التابع <code>[[Node.js/crypto#sign.update.28data.5B.2C inputEncoding.5D.29.E2.80.8E|sign.update()]]</code> أو التابع <code>sign.write()</code>. يمكن أن يكون الوسيط <code>privateKey</code> كائنًا أو سلسلة نصية. إن كان سلسلة نصية، فسيُعامَل وكأنه مفتاح خام (raw key) بدون عبارة مرور (passphrase). أمَّا إن كان الوسيط <code>privateKey</code> كائنًا، فيجب أن يحتوي على خاصية واحدة أو أكثر من الخاصيات التالية: | |||
*<code>Key</code>: [[JavaScript/String|<string>]] مفتاح خاص مرمَّز بالترميز PEM (مطلوب). | |||
*<code>passphrase</code>: [[JavaScript/String|<string>]] عبارة مرور من أجل المفتاح الخاص. | |||
*<code>padding</code>: [[JavaScript/Number|<integer>]] قيمة حاشية اختيارية من أجل RSA، وتأخذ إحدى القيم التالية: | |||
**<code>crypto.constants.RSA_PKCS1_PADDING</code> (القيمة الافتراضية) | |||
**<code>crypto.constants.RSA_PKCS1_PSS_PADDING</code> | |||
انتبه إلى أنَّ القيمة <code>RSA_PKCS1_PSS_PADDING</code> ستستعمل MGF1 مع نفس الدالة hash المستعملة لتوقيع الرسالة كما هو محدَّد في الفقرة 3.1 من المعيار RFC 4055. | |||
*<code>saltLength</code>: [[JavaScript/Number|<integer>]] طول إضافي (salt length) يُستعمَل عندما تكون قيمة <code>padding</code> هي <code>RSA_PKCS1_PSS_PADDING</code>. تضبط القيمة <code>crypto.constants.RSA_PSS_SALTLEN_DIGEST</code> الخاصَّة الطول الإضافي إلى طول القيمة hash، وتضبط القيمة <code>crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN</code> (الافتراضية) ذلك الطول إلى أكبر قيمة مسموحٌ بها. | |||
يمكن أن يأخذ الوسيط <code>outputFormat</code> إحدى القيم <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>. إن أعطي هذا الوسيط، فستُعاد سلسلة نصية. خلا ذلك، سيُعاد كائن من النوع <code>[[Node.js/buffer|Buffer]]</code>. لا يمكن استعمال الكائن <code>Sign</code> مرةً أخرى بعد استدعاء التابع <code>sign.sign()</code>. سينتج عن استدعاء التابع <code>sign.sign()</code> عدة مرات خطأٌ مرمي. | |||
===<code>sign.update(data[, inputEncoding])</code>=== | |||
{| class="wikitable mw-collapsible" | |||
|+سجل التغييرات | |||
!الإصدار | |||
!التغييرات | |||
|- | |||
|v6.0.0 | |||
|تغيرت القيمة الافتراضية للوسيط <code>inputEncoding</code> من <code>binary</code> إلى <code>utf8</code>. | |||
|- | |||
|v0.1.92 | |||
|أضيف هذا التابع. | |||
|} | |||
*<code>data</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>inputEncoding</code>: [[JavaScript/String|<string>]] | |||
يحدِّث هذا التابع محتوى الكائن <code>Sign</code> مع البيانات <code>data</code> المعطاة، وبالترميز <code>inputEncoding</code> المعطى والذي يمكن أن يكون <code>'utf8'</code>، أو <code>'ascii'</code>، أو <code>'latin1'</code>. إن أعطي الوسيط <code>encoding</code> وكان الوسيط <code>data</code> سلسلةً نصيةً، فسيُفرَض استعمال الترميز <code>'utf8'</code>. إن كان الوسيط <code>data</code> كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>، فسيُتجاهَل حينها الوسيط <code>inputEncoding</code> إن أعطي. يمكن استدعاء هذا التابع عدة مرات مع بيانات جديدة طالما كان متاحًا في المجرى. | |||
==الصنف <code>Verify</code>== | |||
أضيف في الإصدار: v0.1.92. | |||
الصنف <code>Verify</code> هو أداةٌ للتحقق من التوقيع. يمكن استعمال هذا الصنف بإحدى الطريقتين التاليتين: | |||
*يستعمل [[Node.js/stream|كمجرًى]] قابلًا للكتابة، إذ تكتب فيه البيانات المراد التحقق من صحتها مع التوقيع المقابل لها، أو | |||
*يُستعمَل التابعان <code>[[Node.js/crypto#verify.update.28data.5B.2C inputEncoding.5D.29.E2.80.8E|verify.update()]]</code> و <code>[[Node.js/crypto#verify.verify.28object.2C signature.5B.2C signatureFormat.5D.29.E2.80.8E|verify.verify()]]</code> للتحقق من التوقيع. | |||
يُستعمَل التابع <code>[[Node.js/crypto#crypto.createVerify.28algorithm.5B.2C options.5D.29.E2.80.8E|crypto.createVerify()]]</code> لإنشاء نسخٍ من الصنف <code>Verify</code> إذ تُمرَّر إليه سلسلة نصية تحوي اسم للدالة hash المراد استعمالها. لا يجب إنشاء الكائنات <code>Verify</code> باستعمال الكلمة المفتاحية <code>new</code> مباشرةً. يوضح المثال التالي كيفية استعمال الكائنات <code>Verify</code> كمجاري:<syntaxhighlight lang="javascript">const crypto = require('crypto'); | |||
* | |||
* | |||
const crypto = require('crypto'); | |||
const verify = crypto.createVerify('SHA256'); | const verify = crypto.createVerify('SHA256'); | ||
سطر 703: | سطر 716: | ||
console.log(verify.verify(publicKey, signature)); | console.log(verify.verify(publicKey, signature)); | ||
// false أو القيمة true ستُطبع القيمة | // false أو القيمة true ستُطبع القيمة | ||
</syntaxhighlight>ويوضح المثال التالي كيفية استعمال التابع verify.update() مع التابع verify. | </syntaxhighlight>ويوضح المثال التالي كيفية استعمال التابع <code>[[Node.js/crypto#verify.update.28data.5B.2C inputEncoding.5D.29.E2.80.8E|verify.update()]]</code> مع التابع <code>[[Node.js/crypto#verify.verify.28object.2C signature.5B.2C signatureFormat.5D.29.E2.80.8E|verify.verify()]]</code>:<syntaxhighlight lang="javascript"> | ||
const crypto = require('crypto'); | const crypto = require('crypto'); | ||
const verify = crypto.createVerify('SHA256'); | const verify = crypto.createVerify('SHA256'); | ||
سطر 714: | سطر 727: | ||
// false أو القيمة true ستُطبع القيمة | // false أو القيمة true ستُطبع القيمة | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===verify.update(data[, inputEncoding])=== | ===<code>verify.update(data[, inputEncoding])</code>=== | ||
سجل التغييرات | {| class="wikitable mw-collapsible" | ||
|+سجل التغييرات | |||
!الإصدار | |||
*data: [[JavaScript/String|<string>]] | <Buffer> | <TypedArray> | <DataView> | !التغييرات | ||
*inputEncoding: [[JavaScript/String|<string>]] | |- | ||
يحدِّث هذا التابع محتوى الكائن Verify مع البيانات data المعطاة، وبالترميز inputEncoding المعطى والذي يمكن أن يكون 'utf8'، أو 'ascii'، أو 'latin1'. إن أعطي الوسيط encoding وكانت الوسيط data سلسلة نصية، فسيُفرَض استعمال الترميز 'utf8'. إن كان الوسيط data كائنًا من النوع | |v6.0.0 | ||
===verify.verify(object, signature[, signatureFormat])=== | |تغيرت القيمة الافتراضية للوسيط <code>inputEncoding</code> من <code>binary</code> إلى <code>utf8</code>. | ||
سجل التغييرات | |- | ||
|v0.1.92 | |||
|أضيف هذا التابع. | |||
|} | |||
*<code>data</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>inputEncoding</code>: [[JavaScript/String|<string>]] | |||
يحدِّث هذا التابع محتوى الكائن <code>Verify</code> مع البيانات <code>data</code> المعطاة، وبالترميز <code>inputEncoding</code> المعطى والذي يمكن أن يكون <code>'utf8'</code>، أو <code>'ascii'</code>، أو <code>'latin1'</code>. إن أعطي الوسيط <code>encoding</code> وكانت الوسيط <code>data</code> سلسلة نصية، فسيُفرَض استعمال الترميز <code>'utf8'</code>. إن كان الوسيط <code>data</code> كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>، فسيُتحاهَل حينها الوسيط <code>inputEncoding</code> إن أعطي. يمكن استدعاء هذا التابع عدة مرات مع بيانات جديدة طالما كان متاحًا في المجرى. | |||
===<code>verify.verify(object, signature[, signatureFormat])</code>=== | |||
{| class="wikitable mw-collapsible" | |||
|+سجل التغييرات | |||
!الإصدار | |||
!التغييرات | |||
|- | |||
|v8.0.0 | |||
|أضيف دعمٌ للخوارزمية RSASSA-PSS وخيارات أخرى. | |||
|- | |||
|v0.1.92 | |||
|أضيف هذا التابع. | |||
|} | |||
*<code>object</code>: [[JavaScript/String|<string>]] | [[JavaScript/Object| <Object>]] | |||
*<code>signature</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>signatureFormat</code>: [[JavaScript/String|<string>]] | |||
*القيم المعادة: [[JavaScript/Boolean|<boolean>]] تعاد القيمة <code>true</code> أو <code>false</code> بناءً على عملية التحقق من صلاحية التوقيع للبيانات والمفتاح العام. | |||
يتحقق هذا التابع من كون البيانات المعطاة تستعمل الكائن <code>object</code> والتوقيع <code>signature</code> المعطى. يمكن أن يكون الوسيط <code>object</code> إمَّا سلسلة نصية تحتوي على كائن مرمز بالترميز PEM -الذي يمكن أن يكون مفتاح RSA عام، أو مفتاح DSA عام، أو شهادةً من النوع X.509-، أو كائنًا يحوي خاصيةً واحدةً أو أكثر من الخاصيات التالية: | |||
*<code>Key</code>: [[JavaScript/String|<string>]] مفتاح خاص مُرمَّز بالترميز PEM (مطلوب). | |||
*<code>padding</code>: [[JavaScript/Number|<integer>]] قيمة حاشية اختيارية من أجل RSA، وتأخذ إحدى القيم التالية: | |||
**<code>crypto.constants.RSA_PKCS1_PADDING</code> (القيمة الافتراضية) | |||
**<code>crypto.constants.RSA_PKCS1_PSS_PADDING</code> | |||
انتبه إلى أنَّ القيمة <code>RSA_PKCS1_PSS_PADDING</code> ستستعمل MGF1 مع نفس الدالة hash التي استعملت في توقيع الرسالة كما هو محدد في الفقرة 3.1 من المعيار RFC 4055. | |||
*<code>saltLength</code>: [[JavaScript/Number|<integer>]] طول إضافي (salt length، أو طول ملحي) يُستعمَل عندما تكون قيمة <code>padding</code> هي <code>RSA_PKCS1_PSS_PADDING</code>. تضبط القيمة <code>crypto.constants.RSA_PSS_SALTLEN_DIGEST</code> الخاصَّة الطول الإضافي إلى طول القيمة hash، وتضبط القيمة <code>crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN</code> (الافتراضية) ذلك الطول إلى أكبر قيمة مسموح بها. | |||
الوسيط <code>signature</code> هو التوقيع المحسوب مسبقًا للبيانات بالترميز <code>signatureFormat</code> والذي يمكن أن يأخذ إحدى القيم <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>. إن أعطي الوسيط <code>signatureFormat</code>، فسيُتوقَّع أن يكون الوسيط <code>signature</code> سلسلةً نصيةً. خلا ذلك، سيُتوقَّع أن يكون كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>. لا يمكن استعمال الكائن <code>Verify</code> مرةً أخرى بعد استدعاء التابع <code>verify.verify()</code>. سينتج عن استدعاء التابع <code>sign.sign()</code> عدة مرات خطأ مرمي. | |||
== توابع وخاصيات الوحدة <code>crypto</code> == | |||
سنورد في ما يلي التوابع والخاصيات المستعملة في الوحدة <code>crypto</code>: | |||
===<code>Crypto.constants</code>=== | |||
===Crypto.constants=== | |||
أضيفت في الإصدار: v6.3.0. | أضيفت في الإصدار: v6.3.0. | ||
*القيم المعادة: <Object> يعاد كائن يحتوي على الثوابت التي تُستعمَل عادةً مع العمليات المتعلقة بالتشفير (crypto) والأمن (security). الثوابت المعرَّفة حاليًا موجودةٌ في قسم «ثوابت الوحدة Crypto». | *القيم المعادة: [[JavaScript/Object|<Object>]] يعاد كائن يحتوي على الثوابت التي تُستعمَل عادةً مع العمليات المتعلقة بالتشفير (crypto) والأمن (security). الثوابت المعرَّفة حاليًا موجودةٌ في قسم «ثوابت الوحدة Crypto». | ||
===crypto.DEFAULT_ENCODING=== | ===<code>crypto.DEFAULT_ENCODING</code>=== | ||
أضيفت في الإصدار: v0.9.3، وأهملت بدءًا من الإصدار: 10.0.0. تعيد هذه الخاصية الترميز الافتراضي المراد استعماله مع الدوال التي يمكن أن تُمرَّر إليها إمَّا سلاسل نصية أو كائنات من النوع Buffer. القيمة الافتراضية هي 'buffer' أي استعمال الكائنات Buffer افتراضيًّا مع التوابع. سبب وجود الآلية crypto.DEFAULT_ENCODING هي للتوافقية الرجوعية (backwards compatibility) مع التطبيقات الإرثية (legacy programs) التي تتوقع أن يكون الترميز 'latin1' هو الترميز الافتراضي. يجب على التطبيقات الجديدة أن تتوقع أنَّ 'buffer' هي القيمة الافتراضية. انتبه إلى أنَّ هذه الخاصية قد أُهملَت. | أضيفت في الإصدار: v0.9.3، وأهملت بدءًا من الإصدار: 10.0.0. تعيد هذه الخاصية الترميز الافتراضي المراد استعماله مع الدوال التي يمكن أن تُمرَّر إليها إمَّا سلاسل نصية أو كائنات من النوع <code>[[Node.js/buffer|Buffer]]</code>. القيمة الافتراضية هي <code>'buffer'</code> أي استعمال الكائنات <code>[[Node.js/buffer|Buffer]]</code> افتراضيًّا مع التوابع. سبب وجود الآلية <code>crypto.DEFAULT_ENCODING</code> هي للتوافقية الرجوعية (backwards compatibility) مع التطبيقات الإرثية (legacy programs) التي تتوقع أن يكون الترميز <code>'latin1'</code> هو الترميز الافتراضي. يجب على التطبيقات الجديدة أن تتوقع أنَّ <code>'buffer'</code> هي القيمة الافتراضية. انتبه إلى أنَّ هذه الخاصية قد أُهملَت. | ||
===crypto.fips=== | ===<code>crypto.fips</code>=== | ||
أضيفت في الإصدار: v6.0.0، وأهملت بدءًا من الإصدار: 10.0.0. تُستعمَل هذه الخاصية للتحقق فيما إذا كان مزود الوحدة crypto المتوافق مع FIPS يُستعمَل حاليًا وذلك للتحكم به. ضبط هذه الخاصية إلى القيمة true يتطلب من FIPS أن تبني Node.js. انتبه إلى أنَّ هذه الخاصية قد أُهملَت. استعمل رجاءً التابع crypto.setFips() والتابع crypto.getFips() عوضًا عن ذلك. | أضيفت في الإصدار: v6.0.0، وأهملت بدءًا من الإصدار: 10.0.0. تُستعمَل هذه الخاصية للتحقق فيما إذا كان مزود الوحدة <code>crypto</code> المتوافق مع FIPS يُستعمَل حاليًا وذلك للتحكم به. ضبط هذه الخاصية إلى القيمة <code>true</code> يتطلب من FIPS أن تبني Node.js. انتبه إلى أنَّ هذه الخاصية قد أُهملَت. استعمل رجاءً التابع <code>[[Node.js/crypto#crypto.setFips.28bool.29.E2.80.8E|crypto.setFips()]]</code> والتابع <code>[[Node.js/crypto#crypto.getFips.28.29.E2.80.8E|crypto.getFips()]]</code> عوضًا عن ذلك. | ||
===crypto.createCipher(algorithm, password[, options])=== | ===<code>crypto.createCipher(algorithm, password[, options])</code>=== | ||
{| class="wikitable" | |||
!الإصدار | |||
!التغييرات | |||
|- | |||
الاستقرار: 0-مهمل. استعمل التابع crypto.createCipheriv() عوضًا عنه. | |v10.10.0 | ||
*algorithm: <string> | |أصبح التشفير باستعمال الوضع OCB مدعومًا الآن. | ||
*password: <string> | <Buffer> | <TypedArray> | <DataView> | |- | ||
*options: <Object> خيارات stream.transform. | |v10.2.0 | ||
*القيم المعادة: <Cipher> | |يمكن الآن استعمال الخيار <code>authTagLength</code> لتوليد بطاقات مصادقة قصيرة في الوضع GCM بحجم 16 بايت افتراضيًّا. | ||
ينشئ هذا التابع كائنًا من النوع Cipher ثم يعيده وذلك باستعمال الخوارزمية algorithm وكلمة المرور password. يتحكم الوسيط options بسلوك المجرى وهو اختياري إلا عند التشفير باستعمال الوضع CCM أو الوضع OCB (مثل 'aes-128-ccm'). في هذه الحالة، يُطلَب الخيار authTagLength لتحديد طول بطاقة المصادقة بواحدة البايت (راجع الوضع CCM في الأسفل). في الوضع GCM، لا يُطلب استعمال الخيار | |- | ||
===crypto.createCipheriv(algorithm, key, iv[, options])=== | |v10.0.0 | ||
سجل التغييرات | |أهمل هذا التابع. | ||
|- | |||
|v0.1.94 | |||
|أضيف هذا التابع. | |||
|} | |||
الاستقرار: 0-مهمل. استعمل التابع <code>[[Node.js/crypto#crypto.createCipheriv.28algorithm.2C key.2C iv.5B.2C options.5D.29.E2.80.8E|crypto.createCipheriv()]]</code> عوضًا عنه. | |||
*<code>algorithm</code>: [[JavaScript/String|<string>]] | |||
*<code>password</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>options</code>: [[JavaScript/Object|<Object>]] خيارات <code>stream.transform</code>. | |||
*القيم المعادة: [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Cipher|<Cipher>]] | |||
ينشئ هذا التابع كائنًا من النوع <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Cipher|Cipher]]</code> ثم يعيده وذلك باستعمال الخوارزمية <code>algorithm</code> وكلمة المرور <code>password</code>. يتحكم الوسيط <code>options</code> بسلوك المجرى وهو اختياري إلا عند التشفير باستعمال الوضع CCM أو الوضع OCB (مثل 'aes-128-ccm'). في هذه الحالة، يُطلَب الخيار <code>authTagLength</code> لتحديد طول بطاقة المصادقة بواحدة البايت (راجع الوضع CCM في الأسفل). في الوضع GCM، لا يُطلب استعمال الخيار <code>authTagLength</code>، ولكن يمكن استعماله لضبط طول بطاقة المصادقة التي ستُعاد عبر التابع <code>[[Node.js/crypto#cipher.getAuthTag.28.29.E2.80.8E|getAuthTag()]]</code>؛ الطول الافتراضي هو 16 بايت. تعتمد الخوارزمية <code>algorithm</code> المعطاة على OpenSSL، مثل 'aes192' وغيرها. في إصدارات OpenSSL الحديثة، سيُظهر الأمر <code>openssl list -cipher-algorithms</code> (أو openssl list-cipher-<code>algorithms</code> في الإصدارات القديمة) خوارزميات التشفير المتاحة. يُستعمَل الوسيط <code>password</code> لاشتقاق مفتاح التشفير والمتغير الأولي (initialization vector، ويدعى اختصارًا IV أو يدعى أحيانًا starting variable [تختصر إلى SV]). يجب أن يكون إمَّا سلسلةً نصيةً مرمزةً بالترميز <code>'latin1'</code>، أو كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>. يُنفَّذ التابع <code>crypto.createCipher()</code> لاشتقاق المفاتيح باستعمال الدالة <code>EVP_BytesToKey</code> التي تخص OpenSSL مع ضبط الخوارزمية التي تحسب قيمة hash إلى MD5، والتكرار مرة واحدة، وبدون طول إضافي (salt). يسمح نقص الطول الإضافي (salt) بهجمات القاموس (dictionary attacks) لأنَّ كلمة المرور نفسها تولِّد دومًا المفتاح نفسه. يؤدي أيضًا عدد مرات التكرار المنخفض والخوارزمية hash الغير آمنة بالتحقق من كلمات المرور بسرعة كبيرة. تماشيًا مع توصية OpenSSL باستعمال خوارزمية حديثة عوضًا عن <code>EVP_BytesToKey</code>، يوصى بأن يعمل المطورون على اشتقاق مفتاح ومتغير أولي (IV) بأنفسهم باستعمال التابع <code>[[Node.js/crypto#crypto.scrypt.28password.2C salt.2C keylen.5B.2C options.5D.2C callback.29.E2.80.8E|crypto.scrypt()]]</code>، وأن يستعملوا التابع <code>[[Node.js/crypto#crypto.createCipheriv.28algorithm.2C key.2C iv.5B.2C options.5D.29.E2.80.8E|crypto.createCipheriv()]]</code> لإنشاء الكائن [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Cipher|<code>Cipher</code>]]. لا يجب على المستخدمين أن يستعملوا القيم المشفرة مع وضع العداد (counter mode) -مثل CTR، أو GCM، أو CCM- في التابع <code>crypto.createCipher()</code>. سيُطلَق تحذير عند تنفيذ ذلك لتجنب خطر إعادة استعمال المتغير IV الأولي الذي يؤدي إلى حدوث نقطة ضعف أو ثغرة. لمزيد من التفاصيل حول حالة إعادة استعمال المتغير IV في الوضع GCM، تصفَّح هذا المرجع. | |||
===<code>crypto.createCipheriv(algorithm, key, iv[, options])</code>=== | |||
{| class="wikitable mw-collapsible" | |||
|+سجل التغييرات | |||
!الإصدار | |||
!التغييرات | |||
|- | |||
|v10.10.0 | |||
|أصبح التشفير باستعمال الوضع OCB مدعومًا الآن. | |||
|- | |||
|v10.2.0 | |||
|يمكن الآن استعمال الخيار <code>authTagLength</code> لتوليد بطاقات مصادقة قصيرة في الوضع GCM بحجم 16 بايت افتراضيًّا. | |||
|- | |||
|v9.9.0 | |||
|يمكن الآن أن يأخذ المتغير iv القيمة <code>null</code> عند عدم الحاجة إلى متغير أولي (initialization vector). | |||
|- | |||
|v0.1.94 | |||
|أضيف هذا التابع. | |||
|} | |||
*<code>algorithm</code>: [[JavaScript/String|<string>]] | |||
*<code>key</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>iv</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>options</code>: [[JavaScript/Object|<Object>]] خيارات التابع <code>stream.transform</code>. | |||
*القيم المعادة: [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Cipher|<Cipher>]] | |||
ينشئ هذا التابع كائنًا من النوع <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Cipher|Cipher]]</code> ثم يعيده وذلك باستعمال الخوارزمية <code>algorithm</code> والمفتاح <code>key</code> والمتغير الأولي <code>iv</code>. يتحكم الوسيط <code>options</code> بسلوك المجرى وهو اختياري إلا عند التشفير باستعمال الوضع CCM أو الوضع OCB (مثل 'aes-128-ccm'). في هذه الحالة، يُطلَب الخيار authTagLength لتحديد طول بطاقة المصادقة بواحدة البايت (راجع الوضع CCM في الأسفل). في الوضع GCM، لا يُطلب استعمال الخيار <code>authTagLength</code>، ولكن يمكن استعماله لضبط طول بطاقة المصادقة التي ستُعاَد عبر التابع <code>[[Node.js/crypto#cipher.getAuthTag.28.29.E2.80.8E|getAuthTag()]]</code>؛ الطول الافتراضي هو 16 بايت. تعتمد الخوارزمية <code>algorithm</code> المعطاة على OpenSSL، مثل 'aes192' وغيرها. في إصدارات OpenSSL الحديثة، سيُظهِر الأمر <code>openssl list -cipher-algorithms</code> (أو <code>openssl list-cipher-algorithms</code> في الإصدارات القديمة) خوارزميات التشفير المتاحة. الوسيط <code>key</code> هو المفتاح الخام (raw key) الذي تستعمله الخوارزمية <code>algorithm</code>، والوسيط iv هو المتغير الأولي (initialization vector). يجب أن يكون كلا هذين الوسيطين إما سلسلةً نصيةً مرمزةً بالترميز <code>'utf8'</code>، أو كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>. إن لم يكن هنالك حاجة لاستعمال المتغير الأولي في عملية التشفير، فيمكن استعمال القيمة <code>null</code> حينئذٍ مع الوسيط <code>iv</code>. يجب أن تكون المتغيرات الأولية (IV) فريدةً وغير قابلة للتنبؤ بأي شكل من الأشكال. من الناحية المثالية، يجب أن يكونوا قيمًا عشوائية بشكل مشفرة. لا يفترض أن تكون هذه المتغيرات سرِّية، إذ تضاف عادةً بدون تشفير إلى الرسائل المشفرة نصيًّا (ciphertext messages). قد يبدو -للوهلة الأولى- أن هنالك شيئًا من التناقض المتعلق بالشرط الذي ينص على أنَّ هذه المتغيرات يجب أن تكون فريدةً وغير قابلة للتنبؤ في آنٍ واحدٍ ولكن لا يجب أن تكون سرية أيضًا؛ على أي حال، من المهم حاليًا أن تبقي في بالك أنه لا ينبغي على المهاجم أن يكون قادرًا على التنبؤ في وقت مبكر ما هي قيمة المتغير الأولي التي ستُعطَى. | |||
===<code>crypto.createCredentials(details)</code>=== | |||
أضيف في الإصدار: 0.1.92، وأهمل في الإصدار: v0.11.13. | |||
الاستقرار: 0-مهمل؛ استعمل التابع <code>tls.createSecureContext()</code> عوضًا عنه. | |||
*<code>details</code>: [[JavaScript/Object|<Object>]] مماثل تمامًا للتابع <code>tls.createSecureContext()</code>. | |||
*details: <Object> مماثل تمامًا للتابع tls.createSecureContext(). | |||
*القيم المعادة: <tls.SecureContext> | *القيم المعادة: <tls.SecureContext> | ||
هذا التابع هو تابعٌ مهملٌ، ويستعمل في إنشاء الكائن tls.SecureContext وإعادته. على أي حال، لا يجب استعماله، إذ حل التابع tls.createSecureContext() -الذي يشبه هذا التابع في الوسائط والقيم المعادة تمامًا- مكانه. يعيد هذا التابع الكائن tls. | هذا التابع هو تابعٌ مهملٌ، ويستعمل في إنشاء الكائن <code>tls.SecureContext</code> وإعادته. على أي حال، لا يجب استعماله، إذ حل التابع <code>tls.createSecureContext()</code> -الذي يشبه هذا التابع في الوسائط والقيم المعادة تمامًا- مكانه. يعيد هذا التابع الكائن <code>tls.SecureContext</code>، كما يفعل التابع <code>tls.createSecureContext()</code> عند استدعائه. | ||
===crypto.createDecipher(algorithm, password[, options])=== | ===<code>crypto.createDecipher(algorithm, password[, options])</code>=== | ||
سجل التغييرات | {| class="wikitable mw-collapsible" | ||
|+سجل التغييرات | |||
!الإصدار | |||
!التغييرات | |||
الاستقرار: 0-مهمل؛ استعمل التابع | |- | ||
*algorithm: <string> | |v10.10.0 | ||
*password: <string> | <Buffer> | <TypedArray> | <DataView> | |أصبح التشفير باستعمال الوضع OCB مدعومًا الآن. | ||
*options: <Object> خيارات التابع stream.transform. | |- | ||
*القيم المعادة: | |v10.0.0 | ||
ينشئ هذا التابع كائنًا من النوع | |أهمل هذا التابع. | ||
|- | |||
|v0.1.94 | |||
|أضيف هذا التابع. | |||
|} | |||
الاستقرار: 0-مهمل؛ استعمل التابع <code>[[Node.js/crypto#crypto.createDecipheriv.28algorithm.2C key.2C iv.5B.2C options.5D.29.E2.80.8E|crypto.createDecipheriv()]]</code> عوضًا عنه. | |||
*<code>algorithm</code>: [[JavaScript/String|<string>]] | |||
*<code>password</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>options</code>: [[JavaScript/Object|<Object>]] خيارات التابع <code>stream.transform</code>. | |||
*القيم المعادة: [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Decipher|<Decipher>]] | |||
ينشئ هذا التابع كائنًا من النوع <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Decipher|Decipher]]</code> ثم يعيده وذلك باستعمال الخوارزمية <code>algorithm</code> وكلمة المرور <code>password</code> (المفتاح). يتحكم الوسيط <code>options</code> بسلوك المجرى وهو اختيار إلا عند التشفير باستعمال الوضع CCM أو الوضع OCB (مثل 'aes-128-ccm'). في هذه الحالة، يُطلب الخيار <code>authTagLength</code> لتحديد طول بطاقة المصادقة بواحدة البايت (راجع الوضع CCM في الأسفل). يُنفَّذ التابع <code>crypto.createDecipher()</code> لاشتقاق المفاتيح باستعمال الدالة <code>EVP_BytesToKey</code> التي تخص OpenSSL مع ضبط الخوارزمية التي تحسب قيمة hash إلى MD5، والتكرار مرةً واحدةً، وبدون طول إضافي (salt). يسمح نقص الطول الإضافي (salt) بهجمات القاموس (dictionary attacks) لأنَّ كلمة المرور نفسها تولد دومًا المفتاح نفسه. يؤدي أيضًا عدد مرات التكرار المنخفض والخوارزمية hash الغير آمنة إلى التحقق من كلمات المرور بسرعة كبيرة. تماشيًا مع توصية OpenSSL باستعمال خوارزمية أحدث عوضًا عن <code>EVP_BytesToKey</code>، يوصى بأن يعمل المطورون على اشتقاق مفتاح ومتغير أولي (IV) بأنفسهم باستعمال التابع <code>[[Node.js/crypto#crypto.scrypt.28password.2C salt.2C keylen.5B.2C options.5D.2C callback.29.E2.80.8E|crypto.scrypt()]]</code>، وأن يستعملوا التابع <code>[[Node.js/crypto#crypto.createDecipheriv.28algorithm.2C key.2C iv.5B.2C options.5D.29.E2.80.8E|crypto.createDecipheriv()]]</code> لإنشاء الكائن <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Decipher|Decipher]]</code>. | |||
===<code>crypto.createDecipheriv(algorithm, key, iv[, options])</code>=== | |||
{| class="wikitable mw-collapsible" | |||
|+سجل التغييرات | |||
!الإصدار | |||
!التغييرات | |||
|- | |||
|v10.10.0 | |||
|أصبح التشفير باستعمال الوضع OCB مدعومًا الآن. | |||
|- | |||
|v10.2.0 | |||
|يمكن الآن استعمال الخيار <code>authTagLength</code> لتقييد أطوال بطاقة المصادقة GCM المقبولة. | |||
|- | |||
|v9.9.0 | |||
|يمكن الآن أن يأخذ المتغير iv القيمة <code>null</code> عند عدم الحاجة إلى استعمال متغير أولي (initialization vector). | |||
|- | |||
|v0.1.94 | |||
|أضيف هذا التابع. | |||
|} | |||
*<code>algorithm</code>: [[JavaScript/String|<string>]] | |||
*<code>key</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>iv</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>options</code>: [[JavaScript/Object|<Object>]] خيارات التابع <code>stream.transform</code>. | |||
*القيم المعادة: [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Decipher|<Decipher>]] | |||
ينشئ هذا التابع كائنًا من النوع <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Decipher|Decipher]]</code> ثم يعيده وذلك باستعمال الخوارزمية <code>algorithm</code> والمفتاح <code>key</code> والمتغير الأولي (IV). يتحكم الوسيط <code>options</code> بسلوك المجرى وهو اختياري إلا عند التشفير باستعمال الوضع CCM أو الوضع OCB (مثل 'aes-128-ccm'). في هذه الحالة، يُطلَب الخيار <code>authTagLength</code> لتحديد طول بطاقة المصادقة بواحدة البايت (راجع الوضع CCM في الأسفل). في الوضع GCM، لا يُطلب استعمال الخيار <code>authTagLength</code>، ولكن يمكن استعماله لتقييد طول بطاقات المصادقة المقبولة بطول محدد. تعتمد الخوارزمية <code>algorithm</code> المعطاة على OpenSSL، مثل 'aes192' وغيرها. في إصدارات OpenSSL الحديثة، سيُظهِر الأمر <code>openssl list -cipher-algorithms</code> (أو <code>openssl list-cipher-algorithms</code> في الإصدارات القديمة) خوارزميات التشفير المتاحة. الوسيط <code>key</code> هو المفتاح الخام (raw key) الذي تستعمله الخوارزمية <code>algorithm</code>، والوسيط <code>iv</code> هو المتغير الأولي (initialization vector). يجب أن يكون كلا هذين الوسيطين إما سلسلةً نصيةً مرمزةً بالترميز <code>'utf8'</code>، أو كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو النوع <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو النوع <code>[[JavaScript/TypedArray|DataView]]</code>. إن لم يكن هنالك حاجة لاستعمال المتغير الأولي في عملية التشفير، فيمكن استعمال القيمة <code>null</code> حينئذٍ مع الوسيط <code>iv</code>. يجب أن تكون المتغيرات الأولية (IVs) فريدةً وغير قابلة للتنبؤ بأي شكل من الأشكال. من الناحية المثالية، يجب أن يكونوا قيمًا عشوائية بطريقة مشفرة. لا يفترض أن تكون هذه المتغيرات سرِّية، إذ تضاف عادةً بدون تشفير إلى الرسائل المشفرة نصيًّا (ciphertext messages). قد يبدو أن هنالك شيئًا من التناقض المتعلق بالشرط الذي ينص على أنَّ هذه المتغيرات يجب أن تكون فريدةً وغير قابلة للتنبؤ في آنٍ واحدٍ ولكن لا يجب أن تكون سرية أيضًا؛ على أي حال، من المهم حاليًا أن تُبقِي في بالك أنَّه لا ينبغي على المهاجم أن يكون قادرًا على التنبؤ في وقت مبكر بقيمة المتغير IV التي ستعطى. | |||
===<code>crypto.createDiffieHellman(prime[, primeEncoding][, generator][, generatorEncoding])</code>=== | |||
{| class="wikitable mw-collapsible" | |||
|+سجل التغييرات | |||
!الإصدار | |||
!التغييرات | |||
|- | |||
|v8.0.0 | |||
|يمكن أن يكون الوسيط <code>prime</code> الآن كائنًا من النوع TypeArra أو النوع DataView. | |||
|- | |||
|v8.0.0 | |||
|يمكن أن يكون الوسيط <code>prime</code> الآن كائنًا من النوع <code>Uint8Array</code>. | |||
|- | |||
|v6.0.0 | |||
|تغيرت القيمة الافتراضية لمعاملات الترميز الآن من <code>binary</code> إلى <code>utf8</code>. | |||
|- | |||
|v0.11.12 | |||
|أضيف هذا التابع. | |||
|} | |||
*<code>prime</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>primeEncoding</code>: <string> | |||
*<code>generator</code>: [[JavaScript/Number|<number>]] | [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] القيمة الافتراضية هي: 2 | |||
*<code>generatorEncoding</code>: [[JavaScript/String|<string>]] | |||
ينشئ هذا التابع كائن تبادل المفتاح <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 DiffieHellman|DiffieHellman]]</code> باستعمال العدد الأولي <code>prime</code> المعطى والمولد <code>generator</code> الاختياري (إن أعطي). يمكن أن يكون الوسيط <code>gernerator</code> عددًا، أو سلسلة نصية، أو كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>. إن لم يُعطَ هذا الوسيط، فستكون قيمته الافتراضية هي: 2. يمكن أن يأخذ الوسيطان <code>primeEncoding</code> و <code>generatorEncoding</code> القيمة <code>'latin1'</code>، أو <code>'hex'</code>، أو <code>'base64'</code>. إن أعطي الوسيط <code>generatorEncoding</code>، فسيُتوقَع أن يكون الوسيط <code>gernerator</code> سلسلةً نصيةً؛ خلا ذلك، سيُتوقع أن يكون عددًا، أو كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو النوع <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو النوع <code>[[JavaScript/TypedArray|DataView]]</code>. | |||
===<code>crypto.createDiffieHellman(primeLength[, generator])</code>=== | |||
أضيف في الإصدار: v0.5.0. | أضيف في الإصدار: v0.5.0. | ||
*primeLength: | *<code>primeLength</code>: [[JavaScript/Number|<number>]] | ||
*generator: <number> | <string> | <Buffer> | < | *<code>generator</code>: [[JavaScript/Number|<number>]] | [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] القيمة الافتراضية هي: 2 | ||
ينشئ هذا التابع كائن تبادل المفتاح DiffieHellman ويولد عددًا أوليًا بطول primeLength بت باستعمال المولد generator العددي الاختياري. إن لم يُعطَ الوسيط | ينشئ هذا التابع كائن تبادل المفتاح <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 DiffieHellman|DiffieHellman]]</code> ويولد عددًا أوليًا بطول <code>primeLength</code> بت باستعمال المولد <code>generator</code> العددي الاختياري. إن لم يُعطَ الوسيط <code>generator</code>، فستُستعمَل القيمة 2 الافتراضية. | ||
===crypto.createECDH(curveName)=== | ===<code>crypto.createECDH(curveName)</code>=== | ||
أضيف في الإصدار: v0.11.14. | أضيف في الإصدار: v0.11.14. | ||
*curveName: [[JavaScript/String|<string>]] | *<code>curveName</code>: [[JavaScript/String|<string>]] | ||
ينشئ هذا التابع كائن تبادل المفتاح ECDH (اختصارٌ للعبارة Elliptic Curve Diffie-Hellman) باستعمال المنحني المُعرَّف مسبقًا والمُحدَّد عبر السلسلة النصية curveName. يمكن استعمال التابع crypto.getCurves() للحصول على قائمة بأسماء المنحنيات المتوافرة. في إصدارات OpenSSL الأخيرة، سيُظهر الأمر openssl ecparam -list_curves أيضًا اسمًا ووصفًا لكل منحني بيضاوي (elliptic curve) متاح. | ينشئ هذا التابع كائن تبادل المفتاح <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 ECDH|ECDH]]</code> (اختصارٌ للعبارة Elliptic Curve Diffie-Hellman) باستعمال المنحني المُعرَّف مسبقًا والمُحدَّد عبر السلسلة النصية <code>curveName</code>. يمكن استعمال التابع <code>[[Node.js/crypto#crypto.getCurves.28.29.E2.80.8E|crypto.getCurves()]]</code> للحصول على قائمة بأسماء المنحنيات المتوافرة. في إصدارات OpenSSL الأخيرة، سيُظهر الأمر <code>openssl ecparam -list_curves</code> أيضًا اسمًا ووصفًا لكل منحني بيضاوي (elliptic curve) متاح. | ||
===crypto.createHash(algorithm[, options])=== | ===<code>crypto.createHash(algorithm[, options])</code>=== | ||
أضيف في الإصدار: v0.1.92. | أضيف في الإصدار: v0.1.92. | ||
*algorithm: [[JavaScript/String|<string>]] | *<code>algorithm</code>: [[JavaScript/String|<string>]] | ||
*options: <Object> خيارات التابع stream.transform. | *<code>options</code>: [[JavaScript/Object|<Object>]] خيارات التابع <code>stream.transform</code>. | ||
*القيم المعادة: <Hash> | *القيم المعادة: [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Hash|<Hash>]] | ||
ينشئ هذا التابع الكائن Hash الذي يمكن استعماله لتوليد القيمة hash المشفرة للبيانات والرسائل باستعمال الخوارزمية algorithm المعطاة. يعتمد الوسيط algorithm على الخوارزميات المتاحة التي يدعمها الإصدار OpenSSL المثبَّت على المنصة آنذاك، مثل 'sha256' و 'sha512' وغيرها. في إصدارات OpenSSL الحديثة، سيُظهِر الأمر openssl list -digest-algorithms (أو الأمر openssl list-message-digest-algorithms في الإصدارات القديمة) الخوارزميات المتاحة التي تحسب القيمة hash. يوضح المثال التالي كيفية توليد المجموع sha256 لملف:<syntaxhighlight lang=" | ينشئ هذا التابع الكائن <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Hash|Hash]]</code> الذي يمكن استعماله لتوليد القيمة hash المشفرة للبيانات والرسائل باستعمال الخوارزمية <code>algorithm</code> المعطاة. يعتمد الوسيط <code>algorithm</code> على الخوارزميات المتاحة التي يدعمها الإصدار OpenSSL المثبَّت على المنصة آنذاك، مثل 'sha256' و 'sha512' وغيرها. في إصدارات OpenSSL الحديثة، سيُظهِر الأمر <code>openssl list -digest-algorithms</code> (أو الأمر <code>openssl list-message-digest-algorithms</code> في الإصدارات القديمة) الخوارزميات المتاحة التي تحسب القيمة hash. يوضح المثال التالي كيفية توليد المجموع sha256 لملف:<syntaxhighlight lang="javascript">const filename = process.argv[2]; | ||
const filename = process.argv[2]; | |||
const crypto = require('crypto'); | const crypto = require('crypto'); | ||
const fs = require('fs'); | const fs = require('fs'); | ||
سطر 831: | سطر 928: | ||
}); | }); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===crypto.createHmac(algorithm, key[, options])=== | ===<code>crypto.createHmac(algorithm, key[, options])</code>=== | ||
أضيف في الإصدار: v0.1.94. | أضيف في الإصدار: v0.1.94. | ||
* <code>Algorithm</code>: [[JavaScript/String|<string>]] | |||
* <code>Key</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
* <code>Options</code>: [[JavaScript/Object|<Object>]] خيارات التابع <code>stream.transform</code>. | |||
* القيم المعادة: [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Hmac|<Hmac>]] | |||
const filename = process.argv[2]; | ينشئ هذا التابع الكائن <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Hmac|Hmac]]</code> ثم يعيده والذي يستعمل الخوارزمية <code>algorithm</code> والمفتاح <code>key</code> المعطى. يتحكم الوسيط <code>options</code> الاختياري بسلوك المجرى. يعتمد الوسيط <code>algorithm</code> على الخوارزميات المتاحة التي يدعمها الإصدار OpenSSL المثبَّت على المنصة آنذاك، مثل 'sha256' و 'sha512' وغيرها. في إصدارات OpenSSL الحديثة، سيُظر الأمر <code>openssl list -digest-algorithms</code> (أو الأمر <code>openssl list-message-digest-algorithms</code> في الإصدارات القديمة) الخوارزميات المتاحة التي تحسب القيمة hash. الوسيط <code>key</code> هو المفتاح HMAC المستعمل في توليد قيمة hash المشفرة للكائن <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Hmac|Hmac]]</code>. يوضح المثال التالي كيفية توليد HMAC باستعمال الخوارزمية sha256 لملف:<syntaxhighlight lang="javascript">const filename = process.argv[2]; | ||
const crypto = require('crypto'); | const crypto = require('crypto'); | ||
const fs = require('fs'); | const fs = require('fs'); | ||
سطر 855: | سطر 953: | ||
}); | }); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===crypto.createSign(algorithm[, options])=== | ===<code>crypto.createSign(algorithm[, options])</code>=== | ||
أضيف في الإصدار: v0.1.92. | أضيف في الإصدار: v0.1.92. | ||
*algorithm: [[JavaScript/String|<string>]] | *<code>algorithm</code>: [[JavaScript/String|<string>]] | ||
*options: <Object> خيارات التابع stream.Writable. | *<code>options</code>: [[JavaScript/Object|<Object>]] خيارات التابع <code>stream.Writable</code>. | ||
*القيم المعادة: <Sign> | *القيم المعادة: [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Sign|<Sign>]] | ||
ينشئ هذا التابع كائنًا من النوع Sign التي يستعمل الخوارزمية algorithm المعطاة. استعمل التابع crypto.getHashes() للحصول على مصفوفة بأسماء خوارزميات التوقيع المتاحة. يتحكم الوسيط options الاختياري بسلوك المجرى stream.Writable. | ينشئ هذا التابع كائنًا من النوع <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Sign|Sign]]</code> التي يستعمل الخوارزمية <code>algorithm</code> المعطاة. استعمل التابع <code>crypto.getHashes()</code> للحصول على مصفوفة بأسماء خوارزميات التوقيع المتاحة. يتحكم الوسيط <code>options</code> الاختياري بسلوك المجرى <code>stream.Writable</code>. | ||
===crypto.createVerify(algorithm[, options])=== | ===<code>crypto.createVerify(algorithm[, options])</code>=== | ||
أضيف في الإصدار: v0.1.92. Algorithm: [[JavaScript/String|<string>]] | أضيف في الإصدار: v0.1.92. | ||
* <code>Algorithm</code>: [[JavaScript/String|<string>]] | |||
* <code>Options</code>: [[JavaScript/Object|<Object>]] خيارات التابع <code>stream.Writable</code>. | |||
ينشئ هذا التابع كائنًا من النوع Verify الذي يستعمل الخوارزمية algorithm المعطاة. استعمل التابع crypto.getHashes() للحصول على مصفوفة بأسماء خوارزميات التوقيع المتاحة. يتحكم الوسيط options الاختياري بسلوك المجرى stream.Writable. | * القيم المعادة: [[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Verify|<Verify>]] | ||
ينشئ هذا التابع كائنًا من النوع <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 Verify|Verify]]</code> الذي يستعمل الخوارزمية <code>algorithm</code> المعطاة. استعمل التابع <code>[[Node.js/crypto#crypto.getHashes.28.29.E2.80.8E|crypto.getHashes()]]</code> للحصول على مصفوفة بأسماء خوارزميات التوقيع المتاحة. يتحكم الوسيط <code>options</code> الاختياري بسلوك المجرى <code>stream.Writable</code>. | |||
===<code>crypto.getCiphers()</code>=== | ===<code>crypto.getCiphers()</code>=== | ||
أضيف في الإصدار: v0.9.3. | أضيف في الإصدار: v0.9.3. | ||
*القيم المعادة: [[JavaScript/String|<string[]>]] مصفوفةٌ بأسماء خوارزميات التشفير المدعومة. | *القيم المعادة: [[JavaScript/String|<string[]>]] مصفوفةٌ بأسماء خوارزميات التشفير المدعومة. | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="javascript">const ciphers = crypto.getCiphers(); | ||
const ciphers = crypto.getCiphers(); | |||
console.log(ciphers); // ['aes-128-cbc', 'aes-128-ccm', ...] | console.log(ciphers); // ['aes-128-cbc', 'aes-128-ccm', ...] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 879: | سطر 976: | ||
أضيف في الإصدار: v2.3.0. | أضيف في الإصدار: v2.3.0. | ||
*القيم المعادة: [[JavaScript/String|<string[]>]] مصفوفةٌ بأسماء المنحنيات البيضاوية (elliptic curves) المدعومة. | *القيم المعادة: [[JavaScript/String|<string[]>]] مصفوفةٌ بأسماء المنحنيات البيضاوية (elliptic curves) المدعومة. | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="javascript">const curves = crypto.getCurves(); | ||
const curves = crypto.getCurves(); | |||
console.log(curves); // ['Oakley-EC2N-3', 'Oakley-EC2N-4', ...] | console.log(curves); // ['Oakley-EC2N-3', 'Oakley-EC2N-4', ...] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===crypto.getDiffieHellman(groupName)=== | ===<code>crypto.getDiffieHellman(groupName)</code>=== | ||
أضيف في الإصدار: v0.7.5. | أضيف في الإصدار: v0.7.5. | ||
*groupName: [[JavaScript/String|<string>]] | *<code>groupName</code>: [[JavaScript/String|<string>]] | ||
*القيم المعادة: <Object> | *القيم المعادة: [[JavaScript/Object|<Object>]] | ||
ينشئ هذا التابع كائن تبادل المفتاح DiffieHellman المعرَّف مسبقًا. المجموعات المدعومة هي: 'modp1'، و 'modp2'، و 'modp5' (المعرفة في المعيار RFC 2412، ولكن انظر أيضًا قسم | ينشئ هذا التابع كائن تبادل المفتاح <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 DiffieHellman|DiffieHellman]]</code> المعرَّف مسبقًا. المجموعات المدعومة هي: 'modp1'، و 'modp2'، و 'modp5' (المعرفة في المعيار RFC 2412، ولكن انظر أيضًا قسم «<nowiki/>[[Node.js/crypto#.D8.AF.D8.B9.D9.85 .D8.A7.D9.84.D8.AE.D9.88.D8.A7.D8.B1.D8.B2.D9.85.D9.8A.D8.A7.D8.AA .D8.A7.D9.84.D8.B6.D8.B9.D9.8A.D9.81.D8.A9 .D9.88.D8.A7.D9.84.D8.AE.D8.B7.D8.B1.D8.A9|دعم الخوارزميات الضعيفة والخطرة]]»)، و 'modp14'، و 'modp15'، و 'modp16'، و 'modp17'، و 'modp18' (المعرف في المعيار RFC 3526). يحاكي الكائن المعاد واجهة الكائنات المنشأة عبر التابع <code>[[Node.js/crypto#crypto.createDiffieHellman.28prime.5B.2C primeEncoding.5D.5B.2C generator.5D.5B.2C generatorEncoding.5D.29.E2.80.8E|crypto.createDiffieHellman()]]</code>، ولكن لن يسمح بتعديل المفاتيح (مع التابع <code>[[Node.js/crypto#diffieHellman.setPublicKey.28publicKey.5B.2C encoding.5D.29.E2.80.8E|diffieHellman.setPublicKey()]]</code> مثلًا). ميزة استعمال هذا التابع هي أنه لا يتوجب على الأطراف توليد ولا تبادل معاملات مجموعة (group modulus) مسبقًا مما يوفر وقت المعالجة والاتصال.<syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const crypto = require('crypto'); | |||
const alice = crypto.getDiffieHellman('modp14'); | const alice = crypto.getDiffieHellman('modp14'); | ||
const bob = crypto.getDiffieHellman('modp14'); | const bob = crypto.getDiffieHellman('modp14'); | ||
سطر 901: | سطر 996: | ||
console.log(aliceSecret === bobSecret); | console.log(aliceSecret === bobSecret); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===crypto.getFips()=== | ===<code>crypto.getFips()</code>=== | ||
أضيف في الإصدار: v10.0.0. | أضيف في الإصدار: v10.0.0. | ||
*القيم المعادة: <boolean> القيمة true إذا، وفقط إذا، كان مزود التشفير المتوافق مع FIPS قيد الاستخدام. | *القيم المعادة: [[JavaScript/Boolean|<boolean>]] القيمة <code>true</code> إذا، وفقط إذا، كان مزود التشفير المتوافق مع FIPS قيد الاستخدام. | ||
===crypto.getHashes()=== | ===<code>crypto.getHashes()</code>=== | ||
أضيف في الإصدار: v0.9.3. | أضيف في الإصدار: v0.9.3. | ||
*القيم المعادة: <string[]> مصفوفةٌ بأسماء الخوارزميات hash المدعومة، مثل 'RSA-SHA256'. | *القيم المعادة: [[JavaScript/String|<string[]>]] مصفوفةٌ بأسماء الخوارزميات hash المدعومة، مثل 'RSA-SHA256'. | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript">const hashes = crypto.getHashes(); | ||
const hashes = crypto.getHashes(); | |||
console.log(hashes); // ['DSA', 'DSA-SHA', 'DSA-SHA1', ...] | console.log(hashes); // ['DSA', 'DSA-SHA', 'DSA-SHA1', ...] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===crypto.pbkdf2(password, salt, iterations, keylen, digest, callback)=== | ===<code>crypto.pbkdf2(password, salt, iterations, keylen, digest, callback)</code>=== | ||
سجل التغييرات | {| class="wikitable mw-collapsible" | ||
|+سجل التغييرات | |||
!الإصدار | |||
*password: [[JavaScript/String|<string>]] | <Buffer> | <TypedArray> | <DataView> | !التغييرات | ||
*salt: [[JavaScript/String|<string>]] | <Buffer> | <TypedArray> | <DataView> | |- | ||
*iterations: <number> | |v8.0.0 | ||
*keylen: <number> | |أصبح المعامل <code>digest</code> مطلوبًا دومًا. | ||
*digest: [[JavaScript/String|<string>]] | |- | ||
*callback: <Function> | |v6.0.0 | ||
**err: <Error> | |أصبح استدعاء هذا التابع دون تمرير المعامل <code>digest</code> مهملًا الآن، وسيُطلَق تحذير بذلك. | ||
**derivedKey: <Buffer> | |- | ||
يوفر هذا التابع تنفيذًا غير متزامن للدالة PBKDF2 (اختصارٌ للعبارة Password-Based Key Derivation Function 2 أي دالة اشتقاق المفتاح الذي يعتمد على كلمة المرور). تُطبَّق الخوارزمية التي تحسب HMAC المحددة بالوسيط digest لاشتقاق مفتاح بالطول keylen المطلوب (بالبايت) من الوسائط | |v6.0.0 | ||
const crypto = require('crypto'); | |تغيَّر الترميز الافتراضي للمعامل <code>password</code> عندما يكون سلسلة نصية من <code>binary</code> إلى <code>utf8</code>. | ||
|- | |||
|v0.5.5 | |||
|أضيف هذا التابع. | |||
|} | |||
*<code>password</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>salt</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>iterations</code>: [[JavaScript/Number|<number>]] | |||
*<code>keylen</code>: [[JavaScript/Number|<number>]] | |||
*<code>digest</code>: [[JavaScript/String|<string>]] | |||
*<code>callback</code>: [[JavaScript/Function|<Function>]] | |||
**<code>err</code>: [[JavaScript/Error|<Error>]] | |||
**<code>derivedKey</code>: [[Node.js/buffer|<Buffer>]] | |||
يوفر هذا التابع تنفيذًا غير متزامن للدالة <code>PBKDF2</code> (اختصارٌ للعبارة Password-Based Key Derivation Function 2 أي دالة اشتقاق المفتاح الذي يعتمد على كلمة المرور). تُطبَّق الخوارزمية التي تحسب HMAC المحددة بالوسيط <code>digest</code> لاشتقاق مفتاح بالطول <code>keylen</code> المطلوب (بالبايت) من الوسائط <code>password</code>، و <code>salt</code>، و <code>iterations</code>. تُستدعَى الدالة <code>callback</code> المعطاة مع الوسيطين: <code>err</code>، و <code>derivedKey</code>. إن حدث خطأ أثناء اشتقاق المفتاح، فستُعيَّن قيمة الوسيط <code>err</code>؛ خلا ذلك، ستكون قيمة الوسيط <code>err</code> هي <code>null</code>. ستُمرَّر القيمة <code>derivedKey</code> المولَّدة بنجاح إلى دالة رد النداء ككائن من النوع <code>[[Node.js/buffer|Buffer]]</code>. سيُرمَى خطأ إن كان أيٌّ من الوسائط المدخلة يحدد قيمًا أو أنواعًا غير صالحة. يجب أن يكون الوسيط <code>iterations</code> عددًا يأخذ أعلى قيمة ممكنة. كلما كان عدد التكرارات كبيرًا، كان المفتاح المشتق آمنًا أكثر ولكن ذلك سيستهلك مزيدًا من الوقت لإتمام العملية. أما الوسيط <code>salt</code>، فيجب أن يكون فريدًا قدر الإمكان. يوصى أيضًا أن يكون عشوائيًّا وبطول 16 بايت على الأقل. لمزيد من التفاصيل، اطلع على المرجع [https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf NIST SP 800-132].<syntaxhighlight lang="javascript">const crypto = require('crypto'); | |||
crypto.pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => { | crypto.pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => { | ||
if (err) throw err; | if (err) throw err; | ||
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae' | console.log(derivedKey.toString('hex')); // '3745e48...08d59ae' | ||
}); | }); | ||
</syntaxhighlight>يمكن استعمال الخاصية crypto.DEFAULT_ENCODING لتغيير كيفية تمرير derivedKey إلى دالة رد النداء. على أي حال، هذه الخاصية قد أصبحت مهملةً ويجب تجنب استعمالها.<syntaxhighlight lang=" | </syntaxhighlight>يمكن استعمال الخاصية <code>crypto.DEFAULT_ENCODING</code> لتغيير كيفية تمرير <code>derivedKey</code> إلى دالة رد النداء. على أي حال، هذه الخاصية قد أصبحت مهملةً ويجب تجنب استعمالها.<syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const crypto = require('crypto'); | |||
crypto.DEFAULT_ENCODING = 'hex'; | crypto.DEFAULT_ENCODING = 'hex'; | ||
crypto.pbkdf2('secret', 'salt', 100000, 512, 'sha512', (err, derivedKey) => { | crypto.pbkdf2('secret', 'salt', 100000, 512, 'sha512', (err, derivedKey) => { | ||
سطر 936: | سطر 1٬042: | ||
console.log(derivedKey); // '3745e48...aa39b34' | console.log(derivedKey); // '3745e48...aa39b34' | ||
}); | }); | ||
</syntaxhighlight>يمكن استعمال التابع crypto.getHashes() لمعرفة أسماء الخوارزميات hash المدعومة. انتبه إلى أنَّ الواجهة البرمجية هذه تستعمل مجمع الخيوط الخاص بالمكتبة libuv التي يكون لها آثارًا مفاجئة وسلبية على الأداء لبعض التطبيقات. راجع القسم UV_THREADPOOL_SIZE=size في توثيق خيارات سطر الأوامر في Node.js لمزيد من التفاصيل. | </syntaxhighlight>يمكن استعمال التابع <code>[[Node.js/crypto#crypto.getHashes.28.29.E2.80.8E|crypto.getHashes()]]</code> لمعرفة أسماء الخوارزميات hash المدعومة. انتبه إلى أنَّ الواجهة البرمجية هذه تستعمل مجمع الخيوط الخاص بالمكتبة libuv التي يكون لها آثارًا مفاجئة وسلبية على الأداء لبعض التطبيقات. راجع القسم <code>[[Node.js/cli#UV THREADPOOL SIZE.3Dsize|UV_THREADPOOL_SIZE=size]]</code> في توثيق [[Node.js/cli|خيارات سطر الأوامر]] في Node.js لمزيد من التفاصيل. | ||
===crypto.pbkdf2Sync(password, salt, iterations, keylen, digest)=== | ===<code>crypto.pbkdf2Sync(password, salt, iterations, keylen, digest)</code>=== | ||
سجل التغييرات | {| class="wikitable mw-collapsible" | ||
|+سجل التغييرات | |||
!الإصدار | |||
*password: [[JavaScript/String|<string>]] | <Buffer> | <TypedArray> | <DataView> | !التغييرات | ||
*salt: [[JavaScript/String|<string>]] | <Buffer> | <TypedArray> | <DataView> | |- | ||
*iterations: <number> | |v6.0.0 | ||
*keylen: <number> | |أصبح استدعاء هذا التابع دون تمرير المعامل <code>digest</code> مهملًا الآن، وسيُطلَق تحذير بذلك. | ||
*digest: [[JavaScript/String|<string>]] | |- | ||
*القيم المعادة: <Buffer> | |v6.0.0 | ||
يوفر هذا التابع تنفيذًا متزامنًا للدالة PBKDF2 (اختصارٌ للعبارة Password-Based Key Derivation Function 2، أي دالة اشتقاق المفتاح الذي تعتمد على كلمة المرور). تُطبَّق الخوارزمية التي تحسب HMAC المحددة بالوسيط digest لاشتقاق مفتاحٍ بالطول keylen المطلوب (بالبايت) من الوسائط | |تغير الترميز الافتراضي للمعامل <code>password</code> عندما يكون سلسلة نصية من <code>binary</code> إلى <code>utf8</code>. | ||
const crypto = require('crypto'); | |- | ||
|v0.5.5 | |||
|أضيف هذا التابع. | |||
|} | |||
*<code>password</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>salt</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | |||
*<code>iterations</code>: [[JavaScript/Number|<number>]] | |||
*<code>keylen</code>: [[JavaScript/Number|<number>]] | |||
*<code>digest</code>: [[JavaScript/String|<string>]] | |||
*القيم المعادة: [[Node.js/buffer|<Buffer>]] | |||
يوفر هذا التابع تنفيذًا متزامنًا للدالة <code>PBKDF2</code> (اختصارٌ للعبارة Password-Based Key Derivation Function 2، أي دالة اشتقاق المفتاح الذي تعتمد على كلمة المرور). تُطبَّق الخوارزمية التي تحسب HMAC المحددة بالوسيط <code>digest</code> لاشتقاق مفتاحٍ بالطول <code>keylen</code> المطلوب (بالبايت) من الوسائط <code>password</code>، و <code>salt</code>، و <code>iterations</code>. إن حصل أي خطأ، فسيُرمَى الخطأ <code>[[JavaScript/Error|Error]]</code>، أو سيعاد المفتاح المشتق ككائن من النوع <code>[[Node.js/buffer|Buffer]]</code>. يجب أن يكون الوسيط <code>iterations</code> عددًا بأعلى قيمة ممكنة. كلما كان عدد التكرارات كبيرًا، كان المفتاح المشتق أكثر أمانًا، ولكن ذلك سيستهلك مزيدًا من الوقت لإتمام العملية. يجب أن يكون الوسيط <code>salt</code> فريدًا قدر الإمكان، ويوصى أيضًا أن يكون عشوائيًّا وبطول 16 بايت على الأقل. لمزيد من التفاصيل، اطلع على المرجع [https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf NIST SP 800-132].<syntaxhighlight lang="javascript">const crypto = require('crypto'); | |||
const key = crypto.pbkdf2Sync('secret', 'salt', 100000, 64, 'sha512'); | const key = crypto.pbkdf2Sync('secret', 'salt', 100000, 64, 'sha512'); | ||
console.log(key.toString('hex')); // '3745e48...08d59ae' | console.log(key.toString('hex')); // '3745e48...08d59ae' | ||
</syntaxhighlight>يمكن استعمال الخاصية crypto.DEFAULT_ENCODING لتغيير كيفية إعادة المفتاح derivedKey. على أي حال، هذه الخاصية قد أصبحت مهملةً ويجب تجنب استعمالها.<syntaxhighlight lang=" | </syntaxhighlight>يمكن استعمال الخاصية <code>crypto.DEFAULT_ENCODING</code> لتغيير كيفية إعادة المفتاح <code>derivedKey</code>. على أي حال، هذه الخاصية قد أصبحت مهملةً ويجب تجنب استعمالها.<syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const crypto = require('crypto'); | |||
crypto.DEFAULT_ENCODING = 'hex'; | crypto.DEFAULT_ENCODING = 'hex'; | ||
const key = crypto.pbkdf2Sync('secret', 'salt', 100000, 512, 'sha512'); | const key = crypto.pbkdf2Sync('secret', 'salt', 100000, 512, 'sha512'); | ||
console.log(key); // '3745e48...aa39b34' | console.log(key); // '3745e48...aa39b34' | ||
</syntaxhighlight>يمكن استعمال التابع crypto.getHashes() لمعرفة أسماء الخوارزميات hash المدعومة. | </syntaxhighlight>يمكن استعمال التابع <code>[[Node.js/crypto#crypto.getHashes.28.29.E2.80.8E|crypto.getHashes()]]</code> لمعرفة أسماء الخوارزميات hash المدعومة. | ||
===crypto.privateDecrypt(privateKey, buffer)=== | ===<code>crypto.privateDecrypt(privateKey, buffer)</code>=== | ||
أضيف في الإصدار: v0.11.14. | أضيف في الإصدار: v0.11.14. | ||
*privateKey: <Object> | [[JavaScript/String|<string>]] | *<code>privateKey</code>: [[JavaScript/Object|<Object>]] | [[JavaScript/String|<string>]] | ||
**key: [[JavaScript/String|<string>]] مفتاحٌ خاص مُرمَّز بالترميز PEM. | **<code>key</code>: [[JavaScript/String|<string>]] مفتاحٌ خاص مُرمَّز بالترميز PEM. | ||
**passphrase: [[JavaScript/String|<string>]] عبارة مرور اختيارية للمفتاح key الخاص. | **<code>passphrase</code>: [[JavaScript/String|<string>]] عبارة مرور اختيارية للمفتاح <code>key</code> الخاص. | ||
**padding: <crypto.constants> قيمة حشوة إضافية معرَّفة في الثوابت crypto.constants والتي يمكن أن تكون: crypto.constants. | **<code>padding</code>: <crypto.constants> قيمة حشوة إضافية معرَّفة في الثوابت <code>crypto.constants</code> والتي يمكن أن تكون: <code>crypto.constants.RSA_NO_PADDING</code>، أو <code>crypto.constants.RSA_PKCS1_PADDING</code>، أو <code>crypto.constants.RSA_PKCS1_OAEP_PADDING</code>. | ||
*buffer: <Buffer> | <TypedArray> | <DataView> | *<code>buffer</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*القيم المعادة: <Buffer> كائن جديد من النوع Buffer يحوي المحتويات الوسيط buffer المعطى بعد فك تشفيرها. | *القيم المعادة: [[Node.js/buffer|<Buffer>]] كائن جديد من النوع <code>[[Node.js/buffer|Buffer]]</code> يحوي المحتويات الوسيط <code>buffer</code> المعطى بعد فك تشفيرها. | ||
يفك هذا التابع تشفير محتويات الوسيط buffer المعطى باستعمال المفتاح privateKey. يمكن أن يكون الوسيط privateKey كائنًا أو سلسلة نصية. إن كان سلسلة نصية، فسيُعامَل وكأنه المفتاح المعطى بدون عبارة مرور (passphrase) وسيستعمل القيمة RSA_PKCS1_OAEP_PADDING للطول الإضافي. | يفك هذا التابع تشفير محتويات الوسيط <code>buffer</code> المعطى باستعمال المفتاح <code>privateKey</code>. يمكن أن يكون الوسيط <code>privateKey</code> كائنًا أو سلسلة نصية. إن كان سلسلة نصية، فسيُعامَل وكأنه المفتاح المعطى بدون عبارة مرور (passphrase) وسيستعمل القيمة <code>RSA_PKCS1_OAEP_PADDING</code> للطول الإضافي. | ||
===crypto.privateEncrypt(privateKey, buffer)=== | ===<code>crypto.privateEncrypt(privateKey, buffer)</code>=== | ||
أضيف في الإصدار: v1.1.0. | أضيف في الإصدار: v1.1.0. | ||
*privateKey: <Object> | [[JavaScript/String|<string>]] | *<code>privateKey</code>: [[JavaScript/Object|<Object>]] | [[JavaScript/String|<string>]] | ||
*key:[[JavaScript/String|<string>]] مفتاحٌ خاص مُرمَّز بالترميز PEM. | *<code>key</code>:[[JavaScript/String|<string>]] مفتاحٌ خاص مُرمَّز بالترميز PEM. | ||
*passphrase: [[JavaScript/String|<string>]] عبارة مرور اختيارية للمفتاح key الخاص. | *<code>passphrase</code>: [[JavaScript/String|<string>]] عبارة مرور اختيارية للمفتاح key الخاص. | ||
*padding: <crypto.constants> قيمة حشوة إضافية معرَّفة في الثوابت crypto.constants والتي يمكن أن تكون: crypto.constants. | *<code>padding</code>: <crypto.constants> قيمة حشوة إضافية معرَّفة في الثوابت <code>crypto.constants</code> والتي يمكن أن تكون: <code>crypto.constants.RSA_NO_PADDING</code>، أو <code>crypto.constants.RSA_PKCS1_PADDIN</code>. | ||
*buffer: < | *<code>buffer</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*القيم المعادة: <Buffer> كائن جديد من النوع Buffer يحوي المحتويات الوسيط buffer المعطى بعد تشفيرها. | *القيم المعادة: [[Node.js/buffer|<Buffer>]] كائن جديد من النوع <code>[[Node.js/buffer|Buffer]]</code> يحوي المحتويات الوسيط <code>buffer</code> المعطى بعد تشفيرها. | ||
يشفِّر هذا التابع محتويات الوسيط buffer المعطى باستعمال المفتاح privateKey. يمكن أن يكون الوسيط privateKey كائنًا أو سلسلةً نصيةً. إن كان سلسلة نصية، فسيُعامَل وكأنه المفتاح المعطى بدون عبارة مرور (passphrase) وستُستعمَل القيمة RSA_PKCS1_PADDING للحاشية. | يشفِّر هذا التابع محتويات الوسيط <code>buffer</code> المعطى باستعمال المفتاح <code>privateKey</code>. يمكن أن يكون الوسيط <code>privateKey</code> كائنًا أو سلسلةً نصيةً. إن كان سلسلة نصية، فسيُعامَل وكأنه المفتاح المعطى بدون عبارة مرور (passphrase) وستُستعمَل القيمة <code>RSA_PKCS1_PADDING</code> للحاشية. | ||
===crypto.publicDecrypt(key, buffer)=== | ===<code>crypto.publicDecrypt(key, buffer)</code>=== | ||
أضيف في الإصدار: v1.1.0. | أضيف في الإصدار: v1.1.0. | ||
*key: <Object> | [[JavaScript/String|<string>]] | *<code>key</code>: <Object> | [[JavaScript/String|<string>]] | ||
**key: [[JavaScript/String|<string>]] مفتاحٌ عام أو خاص مُرمَّز بالترميز PEM. | **<code>key</code>: [[JavaScript/String|<string>]] مفتاحٌ عام أو خاص مُرمَّز بالترميز PEM. | ||
**passphrase: [[JavaScript/String|<string>]] عبارة مرور اختيارية للمفتاح key الخاص. | **<code>passphrase</code>: [[JavaScript/String|<string>]] عبارة مرور اختيارية للمفتاح key الخاص. | ||
**padding: <crypto.constants> قيمة حشوة إضافية مُعرَّفَة في الثوابت crypto.constants والتي يمكن أن تكون: crypto.constants. | **<code>padding</code>: <crypto.constants> قيمة حشوة إضافية مُعرَّفَة في الثوابت <code>crypto.constants</code> والتي يمكن أن تكون: <code>crypto.constants.RSA_NO_PADDING</code>، أو <code>crypto.constants.RSA_PKCS1_PADDING</code>. | ||
*buffer: <Buffer> | <TypedArray> | <DataView> | *<code>buffer</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*القيم المعادة: <Buffer> كائن جديد من النوع Buffer يحوي | *القيم المعادة: [[Node.js/buffer|<Buffer>]] كائن جديد من النوع <code>[[Node.js/buffer|Buffer]]</code> يحوي المحتويات الوسيط <code>buffer</code> المعطى بعد فك تشفيرها. | ||
يفك هذا التابع تشفير محتويات الوسيط buffer المعطى باستعمال المفتاح key. يمكن أن يكون الوسيط key كائنًا أو سلسلة نصية. إن كان سلسلة نصية، فسيُعامَل وكأنه المفتاح المعطى بدون عبارة مرور (passphrase) وسيُستعمَل القيمة RSA_PKCS1_PADDING للحاشية. لما كان بالإمكان اشتقاق المفاتيح RSA العامة من المفاتيح الخاصة، فيمكن بناءً على ذلك تمرير مفتاح خاص عوضًا عن مفتاح عام. | يفك هذا التابع تشفير محتويات الوسيط <code>buffer</code> المعطى باستعمال المفتاح <code>key</code>. يمكن أن يكون الوسيط <code>key</code> كائنًا أو سلسلة نصية. إن كان سلسلة نصية، فسيُعامَل وكأنه المفتاح المعطى بدون عبارة مرور (passphrase) وسيُستعمَل القيمة <code>RSA_PKCS1_PADDING</code> للحاشية. لما كان بالإمكان اشتقاق المفاتيح RSA العامة من المفاتيح الخاصة، فيمكن بناءً على ذلك تمرير مفتاح خاص عوضًا عن مفتاح عام. | ||
===crypto.publicEncrypt(key, buffer)=== | ===<code>crypto.publicEncrypt(key, buffer)</code>=== | ||
أضيف في الإصدار: v0.11.14. | أضيف في الإصدار: v0.11.14. | ||
*key: <Object> | [[JavaScript/String|<string>]] | *<code>key</code>: [[JavaScrip/Object|<Object>]] | [[JavaScript/String|<string>]] | ||
**key: [[JavaScript/String|<string>]] مفتاحٌ عام أو خاص مُرمَّز بالترميز PEM. | **<code>key</code>: [[JavaScript/String|<string>]] مفتاحٌ عام أو خاص مُرمَّز بالترميز PEM. | ||
**passphrase: [[JavaScript/String|<string>]] عبارة مرور اختيارية للمفتاح key الخاص. | **<code>passphrase</code>: [[JavaScript/String|<string>]] عبارة مرور اختيارية للمفتاح key الخاص. | ||
**padding: <crypto.constants> قيمة حاشية إضافية مُعرَّفَة في الثوابت crypto.constants والتي يمكن أن تكون: crypto.constants. | **<code>padding</code>: <crypto.constants> قيمة حاشية إضافية مُعرَّفَة في الثوابت <code>crypto.constants</code> والتي يمكن أن تكون: <code>crypto.constants.RSA_NO_PADDING</code>، أو <code>crypto.constants.RSA_PKCS1_PADDING</code>، أو <code>RSA_PKCS1_OAEP_PADDIN</code>. | ||
* | *<code>buffer</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*القيم المعادة: [[Node.js/buffer|<Buffer>]] كائن جديد من النوع <code>[[Node.js/buffer|Buffer]]</code> يحوي المحتويات الوسيط <code>buffer</code> المعطى بعد تشفيرها. | |||
يفك هذا التابع تشفير محتويات الوسيط buffer المعطى باستعمال المفتاح key. يمكن أن يكون الوسيط key كائنًا أو سلسلة نصية. إن كان سلسلة نصية، فسيُعامَل وكأنه المفتاح المعطى بدون عبارة مرور (passphrase) وستُستعمَل القيمة RSA_PKCS1_PADDING للحاشية. لما كان بالإمكان اشتقاق المفاتيح RSA العامة من المفاتيح الخاصة، فيمكن بناءً على ذلك تمرير مفتاح خاص عوضًا عن مفتاح عام. | يفك هذا التابع تشفير محتويات الوسيط <code>buffer</code> المعطى باستعمال المفتاح <code>key</code>. يمكن أن يكون الوسيط <code>key</code> كائنًا أو سلسلة نصية. إن كان سلسلة نصية، فسيُعامَل وكأنه المفتاح المعطى بدون عبارة مرور (passphrase) وستُستعمَل القيمة <code>RSA_PKCS1_PADDING</code> للحاشية. لما كان بالإمكان اشتقاق المفاتيح RSA العامة من المفاتيح الخاصة، فيمكن بناءً على ذلك تمرير مفتاح خاص عوضًا عن مفتاح عام. | ||
===crypto.randomBytes(size[, callback])=== | ===<code>crypto.randomBytes(size[, callback])</code>=== | ||
سجل التغييرات | {| class="wikitable mw-collapsible" | ||
|+سجل التغييرات | |||
!الإصدار | |||
*size: <number> | !التغييرات | ||
*callback: <Function> | |- | ||
**err: <Error> | |v9.0.0 | ||
**buf: <Buffer> | |يؤدي تمرير القيمة <code>null</code> إلى الوسيط <code>callback</code> إلى رمي الخطأ <code>ERR_INVALID_CALLBACK</code>. | ||
*القيم المعادة: <Buffer> كائنٌ من النوع Buffer إن لم تُعطَ الدالة callback. | |- | ||
يولِّد هذا التابع بيانات ذات تشفير جيد وشبه عشوائية. يحدد الوسيط size عدد البايتات المراد توليدها. إن أعطيت الدالة | |v0.5.8 | ||
// توليد البايتات بشكل غير متزامن | |أضيف هذا التابع. | ||
|} | |||
*<code>size</code>: [[JavaScript/Number| <number>]] | |||
*<code>callback</code>: [[JavaScript/Function|<Function>]] | |||
**<code>err</code>: [[JavaScript/Error|<Error>]] | |||
**<code>buf</code>: [[Node.js/buffer|<Buffer>]] | |||
*القيم المعادة: [[Node.js/buffer|<Buffer>]] كائنٌ من النوع <code>[[Node.js/buffer|Buffer]]</code> إن لم تُعطَ الدالة <code>callback</code>. | |||
يولِّد هذا التابع بيانات ذات تشفير جيد وشبه عشوائية. يحدد الوسيط <code>size</code> عدد البايتات المراد توليدها. إن أعطيت الدالة <code>callback</code>، فستُولَّد البايتات بشكل غير متزامن وستستدعى الدالة <code>callback</code> مع الوسيطين: <code>err</code>، و <code>buf</code>. إن حصل أي خطأ، فسيكون الوسيط <code>err</code> كائنًا من النوع <code>Error</code>؛ خلا ذلك، ستكون قيمته <code>null</code>. أما الوسيط <code>buf</code>، فهو كائنٌ من النوع <code>[[Node.js/buffer|Buffer]]</code> يحوي البايتات المولدة.<syntaxhighlight lang="javascript">// توليد البايتات بشكل غير متزامن | |||
const crypto = require('crypto'); | const crypto = require('crypto'); | ||
crypto.randomBytes(256, (err, buf) => { | crypto.randomBytes(256, (err, buf) => { | ||
سطر 1٬009: | سطر 1٬131: | ||
console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`); | console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`); | ||
}); | }); | ||
</syntaxhighlight>أما إن لم تُعطَ الدالة | </syntaxhighlight>أما إن لم تُعطَ الدالة <code>callback</code>، فستُولَّد البايتات بشكل متزامن وتعاد في كائن من النوع <code>[[Node.js/buffer|Buffer]]</code>. سيُرمَى خطأٌ إن حصل أي خطأ أثناء عملية توليد البايتات.<syntaxhighlight lang="javascript">// توليد البايتات بشكل متزامن | ||
// توليد البايتات بشكل متزامن | |||
const buf = crypto.randomBytes(256); | const buf = crypto.randomBytes(256); | ||
console.log( | console.log( | ||
`${buf.length} bytes of random data: ${buf.toString('hex')}`); | `${buf.length} bytes of random data: ${buf.toString('hex')}`); | ||
</syntaxhighlight>انتبه إلى أنَّ التابع crypto.randomBytes() لن يكمل عملية التوليد حتى تكون العشوائية (entropy) كافية. لا يجب أن يستغرق هذا أكثر من بضعة أجزاء من الميلي ثانية. الوقت الوحيد الذي قد تستغرق فيه الدالة أطول فترة يمكن أن تتخيلها لتوليد البايتات العشوائية هي بعد الإقلاع حقيقةً؛ أي في الفترة التي لا يزال فيها مقياس العشوائية في النظام بأكمله منخفضًا. انتبه إلى أنَّ الواجهة البرمجية هذه تستعمل مجمع الخيوط الخاص بالمكتبة libuv التي يكون لها آثارًا مفاجئة وسلبية على الأداء لبعض التطبيقات. راجع القسم UV_THREADPOOL_SIZE=size في توثيق | </syntaxhighlight>انتبه إلى أنَّ التابع <code>crypto.randomBytes()</code> لن يكمل عملية التوليد حتى تكون العشوائية (entropy) كافية. لا يجب أن يستغرق هذا أكثر من بضعة أجزاء من الميلي ثانية. الوقت الوحيد الذي قد تستغرق فيه الدالة أطول فترة يمكن أن تتخيلها لتوليد البايتات العشوائية هي بعد الإقلاع حقيقةً؛ أي في الفترة التي لا يزال فيها مقياس العشوائية في النظام بأكمله منخفضًا. انتبه إلى أنَّ الواجهة البرمجية هذه تستعمل مجمع الخيوط الخاص بالمكتبة libuv التي يكون لها آثارًا مفاجئة وسلبية على الأداء لبعض التطبيقات. راجع القسم <code>[[Node.js/cli#UV THREADPOOL SIZE.3Dsize|UV_THREADPOOL_SIZE=size]]</code> في توثيق «<nowiki/>[[Node.js/cli|خيارات سطر الأوامر في Node.js]]» لمزيد من التفاصيل. ينفَّذ الإصدار غير المتزامن من التابع <code>crypto.randomBytes()</code> في طلب مجمع خيط وحيد (single threadpool request). إن أردت تقليل التغيير في طول مهمة مجمع الخيط، فَاعْمَل على تجزئة الطلبات <code>randomBytes</code> الكبيرة عند تنفيذ ذلك بوصفه جزءًا من عملية إنجاز طلبٍ لعميل. | ||
===crypto.randomFillSync(buffer[, offset][, size])=== | ===<code>crypto.randomFillSync(buffer[, offset][, size])</code>=== | ||
{| class="wikitable" | |||
!الإصدار | |||
!التغييرات | |||
*buffer: <Buffer> | < | |- | ||
*offset: <number> القيمة الافتراضية هي: 0 | |v9.0.0 | ||
*size: | |أصبح بالإمكان أن يكون الوسيط <code>buffer</code> كانئًا من النوع <code>TypedArray</code> أو <code>DataView</code>. | ||
*القيم المعادة: <Buffer> | <TypedArray> | <DataView> الكائن المعطى في الوسيط buffer. | |- | ||
يمثل هذا التابع الإصدار المتزامن من التابع crypto.randomFill().<syntaxhighlight lang=" | |v7.10.0 | ||
const buf = Buffer.alloc(10); | |أضيف هذا التابع. | ||
|} | |||
*<code>buffer</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]]يجب أن يعطى هذا الوسيط. | |||
*<code>offset</code>: [[JavaScript/Number|<number>]] القيمة الافتراضية هي: 0 | |||
*<code>size</code>: [[JavaScript/Number|<number>]] القيمة الافتراضية هي: <code>buffer.length - offset</code>. | |||
*القيم المعادة: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] الكائن المعطى في الوسيط <code>buffer</code>. | |||
يمثل هذا التابع الإصدار المتزامن من التابع <code>[[Node.js/crypto#crypto.randomFill.28buffer.5B.2C offset.5D.5B.2C size.5D.2C callback.29.E2.80.8E|crypto.randomFill()]]</code>.<syntaxhighlight lang="javascript">const buf = Buffer.alloc(10); | |||
console.log(crypto.randomFillSync(buf).toString('hex')); | console.log(crypto.randomFillSync(buf).toString('hex')); | ||
سطر 1٬033: | سطر 1٬160: | ||
crypto.randomFillSync(buf, 5, 5); | crypto.randomFillSync(buf, 5, 5); | ||
console.log(buf.toString('hex')); | console.log(buf.toString('hex')); | ||
</syntaxhighlight>يمكن الآن أن يكون الوسيط buffer كائنًا من النوع TypedArray أو DataView:<syntaxhighlight lang=" | </syntaxhighlight>يمكن الآن أن يكون الوسيط <code>buffer</code> كائنًا من النوع <code>[[JavaScript/TypedArray|TypedArray]]</code> أو <code>[[JavaScript/TypedArray|DataView]]</code>:<syntaxhighlight lang="javascript">const a = new Uint32Array(10); | ||
const a = new Uint32Array(10); | |||
console.log(Buffer.from(crypto.randomFillSync(a).buffer, | console.log(Buffer.from(crypto.randomFillSync(a).buffer, | ||
a.byteOffset, a.byteLength).toString('hex')); | a.byteOffset, a.byteLength).toString('hex')); | ||
سطر 1٬046: | سطر 1٬172: | ||
c.byteOffset, c.byteLength).toString('hex')); | c.byteOffset, c.byteLength).toString('hex')); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===crypto.randomFill(buffer[, offset][, size], callback)=== | ===<code>crypto.randomFill(buffer[, offset][, size], callback)</code>=== | ||
سجل التغييرات | {| class="wikitable mw-collapsible" | ||
|+سجل التغييرات | |||
!الإصدار | |||
*buffer: <Buffer> | <TypedArray> | <DataView> | !التغييرات | ||
*offset: <number> القيمة الافتراضية هي: 0 | |- | ||
*size: | |v9.0.0 | ||
*callback: <Function> دالة من الشكل function(err, buf) {}. | |أصبح بالإمكان أن يكون الوسيط <code>buffer</code> كانئًا من النوع <code>[[JavaScript/TypedArray|TypedArray]]</code> أو [[JavaScript/DataView|<code>DataView</code>]]. | ||
هذا التابع مماثل تمامًا للتابع crypto.randomBytes() باستثناء أنه يتطلب أن يكون الوسيط الأول المُمرَّر إليها كائنًا من النوع Buffer الذي يراد ملؤه. أضف إلى ذلك أنه يتطلب أيضًا تمرير دالة رد نداء (callback). إن لم تعطَ الدالة | |- | ||
const buf = Buffer.alloc(10); | |v7.10.0 | ||
|أضيف هذا التابع. | |||
|} | |||
*<code>buffer</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]]يجب أن يعطى هذا الوسيط. | |||
*<code>offset</code>: [[JavaScript/Number|<number>]] القيمة الافتراضية هي: 0 | |||
*<code>size</code>: [[JavaScript/Number|<number>]] القيمة الافتراضية هي: <code>buffer.length - offset</code>. | |||
*<code>callback</code>: <Function> دالة من الشكل <code>function(err, buf) {}</code>. | |||
هذا التابع مماثل تمامًا للتابع <code>[[Node.js/crypto#crypto.randomBytes.28size.5B.2C callback.5D.29.E2.80.8E|crypto.randomBytes()]]</code> باستثناء أنه يتطلب أن يكون الوسيط الأول المُمرَّر إليها كائنًا من النوع <code>[[Node.js/buffer|Buffer]]</code> الذي يراد ملؤه. أضف إلى ذلك أنه يتطلب أيضًا تمرير دالة رد نداء (callback). إن لم تعطَ الدالة <code>callback</code>، فسيُرمى خطأٌ.<syntaxhighlight lang="javascript">const buf = Buffer.alloc(10); | |||
crypto.randomFill(buf, (err, buf) => { | crypto.randomFill(buf, (err, buf) => { | ||
if (err) throw err; | if (err) throw err; | ||
سطر 1٬071: | سطر 1٬204: | ||
console.log(buf.toString('hex')); | console.log(buf.toString('hex')); | ||
}); | }); | ||
</syntaxhighlight>يمكن الآن أن يكون الوسيط buffer كائنًا من النوع TypedArray أو DataView:<syntaxhighlight lang=" | </syntaxhighlight>يمكن الآن أن يكون الوسيط <code>buffer</code> كائنًا من النوع <code>[[JavaScript/TypedArray|TypedArray]]</code> أو <code>[[JavaScript/DataView|DataView]]</code>:<syntaxhighlight lang="javascript">const a = new Uint32Array(10); | ||
const a = new Uint32Array(10); | |||
crypto.randomFill(a, (err, buf) => { | crypto.randomFill(a, (err, buf) => { | ||
if (err) throw err; | if (err) throw err; | ||
سطر 1٬092: | سطر 1٬224: | ||
.toString('hex')); | .toString('hex')); | ||
}); | }); | ||
</syntaxhighlight>انتبه إلى أنَّ الواجهة البرمجية هذه تستعمل مجمع الخيوط الخاص بالمكتبة libuv التي يكون لها آثارًا مفاجئة وسلبية على الأداء لبعض التطبيقات. راجع القسم UV_THREADPOOL_SIZE=size في توثيق | </syntaxhighlight>انتبه إلى أنَّ الواجهة البرمجية هذه تستعمل مجمع الخيوط الخاص بالمكتبة libuv التي يكون لها آثارًا مفاجئة وسلبية على الأداء لبعض التطبيقات. راجع القسم <code>[[Node.js/cli#UV THREADPOOL SIZE.3Dsize|UV_THREADPOOL_SIZE=size]]</code> في توثيق «<nowiki/>[[Node.js/cli|خيارات سطر الأوامر في Node.js]]» لمزيد من التفاصيل. ينفَّذ الإصدار غير المتزامن من التابع <code>crypto.randomFill()</code> في طلب مجمع خيط وحيد (single threadpool request). إن أردت تقليل التغيير في طول مهمة مجمع الخيط، فَاعْمَل على تجزئة الطلبات <code>randomFill</code> الكبيرة عند تنفيذ ذلك بوصفه جزءًا من عملية إنجاز طلبٍ لعميل. | ||
===crypto.scrypt(password, salt, keylen[, options], callback)=== | ===<code>crypto.scrypt(password, salt, keylen[, options], callback)</code>=== | ||
سجل التغييرات | {| class="wikitable mw-collapsible" | ||
|+سجل التغييرات | |||
!الإصدار | |||
*password: [[JavaScript/String|<string>]] | <Buffer> | <TypedArray> | <DataView> | !التغييرات | ||
*salt: [[JavaScript/String|<string>]] | <Buffer> | < | |- | ||
*keylen: <number> | |v10.9.0 | ||
*options: <Object> | |أضيفت أسماء الخيارات التالية: <code>cost</code>، و <code>blockSize</code>، و <code>parallelization</code>. | ||
**cost: <number> | |- | ||
**N: <number> | |v10.5.0 | ||
**blockSize: | |أضيف هذا التابع. | ||
**parallelization: <number> | |} | ||
**N: <number> اسمٌ بديل للمعامل cost. يجب تحديد أحدهما فقط. | *<code>password</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
**r: <number> | *<code>salt</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
**p: <number> اسمٌ بديل للمعامل parallelization. يجب تحديد أحدهما فقط. | *<code>keylen</code>: [[JavaScript/Number|<number>]] | ||
**maxmem: <number> الحد الأعلى للذاكرة. يجب أن تكون (تقريبًا) 128 * N * r > maxmem. القيمة الافتراضية هي: 32 * 1024 * 1024. | *<code>options</code>: [[JavaScript/Object|<Object>]] | ||
*callback: <Function> | **<code>cost</code>: [[JavaScript/Number|<number>]] معامل يحدد المقدار المطلوب من الذاكرة أو المعالج. يجب أن يكون من مضاعفات العدد 2n، إذ n هو 1، أو 2، ...إلخ. | ||
**err: <Error> | **<code>N</code>: [[JavaScript/Number|<number>]] معامل يحدد المقدار المطلوب من الذاكرة أو المعالج. يجب أن يكون من مضاعفات العدد 2n، إذ n هو 1، أو 2، ...إلخ. القيمة الافتراضية هي: 16384. | ||
**derivedKey: <Buffer> | **<code>blockSize</code>: [[JavaScript/Number|<number>]] معامل حجم الكتلة (block size). القيمة الافتراضية هي: 8. | ||
يوفر هذا التابع تنفيذًا غير متزامن للدالة scrypt. الدالة scrypt هي دالة اشتقاق مفتاح يعتمد على كلمة سر صُمِّمَت خصيصًا لتكون ذات قدرة حسابية كبيرة واستهلاك ذكي للذاكرة لكي لا تحقق أية هجمات شرسة غايتها. يجب أن تكون قيمة الوسيط salt فريدةً قدر الإمكان. يوصى أيضًا أن تكون قيمة salt عشوائية ولا يقل طولها عن 10 بايت. ارجع إلى المستند NIST SP 800-132 لمزيد من التفاصيل. تُستدعَى الدالة callback مع الوسيطين | **<code>parallelization</code>: [[JavaScript/Number|<number>]] معامل التوازي (Parallelization parameter). القيمة الافتراضية هي: 1. | ||
const crypto = require('crypto'); | **<code>N</code>: [[JavaScript/Number|<number>]] اسمٌ بديل للمعامل <code>cost</code>. يجب تحديد أحدهما فقط. | ||
**<code>r</code>: [[JavaScript/Number|<number>]] اسمٌ بديل للمعامل <code>blockSize</code>. يجب تحديد أحدهما فقط. | |||
**<code>p</code>: [[JavaScript/Number|<number>]] اسمٌ بديل للمعامل <code>parallelization</code>. يجب تحديد أحدهما فقط. | |||
**<code>maxmem</code>: [[JavaScript/Number|<number>]] الحد الأعلى للذاكرة. يجب أن تكون (تقريبًا) <code>128 * N * r > maxmem</code>. القيمة الافتراضية هي: 32 * 1024 * 1024. | |||
*<code>callback</code>: [[JavaScript/Function|<Function>]] | |||
**<code>err</code>: [[JavaScript/Error|<Error>]] | |||
**<code>derivedKey</code>: [[Node.js/buffer| <Buffer>]] | |||
يوفر هذا التابع تنفيذًا غير متزامن للدالة <code>scrypt</code>. الدالة <code>scrypt</code> هي دالة اشتقاق مفتاح يعتمد على كلمة سر صُمِّمَت خصيصًا لتكون ذات قدرة حسابية كبيرة واستهلاك ذكي للذاكرة لكي لا تحقق أية هجمات شرسة غايتها. يجب أن تكون قيمة الوسيط <code>salt</code> فريدةً قدر الإمكان. يوصى أيضًا أن تكون قيمة <code>salt</code> عشوائية ولا يقل طولها عن 10 بايت. ارجع إلى المستند [https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf NIST SP 800-132] لمزيد من التفاصيل. تُستدعَى الدالة <code>callback</code> مع الوسيطين <code>err</code>، و <code>derivedKey</code>. يكون الوسيط <code>err</code> كائنَ استثناء عند فشل اشتقاق المفتاح وإلا ستكون قيمته <code>null</code>. يُمرَّر الوسيط <code>derivedKey</code> إلى دالة رد النداء ككائن من النوع <code>[[Node.js/buffer|Buffer]]</code>. يُرمَى استثناءٌ إن كانت قيمة أو نوع أحد الوسائط الممررة غير صالحة.<syntaxhighlight lang="javascript">const crypto = require('crypto'); | |||
// استعمال القيم الافتراضية | // استعمال القيم الافتراضية | ||
crypto.scrypt('secret', 'salt', 64, (err, derivedKey) => { | crypto.scrypt('secret', 'salt', 64, (err, derivedKey) => { | ||
سطر 1٬125: | سطر 1٬264: | ||
}); | }); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===crypto.scryptSync(password, salt, keylen[, options])=== | ===<code>crypto.scryptSync(password, salt, keylen[, options])</code>=== | ||
سجل التغييرات | {| class="wikitable mw-collapsible" | ||
|+سجل التغييرات | |||
!الإصدار | |||
*password: [[JavaScript/String|<string>]] | <Buffer> | <TypedArray> | <DataView> | !التغييرات | ||
*salt: [[JavaScript/String|<string>]] | <Buffer> | <TypedArray> | <DataView> | |- | ||
*keylen: <number> | |v10.9.0 | ||
*options: <Object> | |أضيفت أسماء الخيارات التالية: <code>cost</code>، و <code>blockSize</code>، و <code>parallelization</code>. | ||
**cost: | |- | ||
**N: <number> معامل يحدد المقدار المطلوب من الذاكرة أو المعالج. يجب أن يكون من مضاعفات العدد 2n، إذ n هو 1، أو 2، ...إلخ. القيمة الافتراضية هي: 16384. | |v10.5.0 | ||
**blockSize: <number> | |أضيف هذا التابع. | ||
**parallelization: | |} | ||
**N: | *<code>password</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
**r: | *<code>salt</code>: [[JavaScript/String|<string>]] | [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
**p: | *<code>keylen</code>: [[JavaScript/Number|<number>]] | ||
**maxmem: | *<code>options</code>: [[JavaScript/Object|<Object>]] | ||
*callback: <Function> | **<code>cost</code>: [[JavaScript/Number|<number>]]معامل يحدد المقدار المطلوب من الذاكرة أو المعالج. يجب أن يكون من مضاعفات العدد 2n، إذ n هو 1، أو 2، ...إلخ. | ||
**err: <Error> | **<code>N</code>: [[JavaScript/Number|<number>]] معامل يحدد المقدار المطلوب من الذاكرة أو المعالج. يجب أن يكون من مضاعفات العدد 2n، إذ n هو 1، أو 2، ...إلخ. القيمة الافتراضية هي: 16384. | ||
**derivedKey: <Buffer> | **<code>blockSize</code>: [[JavaScript/Number|<number>]]معامل حجم الكتلة (block size). القيمة الافتراضية هي: 8. | ||
*القيم المعادة: <Buffer> | **<code>parallelization</code>: [[JavaScript/Number|<number>]] معامل التوازي (Parallelization parameter). القيمة الافتراضية هي: 1. | ||
يوفر هذا التابع تنفيذًا متزامنًا للدالة scrypt. الدالة scrypt هي دالة اشتقاق مفتاح يعتمد على كلمة سر صُمِّمَت خصيصًا لتكون ذات قدرة حسابية كبيرة واستهلاك ذكي وواسع للذاكرة لكي لا تحقق أية هجمات شرسة غايتها. يجب أن تكون قيمة الوسيط salt فريدةً قدر الإمكان. يُوصَى أيضًا أن تكون قيمة salt عشوائية ولا يقل طولها عن 10 بايت. ارجع إلى المستند NIST SP 800-132 لمزيد من التفاصيل. يرمى استثناءٌ إن كانت قيمة أو نوع أحد الوسائط الممررة غير صالح.<syntaxhighlight lang=" | **<code>N</code>: [[JavaScript/Number|<number>]]اسمٌ بديل للمعامل <code>cost</code>. يجب تحديد أحدهما فقط. | ||
const crypto = require('crypto'); | **<code>r</code>: [[JavaScript/Number|<number>]]اسمٌ بديل للمعامل <code>blockSize</code>. يجب تحديد أحدهما فقط. | ||
**<code>p</code>: [[JavaScript/Number|<number>]]اسمٌ بديل للمعامل <code>parallelization</code>. يجب تحديد أحدهما فقط. | |||
**<code>maxmem</code>: [[JavaScript/Number|<number>]]الحد الأعلى للذاكرة. يجب أن تكون (تقريبًا) <code>128 * N * r > maxmem</code>. القيمة الافتراضية هي: 32 * 1024 * 1024. | |||
*<code>callback</code>: [[JavaScript/Function|<Function>]] | |||
**<code>err</code>: [[JavaScript/Error|<Error>]] | |||
**<code>derivedKey</code>: [[Node.js/buffer|<Buffer>]] | |||
*القيم المعادة: [[Node.js/buffer|<Buffer>]] | |||
يوفر هذا التابع تنفيذًا متزامنًا للدالة <code>scrypt</code>. الدالة <code>scrypt</code> هي دالة اشتقاق مفتاح يعتمد على كلمة سر صُمِّمَت خصيصًا لتكون ذات قدرة حسابية كبيرة واستهلاك ذكي وواسع للذاكرة لكي لا تحقق أية هجمات شرسة غايتها. يجب أن تكون قيمة الوسيط salt فريدةً قدر الإمكان. يُوصَى أيضًا أن تكون قيمة salt عشوائية ولا يقل طولها عن 10 بايت. ارجع إلى المستند [https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf NIST SP 800-132] لمزيد من التفاصيل. يرمى استثناءٌ إن كانت قيمة أو نوع أحد الوسائط الممررة غير صالح.<syntaxhighlight lang="javascript">const crypto = require('crypto'); | |||
// استخدام القيم الافتراضية | // استخدام القيم الافتراضية | ||
const key1 = crypto.scryptSync('secret', 'salt', 64); | const key1 = crypto.scryptSync('secret', 'salt', 64); | ||
سطر 1٬154: | سطر 1٬300: | ||
console.log(key2.toString('hex')); // '3745e48...aa39b34' | console.log(key2.toString('hex')); // '3745e48...aa39b34' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===crypto.setEngine(engine[, flags])=== | ===<code>crypto.setEngine(engine[, flags])</code>=== | ||
أضيف في الإصدار: v0.11.11. | أضيف في الإصدار: v0.11.11. | ||
*engine: [[JavaScript/String|<string>]] | *<code>engine</code>: [[JavaScript/String|<string>]] | ||
*flags: <crypto.constants> القيمة الافتراضية هي: crypto.constants.ENGINE_METHOD_ALL. | *<code>flags</code>: <crypto.constants> القيمة الافتراضية هي: <code>crypto.constants.ENGINE_METHOD_ALL</code>. | ||
تحمل هذه الدالة وتضبط الوسيط engine لبعض أو جميع دوال OpenSSL (المحددة عبر الوسيط flags). يمكن أن يكون الوسيط engine إما مُعرِّفًا (id) أو مسارًا لمكتبة المحرك المشتركة. الوسيط flags هو حقل بِتِّي (bit field)، وقيمته الافتراضية هي ENGINE_METHOD_ALL. يمكن أن يأخذ رايةً واحدةً أو مزيجًا من الرايات التالية (المعرَّفة في crypto.constants): | تحمل هذه الدالة وتضبط الوسيط <code>engine</code> لبعض أو جميع دوال OpenSSL (المحددة عبر الوسيط <code>flags</code>). يمكن أن يكون الوسيط <code>engine</code> إما مُعرِّفًا (id) أو مسارًا لمكتبة المحرك المشتركة. الوسيط flags هو حقل بِتِّي (bit field)، وقيمته الافتراضية هي <code>ENGINE_METHOD_ALL</code>. يمكن أن يأخذ رايةً واحدةً أو مزيجًا من الرايات التالية (المعرَّفة في <code>crypto.constants</code>): | ||
*crypto.constants.ENGINE_METHOD_RSA | *<code>crypto.constants.ENGINE_METHOD_RSA</code> | ||
*crypto.constants.ENGINE_METHOD_DSA | *<code>crypto.constants.ENGINE_METHOD_DSA</code> | ||
*crypto.constants.ENGINE_METHOD_DH | *<code>crypto.constants.ENGINE_METHOD_DH</code> | ||
*crypto.constants.ENGINE_METHOD_RAND | *<code>crypto.constants.ENGINE_METHOD_RAND</code> | ||
*crypto.constants.ENGINE_METHOD_EC | *<code>crypto.constants.ENGINE_METHOD_EC</code> | ||
*crypto.constants.ENGINE_METHOD_CIPHERS | *<code>crypto.constants.ENGINE_METHOD_CIPHERS</code> | ||
*crypto.constants.ENGINE_METHOD_DIGESTS | *<code>crypto.constants.ENGINE_METHOD_DIGESTS</code> | ||
*crypto.constants.ENGINE_METHOD_PKEY_METHS | *<code>crypto.constants.ENGINE_METHOD_PKEY_METHS</code> | ||
*crypto.constants.ENGINE_METHOD_PKEY_ASN1_METHS | *<code>crypto.constants.ENGINE_METHOD_PKEY_ASN1_METHS</code> | ||
*crypto.constants.ENGINE_METHOD_ALL | *<code>crypto.constants.ENGINE_METHOD_ALL</code> | ||
*crypto.constants.ENGINE_METHOD_NONE | *<code>crypto.constants.ENGINE_METHOD_NONE</code> | ||
الرايات التالية قد أهملت في الإصدار OpenSSL-1.1.0: | الرايات التالية قد أهملت في الإصدار OpenSSL-1.1.0: | ||
*crypto.constants.ENGINE_METHOD_ECDH | *<code>crypto.constants.ENGINE_METHOD_ECDH</code> | ||
*crypto.constants.ENGINE_METHOD_ECDSA | *<code>crypto.constants.ENGINE_METHOD_ECDSA</code> | ||
*crypto.constants.ENGINE_METHOD_STORE | *<code>crypto.constants.ENGINE_METHOD_STORE</code> | ||
===crypto.setFips(bool)=== | ===<code>crypto.setFips(bool)</code>=== | ||
أضيف في الإصدار: v10.0.0. | أضيف في الإصدار: v10.0.0. | ||
*bool: | *<code>bool</code>: [[JavaScript/Boolean|<boolean>]] إن أعطيت القيمة <code>true</code> فسيُفعَّل الوضع FIPS. | ||
يفعِّل هذا التابع الوضع FIPS المتوافق مع مزوِّد التشفير (crypto provider) في الإصدار Node.js المبني مع تمكين FIPS. سيُرمى خطأٌ إن لم يكن الوضع FIPS متاحًا. | يفعِّل هذا التابع الوضع FIPS المتوافق مع مزوِّد التشفير (crypto provider) في الإصدار Node.js المبني مع تمكين FIPS. سيُرمى خطأٌ إن لم يكن الوضع FIPS متاحًا. | ||
===crypto.timingSafeEqual(a, b)=== | ===<code>crypto.timingSafeEqual(a, b)</code>=== | ||
أضيف في الإصدار: v6.6.0. | أضيف في الإصدار: v6.6.0. | ||
*a: <Buffer> | < | *<code>a</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*b: <Buffer> | <TypedArray> | <DataView> | *<code>b</code>: [[Node.js/buffer|<Buffer>]] | [[JavaScript/TypedArray|<TypedArray>]] | [[JavaScript/DataView|<DataView>]] | ||
*القيم المعادة: <boolean> | *القيم المعادة: [[JavaScript/Boolean|<boolean>]] | ||
يعتمد هذا التابع على إحدى خوارزميات الوقت الثابت (constant-time algorithm). تعيد القيمة true إن كان الوسيط a مساويًا للوسيط b دون تسريب معلومات التوقيت التي ستسمح للمهاجم باستنتاج قيمة ما. هذا التابع مناسب للموازنة بين القيم HMAC أو القيم السرية مثل الكعكات المتعلقة بالمصادقة أو العناوين url الخارقة (capability urls). يجب أن يكون كلا الوسيطين a و b من النوع | يعتمد هذا التابع على إحدى خوارزميات الوقت الثابت (constant-time algorithm). تعيد القيمة <code>true</code> إن كان الوسيط <code>a</code> مساويًا للوسيط <code>b</code> دون تسريب معلومات التوقيت التي ستسمح للمهاجم باستنتاج قيمة ما. هذا التابع مناسب للموازنة بين القيم HMAC أو القيم السرية مثل الكعكات المتعلقة بالمصادقة أو العناوين url الخارقة (capability urls). يجب أن يكون كلا الوسيطين <code>a</code> و <code>b</code> من النوع <code>[[Node.js/buffer|Buffer]]</code>، أو <code>[[JavaScript/TypedArray|TypedArray]]</code>، أو <code>[[JavaScript/DataView|DataView]]</code>، ويجب أيضًا أن يكون لهما الطول نفسه. لا يضمن استعمال التابع <code>crypto.timingSafeEqual</code> أن تكون الشيفرة المحيطة ذات توقيت آمن (timing-safe). يجب أخذ الحيطة والحذر للتأكد من أنَّ الشيفرة المحيطة لا تخلق نقاط ضعف من ناحية التوقيت. | ||
==ملاحظات== | ==ملاحظات== | ||
===واجهات المجاري البرمجية الإرثية (Legacy Streams API) قبل الإصدار Node.js v0.10=== | ===واجهات المجاري البرمجية الإرثية (Legacy Streams API) قبل الإصدار Node.js v0.10=== | ||
أضيفت الوحدة Crypto إلى Node.js قبل ظهور مصطلح واجهة مجرى موحَّد برمجية (unified Stream API)، وحتى قبل وجود الكائنات Buffer التي تُستعمَل في التعامل مع البيانات الثنائية. بناءً على ذلك، امتلكت الأصناف crypto المُعرَّفة آنذاك توابع لم توجد في أصناف أخرى تنفذ واجهة المجاري البرمجية (مثل update() | أضيفت الوحدة <code>Crypto</code> إلى Node.js قبل ظهور مصطلح واجهة مجرى موحَّد برمجية (unified Stream API)، وحتى قبل وجود الكائنات <code>[[Node.js/buffer|Buffer]]</code> التي تُستعمَل في التعامل مع البيانات الثنائية. بناءً على ذلك، امتلكت الأصناف <code>crypto</code> المُعرَّفة آنذاك توابع لم توجد في أصناف أخرى تنفذ واجهة المجاري البرمجية (مثل <code>update()</code>، أو <code>final()</code>، أو <code>digest()</code>). أضف إلى ذلك، أغلب التوابع قبلت وأعادت سلاسل نصية مرمَّزة بالترميز <code>'latin1'</code> بشكل افتراضي بدلًا من الكائنات <code>[[Node.js/buffer|Buffer]]</code>. هذا السلوك الافتراضي تغيَّر بعد الإصدار Node.js v0.8 إلى استعمال الكائنات <code>[[Node.js/buffer|Buffer]]</code> افتراضيًّا. | ||
===تغييرات الصنف ECDH الحديثة=== | ===تغييرات الصنف <code>ECDH</code> الحديثة=== | ||
استعمال الصنف ECDH مع أزواج من المفاتيح المولَّدة بشكل غير ديناميكي قد أصبح بسيطًا. يمكن الآن استدعاء التابع ecdh.setPrivateKey() مع مفتاح خاص حُدِّد مسبقًا وسيُحسَب المفتاح العام المرتبط ثم يخزَّن في الكائن. هذا يسمح للشيفرة بتخزين وتوفير الجزء الخاص من زوج المفاتيح EC فقط. يتحقق التابع ecdh.setPrivateKey() الآن أيضًا من كون المفتاح الخاص صالحًا للمنحني المحدد. أصبح التابع ecdh.setPublicKey() الآن مهملًا، إذ أنَّ إدراجه ضمن واجهة برمجية لم يكن مفيدًا. يجب إمَّا أن يعيَّن المفتاح الخاص الذي خُزِّن مسبقًا لتوليد المفتاح العام المرتبط به تلقائيًّا، أو استدعاء التابع ecdh.generateKeys(). العقبة الرئيسية في استعمال التابع ecdh.setPublicKey() هي أنه يمكن استعماله لوضع زوج المفاتيح ECDH في حالة غير ثابتة (inconsistent state). | استعمال الصنف <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 ECDH|ECDH]]</code> مع أزواج من المفاتيح المولَّدة بشكل غير ديناميكي قد أصبح بسيطًا. يمكن الآن استدعاء التابع [[Node.js/crypto#ecdh.setPrivateKey.28privateKey.5B.2C encoding.5D.29.E2.80.8E|<code>ecdh.setPrivateKey()</code>]] مع مفتاح خاص حُدِّد مسبقًا وسيُحسَب المفتاح العام المرتبط ثم يخزَّن في الكائن. هذا يسمح للشيفرة بتخزين وتوفير الجزء الخاص من زوج المفاتيح EC فقط. يتحقق التابع [[Node.js/crypto#ecdh.setPrivateKey.28privateKey.5B.2C encoding.5D.29.E2.80.8E|<code>ecdh.setPrivateKey()</code>]] الآن أيضًا من كون المفتاح الخاص صالحًا للمنحني المحدد. أصبح التابع <code>[[Node.js/crypto#ecdh.setPublicKey.28publicKey.5B.2C encoding.5D.29.E2.80.8E|ecdh.setPublicKey()]]</code> الآن مهملًا، إذ أنَّ إدراجه ضمن واجهة برمجية لم يكن مفيدًا. يجب إمَّا أن يعيَّن المفتاح الخاص الذي خُزِّن مسبقًا لتوليد المفتاح العام المرتبط به تلقائيًّا، أو استدعاء التابع <code>[[Node.js/crypto#ecdh.generateKeys.28.5Bencoding.5B.2C format.5D.5D.29.E2.80.8E|ecdh.generateKeys()]]</code>. العقبة الرئيسية في استعمال التابع <code>[[Node.js/crypto#ecdh.setPublicKey.28publicKey.5B.2C encoding.5D.29.E2.80.8E|ecdh.setPublicKey()]]</code> هي أنه يمكن استعماله لوضع زوج المفاتيح <code>[[Node.js/crypto#.D8.A7.D9.84.D8.B5.D9.86.D9.81 ECDH|ECDH]]</code> في حالة غير ثابتة (inconsistent state). | ||
===دعم الخوارزميات الضعيفة والخطرة=== | ===دعم الخوارزميات الضعيفة والخطرة=== | ||
لا زالت الوحدة crypto تدعم بعض الخوارزميات التي تُعدُّ خطرة وتحوي ثغرات والتي لا يُنصَح باستعمالها مطلقًا في الوقت الحالي. تسمح الواجهة البرمجية أيضًا باستعمال عمليات التشفير وحساب hash مع مفاتيح صغيرة الحجم تعدُّ ضعيفةً للغاية وغير آمنة. يجب على المستخدمين أن يأخذوا على عاتقهم مسؤولية اختيار خوارزمية تشفير وحجم مفتاح بما يتطابق مع متطلبات الأمان التي يحتاجونها. بناءً على التوصيات المشار إليها في المستند NIST SP 800-131A: | لا زالت الوحدة <code>crypto</code> تدعم بعض الخوارزميات التي تُعدُّ خطرة وتحوي ثغرات والتي لا يُنصَح باستعمالها مطلقًا في الوقت الحالي. تسمح الواجهة البرمجية أيضًا باستعمال عمليات التشفير وحساب hash مع مفاتيح صغيرة الحجم تعدُّ ضعيفةً للغاية وغير آمنة. يجب على المستخدمين أن يأخذوا على عاتقهم مسؤولية اختيار خوارزمية تشفير وحجم مفتاح بما يتطابق مع متطلبات الأمان التي يحتاجونها. بناءً على التوصيات المشار إليها في المستند [https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf NIST SP 800-131A]: | ||
*لم يعد يُقبَل باستعمال الخوارزمية MD5 و SHA1 في المواقع التي لا يجب أن يحصل فيها أي تضارب مثل التواقيع الرقمية. | *لم يعد يُقبَل باستعمال الخوارزمية MD5 و SHA1 في المواقع التي لا يجب أن يحصل فيها أي تضارب مثل التواقيع الرقمية. | ||
*يوصى بأن لا يقل حجم المفتاح المستعمل مع الخوارزميات RSA، و DSA، و DH عن 2048 بت، والذي للمنحني ECDSA و ECDH لا يقل أيضًا عن 244 بت في حال أريد استعماله بشكل آمن لعدة سنوات. | *يوصى بأن لا يقل حجم المفتاح المستعمل مع الخوارزميات RSA، و DSA، و DH عن 2048 بت، والذي للمنحني ECDSA و ECDH لا يقل أيضًا عن 244 بت في حال أريد استعماله بشكل آمن لعدة سنوات. | ||
*تملك مجموعات DH التي تخص | *تملك مجموعات DH التي تخص <code>modp1</code>، و <code>modp2</code>، و <code>modp5</code> حجم مفتاح أصغر من 2048 ولا يوصى باستعمالها. | ||
ألقِ نظرة على المستند الذي أشرنا إليه آنفًا للاطلاع على المزيد من التوصيات والتفاصيل. | ألقِ نظرة على المستند الذي أشرنا إليه آنفًا للاطلاع على المزيد من التوصيات والتفاصيل. | ||
===الوضع CCM=== | ===الوضع CCM=== | ||
الوضع CCM هو أحد الخوارزميات AEAD المدعومة. يجب على التطبيقات التي تستعمل هذا الوضع أن تلتزم بقيود معينة عند استعمال واجهة التشفير البرمجية وهي: | الوضع CCM هو أحد [[wikipedia:Authenticated_encryption|الخوارزميات AEAD]] المدعومة. يجب على التطبيقات التي تستعمل هذا الوضع أن تلتزم بقيود معينة عند استعمال واجهة التشفير البرمجية وهي: | ||
*يجب تحديد طول بطاقة المصادقة أثناء إنشاء عملية التشفير عبر ضبط الخيار | *يجب تحديد طول بطاقة المصادقة أثناء إنشاء عملية التشفير عبر ضبط الخيار <code>authTagLength</code>، ويجب أن يكون أحد القيم التالية: 4، أو 6، أو 8، أو 10، 12، أو 14، أو 16 بايت. | ||
*يجب أن يتراوح طول المتغير الأولي (initialization vector) N بين 7 و 13 بايت؛ أي 7 ≤ N ≤ 13. | *يجب أن يتراوح طول المتغير الأولي (initialization vector) <code>N</code> بين 7 و 13 بايت؛ أي <code>7 ≤ N ≤ 13</code>. | ||
*يجب أن يحدد طول النص المجرد (plaintext) إلى القيمة 2 ** (8 * (15 - N)) بايت. | *يجب أن يحدد طول النص المجرد (plaintext) إلى القيمة 2 ** (8 * (15 - N)) بايت. | ||
*عند فك التشفير، يجب ضبط بطاقة المصادقة عبر setAuthTag() قبل تحديد بيانات موثوقة إضافية أو استدعاء update(). خلا ذلك، ستفشل عملية فك التشفير وسيرمي final() خطأً يتطابق مع الفقرة 2.6 في المعيار RFC 3610. | *عند فك التشفير، يجب ضبط بطاقة المصادقة عبر <code>[[Node.js/crypto#decipher.setAuthTag.28buffer.29.E2.80.8E|setAuthTag()]]</code> قبل تحديد بيانات موثوقة إضافية أو استدعاء <code>update()</code>. خلا ذلك، ستفشل عملية فك التشفير وسيرمي <code>final()</code> خطأً يتطابق مع الفقرة 2.6 في المعيار RFC 3610. | ||
*قد يؤدي استعمال توابع الصنف | *قد يؤدي استعمال توابع الصنف <code>stream</code>، مثل التابع <code>write(data)</code>، أو التابع <code>end(data)</code>، أو <code>pipe()</code>، في الوضع CCM إلى فشلها، إذ لا يستطيع الوضع CCM معالجة أكثر من قطعة واحدة من البيانات لكل نسخة. | ||
*عند تمرير بيانات موثوقة إضافية (AAD، اختصارٌ للعبارة additional authenticated data)، يجب أن يُمرَّر طول الرسالة الفعلية بالبايت إلى setAAD() عبر الخيار plaintextLength. هذا الامر ليس ضروريًّا إن لم تُستعمَل بيانات موثوقة إضافية. | *عند تمرير بيانات موثوقة إضافية (AAD، اختصارٌ للعبارة additional authenticated data)، يجب أن يُمرَّر طول الرسالة الفعلية بالبايت إلى <code>setAAD()</code> عبر الخيار <code>plaintextLength</code>. هذا الامر ليس ضروريًّا إن لم تُستعمَل بيانات موثوقة إضافية. | ||
*بما أن الوضع CCM يعالج الرسالة بأكملها في الوقت نفسه، فلا يمكن استدعاء التابع update() سوى مرةً واحدةً فقط. | *بما أن الوضع CCM يعالج الرسالة بأكملها في الوقت نفسه، فلا يمكن استدعاء التابع update() سوى مرةً واحدةً فقط. | ||
*رغم أنَّ استدعاء update() كافٍ لتشفير أو فك تشفير الرسالة إلا أنه يجب استدعاء final() لحساب أو التحقق من بطاقة المصادقة. | *رغم أنَّ استدعاء <code>update()</code> كافٍ لتشفير أو فك تشفير الرسالة إلا أنه يجب استدعاء <code>final()</code> لحساب أو التحقق من بطاقة المصادقة. | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="javascript">const crypto = require('crypto'); | ||
const crypto = require('crypto'); | |||
const key = 'keykeykeykeykeykeykeykey'; | const key = 'keykeykeykeykeykeykeykey'; | ||
سطر 1٬244: | سطر 1٬389: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==ثوابت الوحدة Crypto== | ==ثوابت الوحدة Crypto== | ||
يمكن تصدير الثوابت التالية باستدعاء crypto.constants التي يمكن تطبيقها واستعمالها في أماكن متعددة في الوحدات | يمكن تصدير الثوابت التالية باستدعاء <code>crypto.constants</code> التي يمكن تطبيقها واستعمالها في أماكن متعددة في الوحدات <code>crypto</code>، و <code>[[Node.js/tls|tls]]</code>، و <code>[[Node.js/https|https]]</code> وعلى وجه الخصوص في OpenSSL. | ||
===خيارات OpenSSL=== | ===خيارات OpenSSL=== | ||
الثابت الوصف SSL_OP_ALL يطبِّق حلول متعددة لخطأ ضمن OpenSSL. للمزيد من التفاصيل، ألقِ نظرة على هذا التوثيق. SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION يسمح بإعادة عملية التفاوض الإرثية غير الآمنة (legacy insecure renegotiation) بين OpenSSL والعملاء أو الخوادم غير المحمية. SSL_OP_CIPHER_SERVER_PREFERENCE يحاول استعمال أولويات الخادم بدلًا من العميل عند تحديد عملية التشفير. للمزيد من التفاصيل، ألقِ نظرة على هذا التوثيق SSL_OP_CISCO_ANYCONNECT يوجه OpenSSL لاستعمال الإصدار «speshul» من DTLS_BAD_VER من Cisco. SSL_OP_COOKIE_EXCHANGE يوجه OpenSSL لتشغيل عملية تبادل الكعكات (cookie exchange). 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_EPHEMERAL_RSA يوجه OpenSSL لاستعمال المفتاح tmp_rsa دومًا عند تنفيذ العملية RSA. SSL_OP_LEGACY_SERVER_CONNECT يسمح باتصال مبدئي مع الخوادم التي لا تدعم RI. SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER | {| class="wikitable" | ||
!الثابت | |||
SSL_OP_MICROSOFT_SESS_ID_BUG | !الوصف | ||
|- | |||
SSL_OP_MSIE_SSLV2_RSA_PADDING يوجه OpenSSL لتعطيل الحل البديل لثغرة بروتوكول الوسيط (man-in-the-middle protocol-version vulnerability) في تنفيذ الخادم SSL 2.0. SSL_OP_NETSCAPE_CA_DN_BUG | |<code>SSL_OP_ALL</code> | ||
|يطبِّق حلول متعددة لخطأ ضمن OpenSSL. للمزيد من التفاصيل، ألقِ نظرة على [https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_options.html هذا] التوثيق. | |||
SSL_OP_NETSCAPE_CHALLENGE_BUG | |- | ||
|<code>SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION</code> | |||
SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG | |يسمح بإعادة عملية التفاوض الإرثية غير الآمنة (legacy insecure renegotiation) بين OpenSSL والعملاء أو الخوادم غير المحمية. | ||
|- | |||
SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG | |<code>SSL_OP_CIPHER_SERVER_PREFERENCE</code> | ||
|يحاول استعمال أولويات الخادم بدلًا من العميل عند تحديد عملية التشفير. للمزيد من التفاصيل، ألقِ نظرة على [https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_options.html هذا] التوثيق | |||
SSL_OP_NO_COMPRESSION يوجه OpenSSL لتعطيل دعم ضغط SSL/TLS. SSL_OP_NO_SSLv2 | |- | ||
|<code>SSL_OP_CISCO_ANYCONNECT</code> | |||
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 لتعطيل استعمال بطاقات ( tickets) 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_PKCS1_CHECK_1 | |يوجه OpenSSL لاستعمال الإصدار «speshul» من DTLS_BAD_VER من Cisco. | ||
|- | |||
SSL_OP_PKCS1_CHECK_2 | |<code>SSL_OP_COOKIE_EXCHANGE</code> | ||
|يوجه OpenSSL لتشغيل عملية تبادل الكعكات (cookie exchange). | |||
SSL_OP_SINGLE_DH_USE يوجه OpenSSL لإنشاء مفتاح جديد دومًا عند استعمال المعاملات DH المؤقتة أو سريعة الزوال (temporary/ephemeral). SSL_OP_SINGLE_ECDH_USE | |- | ||
|<code>SSL_OP_CRYPTOPRO_TLSEXT_BUG</code> | |||
يوجه OpenSSL لإنشاء مفتاح جديد دومًا عند استعمال المعاملات ECDH المؤقتة أو سريعة الزوال (temporary/ephemeral). SSL_OP_SSLEAY_080_CLIENT_DH_BUG | |يوجه OpenSSL لإضافة العملية server-hello من إصدار قديم للمسودة cryptopro. | ||
|- | |||
SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG | |<code>SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS</code> | ||
|يوجه OpenSSL لتعطيل الحل البديل للثغرة SSL 3.0/TLS 1.0 الذي أضيف في الإصدار OpenSSL 0.9.6d. | |||
SSL_OP_TLS_BLOCK_PADDING_BUG | |- | ||
|<code>SSL_OP_EPHEMERAL_RSA</code> | |||
SSL_OP_TLS_D5_BUG | |يوجه OpenSSL لاستعمال المفتاح tmp_rsa دومًا عند تنفيذ العملية RSA. | ||
|- | |||
|<code>SSL_OP_LEGACY_SERVER_CONNECT</code> | |||
|يسمح باتصال مبدئي مع الخوادم التي لا تدعم RI. | |||
|- | |||
|<code>SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER</code> | |||
| | |||
|- | |||
|<code>SSL_OP_MICROSOFT_SESS_ID_BUG</code> | |||
| | |||
|- | |||
|<code>SSL_OP_MSIE_SSLV2_RSA_PADDING</code> | |||
|يوجه OpenSSL لتعطيل الحل البديل لثغرة بروتوكول الوسيط (man-in-the-middle protocol-version vulnerability) في تنفيذ الخادم SSL 2.0. | |||
|- | |||
|<code>SSL_OP_NETSCAPE_CA_DN_BUG</code> | |||
| | |||
|- | |||
|<code>SSL_OP_NETSCAPE_CHALLENGE_BUG</code> | |||
| | |||
|- | |||
|<code>SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG</code> | |||
| | |||
|- | |||
|<code>SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG</code> | |||
| | |||
|- | |||
|<code>SSL_OP_NO_COMPRESSION</code> | |||
|يوجه OpenSSL لتعطيل دعم ضغط SSL/TLS. | |||
|- | |||
|<code>SSL_OP_NO_SSLv2</code> | |||
| | |||
|- | |||
|<code>SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION</code> | |||
|يوجه OpenSSL لبدء جلسة جديدة دومًا عند تنفيذ عملية إعادة التفاوض. | |||
|- | |||
|<code>SSL_OP_NO_SSLv2</code> | |||
|يوجه OpenSSL لإيقاف SSL v2. | |||
|- | |||
|<code>SSL_OP_NO_SSLv3</code> | |||
|يوجه OpenSSL لإيقاف SSL v3. | |||
|- | |||
|<code>SSL_OP_NO_TICKET</code> | |||
|يوجه OpenSSL لتعطيل استعمال بطاقات ( tickets) RFC4507bis. | |||
|- | |||
|<code>SSL_OP_NO_TLSv1</code> | |||
|يوجه OpenSSL لإيقاف TLS v1. | |||
|- | |||
|<code>SSL_OP_NO_TLSv1_1</code> | |||
|يوجه OpenSSL لإيقاف TLS v1.1. | |||
|- | |||
|<code>SSL_OP_NO_TLSv1_2</code> | |||
|يوجه OpenSSL لإيقاف TLS v1.2. | |||
|- | |||
|<code>SSL_OP_PKCS1_CHECK_1</code> | |||
| | |||
|- | |||
|<code>SSL_OP_PKCS1_CHECK_2</code> | |||
| | |||
|- | |||
|<code>SSL_OP_SINGLE_DH_USE</code> | |||
|يوجه OpenSSL لإنشاء مفتاح جديد دومًا عند استعمال المعاملات DH المؤقتة أو سريعة الزوال (temporary/ephemeral). | |||
|- | |||
|<code>SSL_OP_SINGLE_ECDH_USE</code> | |||
|يوجه OpenSSL لإنشاء مفتاح جديد دومًا عند استعمال المعاملات ECDH المؤقتة أو سريعة الزوال (temporary/ephemeral). | |||
|- | |||
|<code>SSL_OP_SSLEAY_080_CLIENT_DH_BUG</code> | |||
| | |||
|- | |||
|<code>SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG</code> | |||
| | |||
|- | |||
|<code>SSL_OP_TLS_BLOCK_PADDING_BUG</code> | |||
| | |||
|- | |||
|<code>SSL_OP_TLS_D5_BUG</code> | |||
| | |||
|- | |||
|<code>SSL_OP_TLS_ROLLBACK_BUG</code> | |||
|يوجه OpenSSL لتعطيل اكتشاف هجوم استعادة الإصدار السابق (version rollback attack). | |||
|} | |||
===ثوابت محرك 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_METHDS. ENGINE_METHOD_PKEY_ASN1_METHS يقيد استعمال المحرك إلى PKEY_ASN1_METHS. ENGINE_METHOD_ALL | {| class="wikitable" | ||
!الثابت | |||
!الوصف | |||
|- | |||
|<code>ENGINE_METHOD_RSA</code> | |||
|يقيد استعمال المحرك إلى RSA. | |||
|- | |||
|<code>ENGINE_METHOD_DSA</code> | |||
|يقيد استعمال المحرك إلى DSA. | |||
|- | |||
|<code>ENGINE_METHOD_DH</code> | |||
|يقيد استعمال المحرك إلى DH. | |||
|- | |||
|<code>ENGINE_METHOD_RAND</code> | |||
|يقيد استعمال المحرك إلى RAND. | |||
|- | |||
|<code>ENGINE_METHOD_EC</code> | |||
|يقيد استعمال المحرك إلى EC. | |||
|- | |||
|<code>ENGINE_METHOD_CIPHERS</code> | |||
|يقيد استعمال المحرك إلى CIPHERS. | |||
|- | |||
|<code>ENGINE_METHOD_DIGESTS</code> | |||
|يقيد استعمال المحرك إلى DIGESTS. | |||
|- | |||
|<code>ENGINE_METHOD_PKEY_METHS</code> | |||
|يقيد استعمال المحرك إلى PKEY_METHDS. | |||
|- | |||
|<code>ENGINE_METHOD_PKEY_ASN1_METHS</code> | |||
|يقيد استعمال المحرك إلى PKEY_ASN1_METHS. | |||
|- | |||
|<code>ENGINE_METHOD_ALL</code> | |||
| | |||
|- | |||
|<code>ENGINE_METHOD_NONE</code> | |||
| | |||
|} | |||
===ثوابت OpenSSL أخرى=== | |||
{| class="wikitable" | |||
=== | !الثابت | ||
الثابت الوصف DH_CHECK_P_NOT_SAFE_PRIME | !الوصف | ||
|- | |||
DH_CHECK_P_NOT_PRIME | |<code>DH_CHECK_P_NOT_SAFE_PRIME</code> | ||
| | |||
DH_UNABLE_TO_CHECK_GENERATOR | |- | ||
|<code>DH_CHECK_P_NOT_PRIME</code> | |||
DH_NOT_SUITABLE_GENERATOR | | | ||
|- | |||
ALPN_ENABLED | |<code>DH_UNABLE_TO_CHECK_GENERATOR</code> | ||
| | |||
RSA_PKCS1_PADDING | |- | ||
|<code>DH_NOT_SUITABLE_GENERATOR</code> | |||
RSA_SSLV23_PADDING | | | ||
|- | |||
RSA_NO_PADDING | |<code>ALPN_ENABLED</code> | ||
| | |||
RSA_PKCS1_OAEP_PADDING | |- | ||
|<code>RSA_PKCS1_PADDING</code> | |||
RSA_X931_PADDING | | | ||
|- | |||
RSA_PKCS1_PSS_PADDING | |<code>RSA_SSLV23_PADDING</code> | ||
| | |||
RSA_PSS_SALTLEN_DIGEST يضبط الطول الإضافي (salt) الذي يخص RSA_PKCS1_PSS_PADDING إلى حجم قيمة hash عند التوقيع أو التحقق. RSA_PSS_SALTLEN_MAX_SIGN يضبط الطول الإضافي (salt) الذي يخص RSA_PKCS1_PSS_PADDING إلى أكبر قيمة مسموحة عند التوقيع أو التحقق. RSA_PSS_SALTLEN_AUTO تعمل على جعل الطول الإضافي الذي يخص RSA_PKCS1_PSS_PADDING يحدد تلقائيًّا عند التوقيع أو التحقق. POINT_CONVERSION_COMPRESSED | |- | ||
|<code>RSA_NO_PADDING</code> | |||
POINT_CONVERSION_UNCOMPRESSED | | | ||
|- | |||
POINT_CONVERSION_HYBRID | |<code>RSA_PKCS1_OAEP_PADDING</code> | ||
| | |||
|- | |||
|<code>RSA_X931_PADDING</code> | |||
| | |||
|- | |||
|<code>RSA_PKCS1_PSS_PADDING</code> | |||
| | |||
|- | |||
|<code>RSA_PSS_SALTLEN_DIGEST</code> | |||
|يضبط الطول الإضافي (salt) الذي يخص <code>RSA_PKCS1_PSS_PADDING</code> إلى حجم قيمة hash عند التوقيع أو التحقق. | |||
|- | |||
|<code>RSA_PSS_SALTLEN_MAX_SIGN</code> | |||
|يضبط الطول الإضافي (salt) الذي يخص <code>RSA_PKCS1_PSS_PADDING</code> إلى أكبر قيمة مسموحة عند التوقيع أو التحقق. | |||
|- | |||
|<code>RSA_PSS_SALTLEN_AUTO</code> | |||
|تعمل على جعل الطول الإضافي الذي يخص <code>RSA_PKCS1_PSS_PADDING</code> يحدد تلقائيًّا عند التوقيع أو التحقق. | |||
|- | |||
|<code>POINT_CONVERSION_COMPRESSED</code> | |||
| | |||
|- | |||
|<code>POINT_CONVERSION_UNCOMPRESSED</code> | |||
| | |||
|- | |||
|<code>POINT_CONVERSION_HYBRID</code> | |||
| | |||
|} | |||
===ثوابت الوحدة crypto في Node.js=== | ===ثوابت الوحدة crypto في Node.js=== | ||
الثابت الوصف defaultCoreCipherList يحدد قائمة التشفير الافتراضية الضمنيَّة التي تستعملها Node.js. defaultCipherList تحدد قائمة التشفيرالافتراضية الفعالة التي تستعملها عملية Node.js الحالية. | {| class="wikitable" | ||
!الثابت | |||
!الوصف | |||
|- | |||
|<code>defaultCoreCipherList</code> | |||
|يحدد قائمة التشفير الافتراضية الضمنيَّة التي تستعملها Node.js. | |||
|- | |||
|<code>defaultCipherList</code> | |||
|تحدد قائمة التشفيرالافتراضية الفعالة التي تستعملها عملية Node.js الحالية. | |||
|} | |||
== مصادر == | ==مصادر== | ||
*[https://nodejs.org/dist/latest-v10.x/docs/api/crypto.html صفحة Crypto في توثيق Node.js الرسمي.] | *[https://nodejs.org/dist/latest-v10.x/docs/api/crypto.html صفحة Crypto في توثيق Node.js الرسمي.] | ||
[[تصنيف:Node.js|{{SUBPAGENAME}}]] |
المراجعة الحالية بتاريخ 11:17، 23 أكتوبر 2018
الاستقرار: 2-مستقر
توفِّر الوحدة crypto
وظيفة التشفير (cryptographic functionality) التي تتضمن مجموعةً من المغلفات (wrappers) التي تُستعمَل من أجل دوال شيفرة Hash في OpenSSL، والتشفير HMAC، والتشفير (cipher)، وفك التشفير (decipher)، والتوقيع (sign)، والتحقق (verify).
استعمل الأمر require('crypto')
للوصول إلى هذه الوحدة.
const crypto = require('crypto');
const secret = 'abcdefg';
const hash = crypto.createHmac('sha256', secret)
.update('I love cupcakes')
.digest('hex');
console.log(hash);
// Prints:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
التحقق من توافر دعم للوحدة crypto
يُحتمَل في بعض الأحيان أن تُبنَى Node.js دون أن تحوي دعمًا للوحدة crypto
. في بعض الحالات، سيؤدي استدعاء الأمر require('crypto')
إلى رمي خطأٍ.
let crypto;
try {
crypto = require('crypto');
} catch (err) {
console.log('crypto support is disabled!');
}
الصنف Certificate
أضيف في الإصدار: v0.11.8.
إنَّ الصيغة SPKAC (اختصارٌ للعبارة Signed Public Key and Challenge، وتعرف أيضًا بالاسم Netscape SPKI) هي آلية لطلب توقيع الشهادة (Certificate Signing Request) نُفِّذت بدايةً من قبل المتصفح Netscape ثم حُدِّدَت رسميًا على أنَّها جزء من العنصر <keygen>
في HTML5.
انتبه إلى أنَّ العنصر <keygen>
قد أهمل بدءًا من الإصدار HTML 5.2، لذا لا يجب على المشاريع الجديدة أن تستعمله بعد الآن.
توفر الوحدة crypto
الصنف Certificate
للعمل مع بيانات SPKAC. أشهر استعمال لها هو معالجة المخرجات المُولَّدة باستعمال العنصر <keygen>
في HTML5. تعمل Node.js على تنفيذ SPKAC في OpenSSL داخليًّا.
Certificate.exportChallenge(spkac)
أضيف في الإصدار: v9.0.0.
spkac
: <string> | <Buffer> | <TypedArray> | <DataView>- القيم المعادة: <Buffer> مكوِّن تحدي المصادقة (challenge، ويدعى أحيانًا challenge–response authentication) لهيكلية بيانات
spkac
التي تتضمن مفتاحًا عامًا (public key) وتحدِّيًا للمصادقة.
const { Certificate } = require('crypto');
const spkac = getSpkacSomehow();
const challenge = Certificate.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// UTF8 سيُطبَع تحدِّي المصادقة كسلسلة نصية بترميز
Certificate.exportPublicKey(spkac[, encoding])
أضيف في الإصدار: v9.0.0.
spkac
: <string> | <Buffer> | <TypedArray> | <DataView>- القيم المعادة: <Buffer> مكون المفتاح العام لهيكلية بيانات
spkac
التي تتضمن مفتاحًا عامًا (public key) وتحدِّيًا للمصادقة (challenge، ويدعى أيضًا challenge–response authentication). encoding
: <string>
const { Certificate } = require('crypto');
const spkac = getSpkacSomehow();
const publicKey = Certificate.exportPublicKey(spkac);
console.log(publicKey);
// <Buffer ...> سيُطبَع المفتاح العام كأنه
Certificate.verifySpkac(spkac)
أضيف في الإصدار: v9.0.0.
spkac
: <Buffer> | <TypedArray> | <DataView>- القيم المعادة: <boolean> القيمة
true
إن كانت هيكلية بياناتspkac
صالحة، أو القيمةfalse
خلاف ذلك.
const { Certificate } = require('crypto');
const spkac = getSpkacSomehow();
console.log(Certificate.verifySpkac(Buffer.from(spkac)));
// false أو true ستُطبع القيمة
الواجهات البرمجية الإرثية (Legacy API)
لمَّا كانت الواجهات الإرثية (legacy interface) مدعومةً إلى الآن، فيمكن إنشاء نسخ جديدة من الصنف crypto.Certificate
كما هو موضح في الأمثلة اللاحقة.
new crypto.Certificate()
يمكن إنشاء نسخ من الصنف Certificate
باستعمال الكلمة المفتاحية new
أو عبر استدعاء العبارة crypto.Certificate()
كدالة:
const crypto = require('crypto');
const cert1 = new crypto.Certificate();
const cert2 = crypto.Certificate();
certificate.exportChallenge(spkac)
أضيف في الإصدار: v0.11.8.
spkac
: <string> | <Buffer> | <TypedArray> | <DataView>- القيم المعادة: <Buffer> مكوِّن تحدي المصادقة (challenge، أو يدعى أيضًا challenge–response authentication) لهيكلية بيانات spkac التي تتضمن مفتاحًا عامًا (public key) وتحدِّيًا للمصادقة.
const cert = require('crypto').Certificate();
const spkac = getSpkacSomehow();
const challenge = cert.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// UTF8 سيُطبَع تحدِّي المصادقة كسلسلة نصية بترميز
certificate.exportPublicKey(spkac)
أضيف في الإصدار: v0.11.8.
- spkac: <string> | <Buffer> | <TypedArray> | <DataView>
- القيم المعادة: <Buffer> مكون المفتاح العام لهيكلية بيانات
spkac
التي تتضمن مفتاحًا عامًا (public key) وتحدِّيًا للمصادقة (challenge، أو يدعى أيضًا challenge–response authentication). encoding
: <string>
const cert = require('crypto').Certificate();
const spkac = getSpkacSomehow();
const publicKey = cert.exportPublicKey(spkac);
console.log(publicKey);
// <Buffer ...> سيُطبَع المفتاح العام كأنه
certificate.verifySpkac(spkac)
أضيف في الإصدار: v0.11.8.
spkac
: <Buffer> | <TypedArray> | <DataView>- القيم المعادة: <boolean> القيمة
true
إن كانت هيكلية بياناتspkac
صالحة، أو القيمةfalse
خلاف ذلك.
const cert = require('crypto').Certificate();
const spkac = getSpkacSomehow();
console.log(cert.verifySpkac(Buffer.from(spkac)));
// false أو true ستُطبع القيمة
الصنف Cipher
أضيف في الإصدار: v0.1.94.
تُستعمَل نسخ الصنف Cipher
في تشفير البيانات. يمكن استعمال هذا الصنف بإحدى الطريقتين التاليتين:
- يُستعمَل كمجرًى قابلًا للقراءة والكتابة، إذ تكتب فيه البيانات الصرفة غير المشفرة بعد لتوليد البيانات المشفرة المقابلة لها في الجانب القابل للقراءة من هذا المجرى، أو
- يُستعمَل التابعان
cipher.update()
وcipher.final()
لتوليد البيانات المشفرة.
يُستعمَل التابعان crypto.createCipher()
أو crypto.createCipheriv()
لإنشاء نسخٍ من الصنف Cipher
. لا يجب إنشاء الكائنات Cipher
باستعمال الكلمة المفتاحية new
مباشرةً.
يوضِّح المثال التالي كيفية استعمال الكائنات Cipher
كمجرى:
const crypto = require('crypto');
const cipher = crypto.createCipher('aes192', 'a password');
let encrypted = '';
cipher.on('readable', () => {
const data = cipher.read();
if (data)
encrypted += data.toString('hex');
});
cipher.on('end', () => {
console.log(encrypted);
// ca981be48e90867604588e75d04feabb63cc007a8f8ad89b10616ed84d815504 :سيُطبَع
});
cipher.write('some clear text data');
cipher.end();
ويوضح المثال التالي كيفية استعمال الصنف Cipher
مع نقل محتويات المجاري (piped streams):
const crypto = require('crypto');
const fs = require('fs');
const cipher = crypto.createCipher('aes192', 'a password');
const input = fs.createReadStream('test.js');
const output = fs.createWriteStream('test.enc');
input.pipe(cipher).pipe(output);
أمَّا المثال التالي، فيوضِّح كيفية استعمال التابعين cipher.update()
و cipher.final()
:
const crypto = require('crypto');
const cipher = crypto.createCipher('aes192', 'a password');
let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
encrypted += cipher.final('hex');
console.log(encrypted);
// Prints: ca981be48e90867604588e75d04feabb63cc007a8f8ad89b10616ed84d815504
cipher.final([outputEncoding])
أضيف في الإصدار: v0.1.94.
outputEncoding
: <string>- القيم المعادة: <Buffer> | <string> أيَّةُ محتويات مشفرة متبقية. إن كانت قيمة المعامل
outputEncoding
إحدى القيم التالية:'latin1'
، أو'base64'
، أو'hex'
، فستُعاد سلسلة نصية. أمَّا إن لم يُعطَ المعاملoutputEncoding
، فسيُعاد كائن من النوعBuffer
.
لن يعد بالإمكان استعمال الكائن Cipher لتشفير البيانات متى ما استدعي التابع cipher.final. أية محاولة لاستدعاء التابع cipher.final() أكثر من مرة سينتج عنها رمي خطأٍ.
cipher.setAAD(buffer[, options])
أضيف في الإصدار: v1.0.0.
buffer
: <Buffer>options
: <Object> خيارات التابعstream.transform
.plaintextLength
: <number>
- القيم المعادة: <Cipher> كائن من النوع
Cipher
من أجل تقييد التابع (method chaining).
عند استعمال وضع التشفير الموثوق (authenticated encryption) -مثل GCM أو CCM أو OCB المدعومة حاليًا-، تضبط الدالة cipher.setAAD()
القيمة المستعملة للبيانات الموثوقة الإضافية (AAD، اختصارٌ للعبارة additional authenticated data) في معامل الإدخال.
المعامل options
هو اختياري من أجل الوضع GCM والوضع OCB. عند استعمال الوضع CCM، يجب أن يُحدَّد الخيار plaintextLength
وأن تُطابِق قيمته طول النص المجرَّد (plaintext) بواحدة البايت. ارجع إلى «الوضع CCM» في الأسفل للمزيد من المعلومات.
يجب أن يُستدعَى التابع cipher.setAAD()
قبل استدعاء التابع cipher.update()
.
cipher.getAuthTag()
أضيف في الإصدار: v1.0.0.
- القيم المعادة: <Buffer> عند استعمال وضع التشفير الموثوق (GCM، و CCM، و OCB هي الأوضاع المدعومة حاليًا)، يعيد التابع
cipher.getAuthTag()
كائنًا من النوعBuffer
يحوي بطاقة المصادقة (authentication tag) التي حُسبَت من البيانات المعطاة.
يجب استدعاء التابع cipher.getAuthTag()
بعد اكتمال عملية التشفير باستعمال التابع cipher.final()
فقط.
cipher.setAutoPadding([autoPadding])
أضيف في الإصدار: v0.7.1.
autoPadding
: <boolean>قيمة منطقية. القيمة الافتراضية هي:true
.- القيم المعادة: <Cipher> كائن من النوع
Cipher
من أجل تقييد التابع (method chaining).
عند استعمال خوارزميات التشفير الكتلية (block encryption algorithms)، سيضيف الصنف Cipher
حاشية (padding) إلى البيانات المدخلة تلقائيًا لتتلاءم مع حجم الكتلة. لتعطيل هذا السلوك الافتراضي، استدعِ التابع بالشكل cipher.setAutoPadding(false)
.
عندما تعطى القيمة false
إلى المعامل autoPadding
، يجب أن يكون طول البيانات المدخلة بأكملها من مضاعفات حجم كتلة الشيفرة وإلا سيرمي التابع cipher.final()
خطأً. تعطيل إضافة الحاشية تلقائيًّا مفيدٌ للحاشية غير القياسية (non-standard padding) مثل استعمال الحشوة 0x0
عوضًا عن PKCS
.
يجب استدعاء التابع cipher.setAutoPadding()
قبل التابع cipher.final()
.
cipher.update(data[, inputEncoding][, outputEncoding])
الإصدار | التغييرات |
---|---|
v6.0.0 | القيمة الافتراضية للمعامل inputEncoding تغيرت من binary إلى utf8 .
|
v0.1.94 | أضيف هذا التابع. |
data
: <string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
: <string>outputEncoding
: <string>- القيم المعادة: <Buffer> |<string>
يعمل هذا التابع على تحديث عملية التشفير مع القيمة data
. إن أعطي الوسيط inputEncoding
، فيجب أن تكون قيمته 'utf8'
، أو 'ascii'
، أو 'latin1'
وأن يكون الوسيط data
سلسلةً نصيةً مرمزةً بهذا الترميز المحدد. إن لم يُعطَ الوسيط inputEncoding
، فيجب أن يكون المعامل data
كائنًا من النوع Buffer
أو TypedArray
أو DataView
. من جهة أخرى، إن كان الوسيط data
كائنًا من النوع Buffer
أو TypedArray
أو DataView
، فسيُتجاهَل المعامل inputEncoding
حينها.
يحدِّد الوسيط outputEncoding
ترميز مخرجات البيانات المشفرة، والتي يمكن أن تكون 'latin1'
، أو 'base64'
، أو 'hex'
. إن حُدِّد الوسيط outputEncoding
، فستُعاد سلسلةٌ نصيةٌ مرمزةٌ بذلك الترميز المحدد. أما إن لم يُعطَ الوسيط outputEncoding
، فسيُعاد كائن من النوع Buffer
.
يمكن استدعاء التابع cipher.update()
عدة مرات مع البيانات الجديدة إلى أن يُستدعَى التابع cipher.final()
. سيؤدي استدعاء التابع cipher.update()
بعد التابع cipher.final()
إلى رمي خطأٍ.
الصنف Decipher
أضيف في الإصدار: v0.1.94. تُستعمَل النسخ المنشأة من الصنف Decipher
في فك تشفير البيانات. يمكن استعمال هذا الصنف في بإحدى الطريقتين التاليتين:
- يُستعمَل كمجرًى قابلًا للقراءة والكتابة، إذ تكتب فيه البيانات الصرفة المشفرة للتوليد البيانات غير المشفرة المقابلة لها في الجانب القابل للقراءة من هذا المجرى، أو
- يُستعمَل التابعان
cipher.update()
وcipher.final()
لتوليد البيانات غير المشفرة.
يُستعمَل التابعان crypto.createDecipher()
أو crypto.createDecipheriv()
لإنشاء نسخٍ من الصنف Decipher
. لا يجب إنشاء الكائنات Decipher
مباشرةً باستعمال الكلمة المفتاحية new
.
يوضح المثال التالي كيفية استعمال الكائنات Decipher
كمجاري:
const crypto = require('crypto');
const decipher = crypto.createDecipher('aes192', 'a password');
let decrypted = '';
decipher.on('readable', () => {
const data = decipher.read();
if (data)
decrypted += data.toString('utf8');
});
decipher.on('end', () => {
console.log(decrypted);
/ستُطبَع بعض البيانات النصية المفهومة
});
const encrypted =
'ca981be48e90867604588e75d04feabb63cc007a8f8ad89b10616ed84d815504';
decipher.write(encrypted, 'hex');
decipher.end();
ويوضح المثال التالي كيفية استعمال الصنف decipher
مع نقل محتويات المجاري (piped streams):
const crypto = require('crypto');
const fs = require('fs');
const decipher = crypto.createDecipher('aes192', 'a password');
const input = fs.createReadStream('test.enc');
const output = fs.createWriteStream('test.js');
input.pipe(decipher).pipe(output);
أما المثال التالي، يوضح كيفية استعمال التابعين cipher.update()
و cipher.final()
:
const crypto = require('crypto');
const decipher = crypto.createDecipher('aes192', 'a password');
const encrypted =
'ca981be48e90867604588e75d04feabb63cc007a8f8ad89b10616ed84d815504';
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);
// ستُطبَع بعض البيانات النصية المفهومة
decipher.final([outputEncoding])
أضيف في الإصدار: v0.1.94.
outputEncoding
: <string>- القيم المعادة: <Buffer> | <string> أية محتويات غير مشفرة متبقية. إن كانت قيمة المعامل
outputEncoding
إحدى القيم التالية:'latin1'
، أو'ascii'
، أو'utf8'
، فستُعاد سلسلة نصية. أمَّا إن لم يُعطَ المعاملoutputEncoding
، فسيعاد كائن من النوعBuffer
.
لن يعد بالإمكان استعمال الكائن Decipher لفك تشفير البيانات متى ما استدعي التابع decipher.final()
. أية محاولة لاستدعاء التابع cipher.final()
أكثر من مرة سينتج عنها رمي خطأٍ.
decipher.setAAD(buffer[, options])
الإصدار | التغييرات |
---|---|
v7.2.0 | أصبح هذا التابع الآن يعيد مرجعًا إلى decipher .
|
v1.0.0 | أضيف هذا التابع. |
buffer
: <Buffer> | <TypedArray> | <DataView>options
: <Object> خيارات التابعstream.transform
.plaintextLength
: <number>
القيم المعادة: <Decipher>
الكائن Decipher
من أجل تقييد التابع (method chaining).
عند استعمال وضع التشفير الموثوق (authenticated encryption mode) -مثل GCM أو CCM أو OCB المدعومة حاليًا-، يضبط التابع decipher.setAAD()
القيمة المستعملة للبيانات الموثوقة الإضافية (AAD، اختصارٌ للعبارة additional authenticated data) في معامل الإدخال.
الوسيط options
هو اختياري من أجل الوضع GCM. عند استعمال الوضع CCM، يجب أن يُحدَّد الخيار plaintextLength
وأن تُطابِق قيمته طول النص المجرَّد (plaintext) بواحدة البايت. ارجع إلى الوضع CCM في الأسفل للمزيد من المعلومات.
يجب أن يستدعى التابع decipher.setAAD()
قبل استدعاء التابع decipher.update()
.
decipher.setAuthTag(buffer)
الإصدار | التغييرات |
---|---|
v7.2.0 | أصبح هذا التابع الآن يعيد مرجعًا إلى decipher. |
v1.0.0 | أضيف هذا التابع. |
buffer
: <Buffer> | <TypedArray> | <DataView>- القيم المعادة: <Decipher> الكائن
Decipher
من أجل تقييد التابع (method chaining).
عند استعمال وضع التشفير الموثوق (authenticated encryption mode) -مثل GCM أو CCM أو OCB المدعومة حاليًا-، تُستعمَل الدالة decipher.setAuthTag() لتمرير بطاقة المصادقة (authentication tag) المُستلمَة. إن لم تُعطَ أية بطاقة أو تم العبث بالنص المشفر، فسيرمي التابع decipher.final()
خطأً يشير إلى أنَّ النص المشفر يجب إهماله بسبب فشل المصادقة. انتبه إلى أنَّ إصدار Node.js هذا لا يتحقق من طول بطاقات المصادقة في الوضع GCM. يجب تنفيذ مثل هذا التحقق باستعمال تطبيقات أخرى لأهميته الكبيرة في موثوقية البيانات المشفَّرة، وإلا سيتمكن أي مهاجم من استعمال أية بطاقة مصادقة قصيرة اعتباطية لزيادة فرصة اجتياز المصادقة بنجاح (بنسبة تصل إلى 0.39%). يوصى بشدة قرن إحدى القيم 16، أو 15، أو 14، أو 13، أو 12، أو 8، أو 4 بايت مع كل مفتاح للمصادقة على البطاقات التي لها نفس الطول المحدد فقط. انظر أيضًا NIST SP 800-38D. يجب استدعاء التابع decipher.setAuthTag() قبل التابع decipher.final()
.
decipher.setAutoPadding([autoPadding])
أضيف في الإصدار: v0.7.1.
autoPadding
: <boolean> قيمة منطقية. القيمة الافتراضية هي: true.- القيم المعادة: <Decipher> الكائن
Decipher
من أجل تقييد التابع (method chaining).
إن كانت البيانات قد شُفِّرت دون استعمال حاشية كتلية قياسية (standard block padding)، فإنَّ استدعاء هذا التابع بالشكل decipher.setAutoPadding(false)
سيُعطِّل إضافة الحاشية تلقائيًّا لمنع التابع decipher.final()
من التحقق من وجود الحاشية وإزالتها. تعطيل إضافة الحاشية تلقائيًّا فعَّالٌ فقط في حال كان طول البيانات المدخلة من مضاعفات حجم كتلة الشيفرات. يجب استدعاء التابع decipher.setAutoPadding()
قبل التابع decipher.final()
.
decipher.update(data[, inputEncoding][, outputEncoding])
الإصدار | التغييرات |
---|---|
v6.0.0 | القيمة الافتراضية للمعامل inputEncoding تغيرت من binary إلى utf8 .
|
v0.1.94 | أضيف هذا التابع. |
data
: <string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
: <string>outputEncoding
: <string>- القيم المعادة: <Buffer> | <string>
يعمل هذا التابع على تحديث عملية فك التشفير مع القيمة data. إن أعطي الوسيط inputEncoding
، فيجب أن تكون قيمته هي: 'latin1'
، أو 'latin1'
، أو 'hex'
وأن يكون الوسيط data
سلسلةً نصيةً مرمزةً بهذا الترميز المحدد. إن لم يُعطَ الوسيط inputEncoding
، فيجب أن يكون المعامل data
كائنًا من النوع Buffer
. من جهة أخرى، إن كان الوسيط data
كائنًا من النوع Buffer
، فسيُتجاهَل المعامل inputEncoding
حينها.
يحدد الوسيط outputEncoding
ترميز مخرجات البيانات غير المشفرة، والتي يمكن أن تكون 'latin1'
، أو 'ascii'
، أو 'utf8'
. إن حُدِّد الوسيط outputEncoding
، فستُعاد سلسلةٌ نصيةٌ مرمزةٌ بالترميز المحدد. أما إن لم يُعطَ الوسيط outputEncoding
، فسيُعاد كائن من النوع Buffer
.
يمكن استدعاء التابع decipher.update()
عدة مرات مع البيانات الجديدة حتى يستدعى التابع decipher.final()
. سيؤدي استدعاء التابع decipher.update()
بعد التابع cipher.final()
إلى رمي خطأٍ.
الصنف DiffieHellman
أضيف في الإصدار: v0.5.0.
الصنف DiffieHellman
هو أداة لإنشاء تبادلات مفتاح Diffie-Hellman.
يمكن إنشاء نسخٍ من الصنف DiffieHellman
باستعمال الدالة crypto.createDiffieHellman()
.
const crypto = require('crypto');
const assert = require('assert');
// Alice توليد مفاتيح
const alice = crypto.createDiffieHellman(2048);
const aliceKey = alice.generateKeys();
// Bob توليد مفاتيح
const bob = crypto.createDiffieHellman(alice.getPrime(), alice.getGenerator());
const bobKey = bob.generateKeys();
// (Secret) تبادل وتوليد السر
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);
// OK
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));
diffieHellman.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])
أضيف في الإصدار: v0.5.0.
otherPublicKey
: <string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
: <string>outputEncoding
: <string>- القيم المعادة: <Buffer> | <string>
يحسب هذا التابع السر المشترك (shared secret) مستعملًا الوسيط otherPublicKey
على أنَّه المفتاح العام للطرف الآخر ثم يعيده. يُفسَّر المفتاح المعطى باستعمال الترميز inputEncoding
المعطى، ويرمَّز السر بالترميز outputEncoding
المحدد. يمكن استعمال أحد الترميزات 'latin1'
، أو 'hex'
، أو 'base64'
. إن لم يُعطَ الوسيط inputEncoding
، فسيُتوقَّع أن يكون الوسيط otherPublicKey
كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
.
إن أعطي الوسيط outputEncoding
، فستُعاد سلسلة نصية؛ خلا ذلك، سيعاد كائن من النوع Buffer
.
diffieHellman.generateKeys([encoding])
أضيف في الإصدار: v0.5.0.
يولد هذا التابع قيمًا لمفتاح Diffie-Hellman عام أو خاص، ويعيد المفتاح العام مرمزًا بالترميز encoding
المعطى. يجب أن يُنقَل هذا المفتاح إلى الطرف الآخر. يمكن استعمال أحد الترميزات 'latin1'
، أو 'hex'
، أو 'base64'
. إن أعطي الوسيط encoding
، فستُعاد سلسلة نصية؛ خلا ذلك، سيعاد كائن من النوع Buffer
.
diffieHellman.getGenerator([encoding])
أضيف في الإصدار: v0.5.0.
Encoding
: <string>
القيم المعادة: <Buffer> | <string> يعيد هذا التابع مولد Diffie-Hellman مرمزًا بالترميز encoding
المعطى، والذي يمكن أن يكون 'latin1'
، أو 'hex'
، أو 'base64'
. إن أعطي الوسيط encoding
، فستُعاد سلسلة نصية؛ خلا ذلك، سيعاد كائن من النوع Buffer
.
diffieHellman.getPrime([encoding])
أضيف في الإصدار: v0.5.0.
يعيد هذا التابع عدد Diffie-Hellman الأولي (prime) مرمزًا بالترميز encoding
المعطى، والذي يمكن أن يكون 'latin1'
، أو 'hex'
، أو 'base64'
. إن أعطي الوسيط encoding
، فستُعاد سلسلة نصية؛ خلا ذلك، سيعاد كائن من النوع Buffer
.
diffieHellman.getPrivateKey([encoding])
أضيف في الإصدار: v0.5.0.
يعيد هذا التابع مفتاح Diffie-Hellman الخاص (private key) مرمزًا بالترميز encoding
المعطى، والذي يمكن أن يكون 'latin1'
، أو 'hex'
، أو 'base64'
. إن أعطي الوسيط encoding، فستُعاد سلسلة نصية؛ خلا ذلك، سيعاد كائن من النوع Buffer
.
diffieHellman.getPublicKey([encoding])
أضيف في الإصدار: v0.5.0.
يعيد هذا التابع مفتاح Diffie-Hellman العام (public key) مرمزًا بالترميز encoding
المعطى، والذي يمكن أن يكون 'latin1'
، أو 'hex'
، أو 'base64'
. إن أعطي الوسيط encoding
، فستُعاد سلسلة نصية؛ خلا ذلك، سيعاد كائن من النوع Buffer
.
diffieHellman.setPrivateKey(privateKey[, encoding])
أضيف في الإصدار: v0.5.0.
privateKey
: <string> | <Buffer> | <TypedArray> | <DataView>encoding
: <string>
يضبط هذا التابع مفتاح Diffie-Hellman الخاص (private key). إن أعطي الوسيط encoding
وكانت قيمته إمَّا 'latin1'
، أو 'hex'
، أو 'base64'
، فسيُتوقَع أن يكون الوسيط privateKey
سلسلةً نصيةً. أمَّا إن لم يُعطَ الوسيط encoding
، فسيُتوقَّع أن يكون الوسيط privateKey
كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
.
diffieHellman.setPublicKey(publicKey[, encoding])
أضيف في الإصدار: v0.5.0.
publicKey
: <string> | <Buffer> | <TypedArray> | <DataView>encoding
: <string>
يضبط هذا التابع مفتاح Diffie-Hellman العام (publicKey key). إن أعطي الوسيط encoding
وكانت قيمته إمَّا 'latin1'
، أو 'hex'
، أو 'base64'
، فسيُتوقَع أن يكون الوسيط publicKey
سلسلةً نصيةً. أمَّا إن لم يُعطَ الوسيط encoding
، فسيُتوقَّع أن يكون الوسيط publicKey
كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
.
diffieHellman.verifyError
أضيفت في الإصدار: v0.11.12. تمثِّل هذه الخاصية حقلًا مؤلفًا من بت واحد يحتوي على أية تحذيرات و/أو أخطاء ناتجة عن عملية التحقق التي أجريت أثناء تهيئة الكائن DiffieHellman.
القيم الصالحة التي يمكن لهذه الخاصية أن تأخذها هي (كما هو مُعرَّف في الوحدة constants
):
DH_CHECK_P_NOT_SAFE_PRIME
DH_CHECK_P_NOT_PRIME
DH_UNABLE_TO_CHECK_GENERATOR
DH_NOT_SUITABLE_GENERATOR
الصنف ECDH
أضيف في الإصدار: v0.11.14.
الصنف ECDH
هو أداةٌ لإنشاء تبادلات مفتاح ECDH (اختصارٌ للعبارة Elliptic Curve Diffie-Hellman).
يمكن إنشاء نسخٍ من الصنف ECDH باستعمال الدالة crypto.createECDH()
.
const crypto = require('crypto');
const assert = require('assert');
// Alice توليد مفاتيح
const alice = crypto.createECDH('secp521r1');
const aliceKey = alice.generateKeys();
// Bob توليد مفاتيح
const bob = crypto.createECDH('secp521r1');
const bobKey = bob.generateKeys();
// (Secret) توليد وتبادل السر
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));
// OK
ECDH.convertKey(key, curve[, inputEncoding[, outputEncoding[, format]]])
أضيف في الإصدار: v10.0.0.
key
: <string> | <Buffer> | <TypedArray> | <DataView>curve
: <string>inputEncoding
: <string>outputEncoding
: <string>format
: <string> القيمة الافتراضية هي:'uncompressed'
.- القيم المعادة: <Buffer> | <string>
يحول هذا التابع مفتاح EC Diffie-Hellman العام المحدد بالوسيط key
والوسيط curve
إلى الصيغة المحددة في الوسيط format
. يحدِّد الوسيط format
صيغة المفتاح ويمكن أن يكون 'compressed'
، أو 'uncompressed'
، أو 'hybrid'
. يُفسَّر المفتاح المعطى على أنَّه مرمزًا بالترميز inputEncoding
المحدد، ويرمز المفتاح المعاد باستعمال الترميز outputEncoding
المعطى. يمكن استعمال أحد الترميزات 'latin1'
، أو 'hex'
، أو 'base64'
.
يمكن استعمال التابع crypto.getCurves()
للحصول على قائمة بالأسماء المنحنيات (curves) المتاحة. في إصدارات OpenSSL الحديثة، سيُظهِر الأمر openssl ecparam -list_curves
اسم ووصف كل قيم المنحي البيضاوي (elliptic curve) المتاحة.
إن لم يُعطَ الوسيط format
، فستُستعمَل الصيغة 'uncompressed'
الافتراضية.
إن لم يُعطَ الوسيط inputEncoding
، فسيُتوقَّع من الوسيط key
أن يكون كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
.
const { createECDH, ECDH } = require('crypto');
const ecdh = createECDH('secp256k1');
ecdh.generateKeys();
const compressedKey = ecdh.getPublicKey('hex', 'compressed');
const uncompressedKey = ECDH.convertKey(compressedKey,
'secp256k1',
'hex',
'hex',
'uncompressed');
// يجب أن يكون المفتاح المحول والمفتاح العام غير المضغوط متماثلين تمامًا
console.log(uncompressedKey === ecdh.getPublicKey('hex'));
ecdh.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])
الإصدار | التغييرات |
---|---|
v10.0.0 | تغيَّرت صيغة الخطأ لدعمٍ أفضلٍ للخطأ الناتج عن مفتاح عام غير صالح. |
v6.0.0 | تغيرت القيم الافتراضية للوسيط inputEncoding من binary إلى utf8 .
|
v0.11.14 | أضيف هذا التابع. |
otherPublicKey
: <string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
: <string>outputEncoding
: <string>- القيم المعادة: <Buffer> | <string>
يحسب هذا التابع السر المشترك (shared secret) مستعملًا الوسيط otherPublicKey
على أنَّه المفتاح العام للطرف الآخر ثم يعيده. يُفسَّر المفتاح المعطى باستعمال الترميز inputEncoding
المعطى، ويرمَّز السر المعاد بالترميز outputEncoding
المحدد. يمكن استعمال أحد الترميزات 'latin1'
، أو 'hex'
، أو 'base64'
. إن لم يُعطَ الوسيط inputEncoding
، فسيُتوقَّع أن يكون الوسيط otherPublicKey
كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
.
إن أعطي الوسيط outputEncoding
، فستُعاد سلسلة نصية؛ خلا ذلك، سيعاد كائن من النوع Buffer
.
سيرمي التابع ecdh.computeSecret()
الخطأ ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY
عندما يقع أو يخرج خارج المنحني البيضاوي (elliptic curve). لمَّا كان الوسيط otherPublicKey
يُزوَّد عادةً من مستخدمٍ بعيدٍ عبر شبكة غير آمنة، فيُنصح بشدة أن يعالج المطورون هذا الاستثناء بما يتوافق مع ذلك.
ecdh.generateKeys([encoding[, format]])
أضيف في الإصدار: v0.11.14.
encoding
: <string>format
: <string> القيمة الافتراضية هي:'uncompressed'
.- القيم المعادة: <Buffer> | <string>
يولد هذا التابع قيمًا لمفتاح EC Diffie-Hellman عام وخاص، ويعيد المفتاح العام منسقًا ومرمزًا وفقًا لقيمة الوسيط format
والوسيط encoding
. يجب أن يُنقَل هذا المفتاح إلى الطرف الآخر.
يحدد الوسيط format
صيغة المفتاح ويمكن أن يكون 'compressed'
، أو 'uncompressed'
، أو 'hybrid'
. إن لم يُعطَ الوسيط format
، فستُسعمَل القيمة 'compressed'
الافتراضية له.
يمكن أن يأخذ الوسيط encoding
إحدى القيم 'latin1'
، أو 'hex'
، أو 'base64'
. إن لم يُعطَ الوسيط encoding
، فستُعاد سلسلة نصية؛ خلا ذلك، سيُعاد كائن من النوع Buffer
.
ecdh.getPrivateKey([encoding])
أضيف في الإصدار: v0.11.14.
يعيد هذا التابع مفتاح EC Diffie-Hellman الخاص (private key) مرمزًا بالترميز encoding
المعطى، والذي يمكن أن يكون 'latin1'
، أو 'hex'
، أو 'base64'
. إن أعطي الوسيط encoding
، فستُعاد سلسلة نصية؛ خلا ذلك، سيُعاد كائن من النوع Buffer
.
ecdh.getPublicKey([encoding][, format])
أضيف في الإصدار: v0.11.14.
encoding
: <string>format
: <string> القيمة الافتراضية هي:'uncompressed'
.- القيم المعادة: <Buffer> | <string>
يعيد هذا التابع مفتاح EC Diffie-Hellman العام (private key) مرمزًا بالترميز encoding
ومنسَّقًا بالصيغة format
المعطاة.
يحدِّد الوسيط format
صيغة المفتاح ويمكن أن يكون 'compressed'
، أو 'uncompressed'
. إن لم يُعطَ الوسيط format
، فستُسعمَل القيمة 'compressed'
الافتراضية له.
يمكن أن يأخذ الوسيط encoding
إحدى القيم 'latin1'
، أو 'hex'
، أو 'base64'
. إن لم يُعطَ الوسيط encoding
، فستُعاد سلسلة نصية؛ خلا ذلك، سيُعاد كائن من النوع Buffer
.
ecdh.setPrivateKey(privateKey[, encoding])
أضيف في الإصدار: v0.11.14.
privateKey
: <string> | <Buffer> | <TypedArray> | <DataView>encoding
: <string>
يضبط هذا التابع مفتاح EC Diffie-Hellman الخاص (private key). إن أعطي الوسيط encoding
وكانت قيمته 'latin1'
، أو 'hex'
، أو 'base64'
، فسيُتوقَّع أن يكون الوسيط privateKey
سلسلةً نصيةً. أمَّا إن لم يعطَ الوسيط encoding
، فسيُتوقَّع أن يكون الوسيط privateKey
كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
.
إن كان المفتاح privateKey
غير صالح للمنحني المحدد عندما أنشئ الكائن ECDH
، فسيُرمى خطأٌ. بعد ضبط المفتاح الخاص، يُولَّد المفتاح العام (public point) المرتبط به أيضًا ويُضبَط في الكائن ECDH
.
ecdh.setPublicKey(publicKey[, encoding])
أضيف في الإصدار: v0.11.14، وأهمل منذ الإصدار: v5.2.0. الاستقرار: 0-مهمل
publicKey
: <string> | <Buffer> | <TypedArray> | <DataView>encoding
: <string>
يضبط هذا التابع مفتاح EC Diffie-Hellman العام (public key). إن أعطي الوسيط encoding
وكانت قيمته 'latin1'
، أو 'hex'
، أو 'base64'
، فسيُتوقَّع أن يكون الوسيط publicKey
سلسلةً نصيةً. أمَّا إن لم يعطَ الوسيط encoding
، فسيُتوقَّع أن يكون الوسيط privateKey
كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
.
انتبه إلى أنَّه لا يوجد أي سبب يحيجك إلى استدعاء هذا التابع لأنَّ الكائن ECDH
يتطلَّب مفتاحًا خاصًّا ومفتاحًا عامًا من الطرف الآخر فقط لحساب السر المتشارك. سيستدعى عادةً أحد التابعان ecdh.generateKeys()
أو ecdh.setPrivateKey()
. يحاول التابع ecdh.setPrivateKey()
توليد المفتاح العام المرتبط بالمفتاح الخاص الذي ضُبِط.
const crypto = require('crypto');
const alice = crypto.createECDH('secp256k1');
const bob = crypto.createECDH('secp256k1');
// .الخاصة السابقة Alice ملاحظة: هذه طريقة مختصرة لتحديد أحد مفاتيح
// .من غير الحكمة استعمال مفتاح خاص يمكن التنبؤ بقيمته في تطبيق حقيقي
alice.setPrivateKey(
crypto.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.
الصنف Hash
هو أداةٌ لإنشاء القيم hash للبيانات. يمكن استعمال هذا الصنف بإحدى الطريقتين التاليتين:
- يُستعمَل كمجرًى قابلًا للقراءة والكتابة، إذ تكتب فيه البيانات لتوليد القيمة hash المقابلة لها في الجانب القابل للقراءة من هذا المجرى، أو
- يُستعمَل التابعان
hash.update()
وhash.digest()
لتوليد القيمة hash المحسوبة.
يُستعمَل التابع crypto.createHash()
لإنشاء نسخٍ من الصنف Hash
. لا يجب إنشاء الكائنات Hash
باستعمال الكلمة المفتاحية new
مباشرةً.
يوضح المثال التالي كيفية استعمال الكائنات Hash
كمجاري:
const crypto = require('crypto');
const hash = crypto.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
مع نقل محتويات المجاري (piped streams):
const crypto = require('crypto');
const fs = require('fs');
const hash = crypto.createHash('sha256');
const input = fs.createReadStream('test.js');
input.pipe(hash).pipe(process.stdout);
أمَّا المثال التالي، فيوضِّح كيفية استعمال التابعان hash.update()
و hash.digest()
:
const crypto = require('crypto');
const hash = crypto.createHash('sha256');
hash.update('some data to hash');
console.log(hash.digest('hex'));
// سيُطبَع:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
hash.digest([encoding])
أضيف في الإصدار: v0.1.92.
يحسب هذا التابع القيمة hash (إذ يصف المصطلح digest ببساطة عملية إيجاد القيم hash المختصرة) لجميع البيانات الممررة إليه (باستعمال التابع hash.update()
). يمكن أن يأخذ الوسيط encoding
القيمة 'hex'
، أو 'latin1'
، أو 'base64'
. إن لم يُعطَ هذا الوسيط، فستُعاد سلسلة نصية؛ خلا ذلك، سيُعاد كائن من النوع Buffer
. لا يمكن استعمال الكائن Hash
مرةً أخرى بعد استدعاء التابع hash.digest()
. سيؤدي استدعاء التابع hash.digest()
عدة مرات إلى رمي خطأٍ.
hash.update(data[, inputEncoding])
الإصدار | التغييرات |
---|---|
v6.0.0 | تغيرت القيمة الافتراضية للوسيط inputEncoding من binary إلى utf8 .
|
v0.1.92 | أضيف هذا التابع. |
data
: <string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
: <string>
يحدِّث هذا التابع محتوى الكائن Hash
مع البيانات data
المعطاة، وبالترميز inputEncoding
المعطى والذي يمكن أن يكون 'utf8'
، أو 'ascii'
، أو 'latin1'
. إن أعطي الوسيط encoding
وكانت الوسيط data
سلسلةً نصيةً، فسيُفرَض استعمال الترميز 'utf8'
. إن كان الوسيط data
كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
، فسيُتحاهَل حينها الوسيط inputEncoding
إن أعطي. يمكن استدعاء هذا التابع عدة مرات مع بيانات جديدة طالما كان متاحًا في المجرى.
الصنف Hmac
أضيف في الإصدار: v0.1.94. الصنف Hmac
هو أداةٌ لإنشاء التشفير HMAC (اختصارٌ للعبارة keyed-hash message authentication code أو العبارة hash-based message authentication code) للبيانات. يمكن استعمال هذا الصنف بإحدى الطريقتين التاليتين:
- يُستعمَل كمجرًى قابلًا للقراءة والكتابة، إذ تكتب فيه البيانات لتوليد التشفير
HMAC
المقابل لها في الجانب القابل للقراءة من هذا المجرى، أو - يُستعمَل التابعان
hmac.update()
وhmac.digest()
لتوليد القيمة HMAC المحسوبة.
يُستعمَل التابع crypto.createHmac()
لإنشاء نسخٍ من الصنف Hmac
. لا يجب إنشاء الكائنات Hmac
باستعمال الكلمة المفتاحية new
مباشرةً. يوضح المثال التالي كيفية استعمال الكائنات Hmac
كمجاري:
const crypto = require('crypto');
const hmac = crypto.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();
ويوضح المثال التالي كيفية استعمال الصنف Hash
مع نقل محتويات المجاري (piped streams)
- أما المثال التالي، فيُوضِّح كيفية استعمال التابعان
const crypto = require('crypto'); const fs = require('fs'); const hmac = crypto.createHmac('sha256', 'a secret'); const input = fs.createReadStream('test.js'); input.pipe(hmac).pipe(process.stdout);
hmac.update()
وhmac.digest()
:const crypto = require('crypto'); const hmac = crypto.createHmac('sha256', 'a secret'); hmac.update('some data to hash'); console.log(hmac.digest('hex')); // سيُطبَع: // 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
hmac.digest([encoding])
أضيف في الإصدار: v0.1.94.
يحسب هذا التابع القيمة hash للتشفير HMAC
(إذ يصف المصطلح digest ببساطة عملية إيجاد القيم hash) لجميع البيانات الممررة إليه باستعمال التابع hash.update()
. يمكن أن يأخذ الوسيط encoding
القيمة 'hex'
، أو 'latin1'
، أو 'base64'
. إن لم يُعطَ هذا الوسيط، فستُعاد سلسلة نصية؛ خلا ذلك، سيُعاد كائن من النوع Buffer
. لا يمكن استعمال الكائن Hmac
مرةً أخرى بعد استدعاء التابع hmac.digest()
. سيؤدي استدعاء التابع hmac.digest()
عدة مرات إلى رمي خطأٍ.
hmac.update(data[, inputEncoding])
الإصدار | التغييرات |
---|---|
v6.0.0 | تغيرت القيمة الافتراضية للوسيط inputEncoding من binary إلى utf8 .
|
v0.1.94 | أضيف هذا التابع. |
data
: <string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
: <string>
يحدِّث هذا التابع محتوى الكائن Hmac
مع البيانات data
المعطاة، وبالترميز inputEncoding
المعطى والذي يمكن أن يكون 'utf8'
، أو 'ascii'
، أو 'latin1'
. إن أعطي الوسيط encoding
وكانت الوسيط data
سلسلة نصية، فسيُفرَض استعمال الترميز 'utf8'
. إن كان الوسيط data
كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
، فسيُتحاهَل حينها الوسيط inputEncoding
إن أعطي. يمكن استدعاء هذا التابع عدة مرات مع بيانات جديدة طالما كان متاحًا في المجرى.
الصنف Sign
أضيف في الإصدار: v0.1.92. الصنف Sign
هو أداةٌ لتوليد التواقيع (signatures). يمكن استعمال هذا الصنف بإحدى الطريقتين التاليتين:
- يُستعمَل كمجرًى قابلًا للكتابة، إذ تكتب فيه البيانات المراد توقيعها ثم يُستعمَل التابع
sign.sign()
لتوليد وإعادة التوقيع، أو - يُستعمَل التابعان
sign.update()
وsign.sign()
لتوليد التوقيع.
يُستعمَل التابع crypto.createSign()
لإنشاء نسخٍ من الصنف Sign
، إذ تُمرَّر إليه سلسلة نصية تحوي اسم للدالة hash المراد استعمالها. لا يجب إنشاء الكائنات Sign
باستعمال الكلمة المفتاحية new
مباشرةً. يوضّح المثال التالي كيفية استعمال الكائنات Sign
كمجاري:
const crypto = require('crypto');
const sign = crypto.createSign('SHA256');
sign.write('some data to sign');
sign.end();
const privateKey = getPrivateKeySomehow();
console.log(sign.sign(privateKey, 'hex'));
// .SHA-256 سيُطبَع التوقيع المحسوب باستعمال المفتاح الخاص المحدد والخوارزمية
// انظر المعامل) RSASSA-PKCS1-v1_5 يجب استعمال الخوارزمية ،RSA من أجل المفاتيح
// فيجب استعمال ،EC أما من أجل مفاتيح .(RSASSA-PSS في الأسفل من أجل padding
// ECDSA الخوارزمية
أما المثال التالي، فيوضِّح كيفية استعمال التابعان sign.update()
و sign.sign()
:
const crypto = require('crypto');
const sign = crypto.createSign('SHA256');
sign.update('some data to sign');
const privateKey = getPrivateKeySomehow();
console.log(sign.sign(privateKey, 'hex'));
// سيُطبَع التوقيع المحسوب
في بعض الحالات، يمكن إنشاء النسخة Sign
أيضًا عبر تمرير اسم خوارزمية التوقيع، مثل 'RSA-SHA256'؛ سيؤدي هذا إلى استعمال الخوارزمية المقابلة لحساب القيمة hash. انتبه إلى أنَّ هذا الأمر لا ينطبق على كل خوارزميات التوقيع، مثل الخوارزمية 'ecdsa-with-SHA256'. في مثل هذه الحالة، استعمل أسماء خوارزميات hash عوضًا عن ذلك. يوضح المثال التالي كيفية حساب قيمة توقيع باستعمال اسم خوارزمية توقيع إرثية (legacy signature algorithm):
const crypto = require('crypto');
const sign = crypto.createSign('RSA-SHA256');
sign.update('some data to sign');
const privateKey = getPrivateKeySomehow();
console.log(sign.sign(privateKey, 'hex'));
// سيُطبَع التوقيع المحسوب
sign.sign(privateKey[, outputFormat])
الإصدار | التغييرات |
---|---|
v8.0.0 | أضيف دعمٌ للخوارزمية RSASSA-PSS وخيارات أخرى. |
v0.1.92 | أضيف هذا التابع. |
يحسب هذا التابع التوقيع لكل البيانات المُمرَّرة إليه باستعمال إمَّا التابع sign.update()
أو التابع sign.write()
. يمكن أن يكون الوسيط privateKey
كائنًا أو سلسلة نصية. إن كان سلسلة نصية، فسيُعامَل وكأنه مفتاح خام (raw key) بدون عبارة مرور (passphrase). أمَّا إن كان الوسيط privateKey
كائنًا، فيجب أن يحتوي على خاصية واحدة أو أكثر من الخاصيات التالية:
Key
: <string> مفتاح خاص مرمَّز بالترميز PEM (مطلوب).passphrase
: <string> عبارة مرور من أجل المفتاح الخاص.padding
: <integer> قيمة حاشية اختيارية من أجل RSA، وتأخذ إحدى القيم التالية:crypto.constants.RSA_PKCS1_PADDING
(القيمة الافتراضية)crypto.constants.RSA_PKCS1_PSS_PADDING
انتبه إلى أنَّ القيمة RSA_PKCS1_PSS_PADDING
ستستعمل MGF1 مع نفس الدالة hash المستعملة لتوقيع الرسالة كما هو محدَّد في الفقرة 3.1 من المعيار RFC 4055.
saltLength
: <integer> طول إضافي (salt length) يُستعمَل عندما تكون قيمةpadding
هيRSA_PKCS1_PSS_PADDING
. تضبط القيمةcrypto.constants.RSA_PSS_SALTLEN_DIGEST
الخاصَّة الطول الإضافي إلى طول القيمة hash، وتضبط القيمةcrypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(الافتراضية) ذلك الطول إلى أكبر قيمة مسموحٌ بها.
يمكن أن يأخذ الوسيط outputFormat
إحدى القيم 'latin1'
، أو 'hex'
، أو 'base64'
. إن أعطي هذا الوسيط، فستُعاد سلسلة نصية. خلا ذلك، سيُعاد كائن من النوع Buffer
. لا يمكن استعمال الكائن Sign
مرةً أخرى بعد استدعاء التابع sign.sign()
. سينتج عن استدعاء التابع sign.sign()
عدة مرات خطأٌ مرمي.
sign.update(data[, inputEncoding])
الإصدار | التغييرات |
---|---|
v6.0.0 | تغيرت القيمة الافتراضية للوسيط inputEncoding من binary إلى utf8 .
|
v0.1.92 | أضيف هذا التابع. |
data
: <string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
: <string>
يحدِّث هذا التابع محتوى الكائن Sign
مع البيانات data
المعطاة، وبالترميز inputEncoding
المعطى والذي يمكن أن يكون 'utf8'
، أو 'ascii'
، أو 'latin1'
. إن أعطي الوسيط encoding
وكان الوسيط data
سلسلةً نصيةً، فسيُفرَض استعمال الترميز 'utf8'
. إن كان الوسيط data
كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
، فسيُتجاهَل حينها الوسيط inputEncoding
إن أعطي. يمكن استدعاء هذا التابع عدة مرات مع بيانات جديدة طالما كان متاحًا في المجرى.
الصنف Verify
أضيف في الإصدار: v0.1.92.
الصنف Verify
هو أداةٌ للتحقق من التوقيع. يمكن استعمال هذا الصنف بإحدى الطريقتين التاليتين:
- يستعمل كمجرًى قابلًا للكتابة، إذ تكتب فيه البيانات المراد التحقق من صحتها مع التوقيع المقابل لها، أو
- يُستعمَل التابعان
verify.update()
وverify.verify()
للتحقق من التوقيع.
يُستعمَل التابع crypto.createVerify()
لإنشاء نسخٍ من الصنف Verify
إذ تُمرَّر إليه سلسلة نصية تحوي اسم للدالة hash المراد استعمالها. لا يجب إنشاء الكائنات Verify
باستعمال الكلمة المفتاحية new
مباشرةً. يوضح المثال التالي كيفية استعمال الكائنات Verify
كمجاري:
const crypto = require('crypto');
const verify = crypto.createVerify('SHA256');
verify.write('some data to sign');
verify.end();
const publicKey = getPublicKeySomehow();
const signature = getSignatureToVerify();
console.log(verify.verify(publicKey, signature));
// false أو القيمة true ستُطبع القيمة
ويوضح المثال التالي كيفية استعمال التابع verify.update()
مع التابع verify.verify()
:
const crypto = require('crypto');
const verify = crypto.createVerify('SHA256');
verify.update('some data to sign');
const publicKey = getPublicKeySomehow();
const signature = getSignatureToVerify();
console.log(verify.verify(publicKey, signature));
// false أو القيمة true ستُطبع القيمة
verify.update(data[, inputEncoding])
الإصدار | التغييرات |
---|---|
v6.0.0 | تغيرت القيمة الافتراضية للوسيط inputEncoding من binary إلى utf8 .
|
v0.1.92 | أضيف هذا التابع. |
data
: <string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
: <string>
يحدِّث هذا التابع محتوى الكائن Verify
مع البيانات data
المعطاة، وبالترميز inputEncoding
المعطى والذي يمكن أن يكون 'utf8'
، أو 'ascii'
، أو 'latin1'
. إن أعطي الوسيط encoding
وكانت الوسيط data
سلسلة نصية، فسيُفرَض استعمال الترميز 'utf8'
. إن كان الوسيط data
كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
، فسيُتحاهَل حينها الوسيط inputEncoding
إن أعطي. يمكن استدعاء هذا التابع عدة مرات مع بيانات جديدة طالما كان متاحًا في المجرى.
verify.verify(object, signature[, signatureFormat])
الإصدار | التغييرات |
---|---|
v8.0.0 | أضيف دعمٌ للخوارزمية RSASSA-PSS وخيارات أخرى. |
v0.1.92 | أضيف هذا التابع. |
object
: <string> | <Object>signature
: <string> | <Buffer> | <TypedArray> | <DataView>signatureFormat
: <string>- القيم المعادة: <boolean> تعاد القيمة
true
أوfalse
بناءً على عملية التحقق من صلاحية التوقيع للبيانات والمفتاح العام.
يتحقق هذا التابع من كون البيانات المعطاة تستعمل الكائن object
والتوقيع signature
المعطى. يمكن أن يكون الوسيط object
إمَّا سلسلة نصية تحتوي على كائن مرمز بالترميز PEM -الذي يمكن أن يكون مفتاح RSA عام، أو مفتاح DSA عام، أو شهادةً من النوع X.509-، أو كائنًا يحوي خاصيةً واحدةً أو أكثر من الخاصيات التالية:
Key
: <string> مفتاح خاص مُرمَّز بالترميز PEM (مطلوب).padding
: <integer> قيمة حاشية اختيارية من أجل RSA، وتأخذ إحدى القيم التالية:crypto.constants.RSA_PKCS1_PADDING
(القيمة الافتراضية)crypto.constants.RSA_PKCS1_PSS_PADDING
انتبه إلى أنَّ القيمة RSA_PKCS1_PSS_PADDING
ستستعمل MGF1 مع نفس الدالة hash التي استعملت في توقيع الرسالة كما هو محدد في الفقرة 3.1 من المعيار RFC 4055.
saltLength
: <integer> طول إضافي (salt length، أو طول ملحي) يُستعمَل عندما تكون قيمةpadding
هيRSA_PKCS1_PSS_PADDING
. تضبط القيمةcrypto.constants.RSA_PSS_SALTLEN_DIGEST
الخاصَّة الطول الإضافي إلى طول القيمة hash، وتضبط القيمةcrypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
(الافتراضية) ذلك الطول إلى أكبر قيمة مسموح بها.
الوسيط signature
هو التوقيع المحسوب مسبقًا للبيانات بالترميز signatureFormat
والذي يمكن أن يأخذ إحدى القيم 'latin1'
، أو 'hex'
، أو 'base64'
. إن أعطي الوسيط signatureFormat
، فسيُتوقَّع أن يكون الوسيط signature
سلسلةً نصيةً. خلا ذلك، سيُتوقَّع أن يكون كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
. لا يمكن استعمال الكائن Verify
مرةً أخرى بعد استدعاء التابع verify.verify()
. سينتج عن استدعاء التابع sign.sign()
عدة مرات خطأ مرمي.
توابع وخاصيات الوحدة crypto
سنورد في ما يلي التوابع والخاصيات المستعملة في الوحدة crypto
:
Crypto.constants
أضيفت في الإصدار: v6.3.0.
- القيم المعادة: <Object> يعاد كائن يحتوي على الثوابت التي تُستعمَل عادةً مع العمليات المتعلقة بالتشفير (crypto) والأمن (security). الثوابت المعرَّفة حاليًا موجودةٌ في قسم «ثوابت الوحدة Crypto».
crypto.DEFAULT_ENCODING
أضيفت في الإصدار: v0.9.3، وأهملت بدءًا من الإصدار: 10.0.0. تعيد هذه الخاصية الترميز الافتراضي المراد استعماله مع الدوال التي يمكن أن تُمرَّر إليها إمَّا سلاسل نصية أو كائنات من النوع Buffer
. القيمة الافتراضية هي 'buffer'
أي استعمال الكائنات Buffer
افتراضيًّا مع التوابع. سبب وجود الآلية crypto.DEFAULT_ENCODING
هي للتوافقية الرجوعية (backwards compatibility) مع التطبيقات الإرثية (legacy programs) التي تتوقع أن يكون الترميز 'latin1'
هو الترميز الافتراضي. يجب على التطبيقات الجديدة أن تتوقع أنَّ 'buffer'
هي القيمة الافتراضية. انتبه إلى أنَّ هذه الخاصية قد أُهملَت.
crypto.fips
أضيفت في الإصدار: v6.0.0، وأهملت بدءًا من الإصدار: 10.0.0. تُستعمَل هذه الخاصية للتحقق فيما إذا كان مزود الوحدة crypto
المتوافق مع FIPS يُستعمَل حاليًا وذلك للتحكم به. ضبط هذه الخاصية إلى القيمة true
يتطلب من FIPS أن تبني Node.js. انتبه إلى أنَّ هذه الخاصية قد أُهملَت. استعمل رجاءً التابع crypto.setFips()
والتابع crypto.getFips()
عوضًا عن ذلك.
crypto.createCipher(algorithm, password[, options])
الإصدار | التغييرات |
---|---|
v10.10.0 | أصبح التشفير باستعمال الوضع OCB مدعومًا الآن. |
v10.2.0 | يمكن الآن استعمال الخيار authTagLength لتوليد بطاقات مصادقة قصيرة في الوضع GCM بحجم 16 بايت افتراضيًّا.
|
v10.0.0 | أهمل هذا التابع. |
v0.1.94 | أضيف هذا التابع. |
الاستقرار: 0-مهمل. استعمل التابع crypto.createCipheriv()
عوضًا عنه.
algorithm
: <string>password
: <string> | <Buffer> | <TypedArray> | <DataView>options
: <Object> خياراتstream.transform
.- القيم المعادة: <Cipher>
ينشئ هذا التابع كائنًا من النوع Cipher
ثم يعيده وذلك باستعمال الخوارزمية algorithm
وكلمة المرور password
. يتحكم الوسيط options
بسلوك المجرى وهو اختياري إلا عند التشفير باستعمال الوضع CCM أو الوضع OCB (مثل 'aes-128-ccm'). في هذه الحالة، يُطلَب الخيار authTagLength
لتحديد طول بطاقة المصادقة بواحدة البايت (راجع الوضع CCM في الأسفل). في الوضع GCM، لا يُطلب استعمال الخيار authTagLength
، ولكن يمكن استعماله لضبط طول بطاقة المصادقة التي ستُعاد عبر التابع getAuthTag()
؛ الطول الافتراضي هو 16 بايت. تعتمد الخوارزمية algorithm
المعطاة على OpenSSL، مثل 'aes192' وغيرها. في إصدارات OpenSSL الحديثة، سيُظهر الأمر openssl list -cipher-algorithms
(أو openssl list-cipher-algorithms
في الإصدارات القديمة) خوارزميات التشفير المتاحة. يُستعمَل الوسيط password
لاشتقاق مفتاح التشفير والمتغير الأولي (initialization vector، ويدعى اختصارًا IV أو يدعى أحيانًا starting variable [تختصر إلى SV]). يجب أن يكون إمَّا سلسلةً نصيةً مرمزةً بالترميز 'latin1'
، أو كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
. يُنفَّذ التابع crypto.createCipher()
لاشتقاق المفاتيح باستعمال الدالة EVP_BytesToKey
التي تخص OpenSSL مع ضبط الخوارزمية التي تحسب قيمة hash إلى MD5، والتكرار مرة واحدة، وبدون طول إضافي (salt). يسمح نقص الطول الإضافي (salt) بهجمات القاموس (dictionary attacks) لأنَّ كلمة المرور نفسها تولِّد دومًا المفتاح نفسه. يؤدي أيضًا عدد مرات التكرار المنخفض والخوارزمية hash الغير آمنة بالتحقق من كلمات المرور بسرعة كبيرة. تماشيًا مع توصية OpenSSL باستعمال خوارزمية حديثة عوضًا عن EVP_BytesToKey
، يوصى بأن يعمل المطورون على اشتقاق مفتاح ومتغير أولي (IV) بأنفسهم باستعمال التابع crypto.scrypt()
، وأن يستعملوا التابع crypto.createCipheriv()
لإنشاء الكائن Cipher
. لا يجب على المستخدمين أن يستعملوا القيم المشفرة مع وضع العداد (counter mode) -مثل CTR، أو GCM، أو CCM- في التابع crypto.createCipher()
. سيُطلَق تحذير عند تنفيذ ذلك لتجنب خطر إعادة استعمال المتغير IV الأولي الذي يؤدي إلى حدوث نقطة ضعف أو ثغرة. لمزيد من التفاصيل حول حالة إعادة استعمال المتغير IV في الوضع GCM، تصفَّح هذا المرجع.
crypto.createCipheriv(algorithm, key, iv[, options])
الإصدار | التغييرات |
---|---|
v10.10.0 | أصبح التشفير باستعمال الوضع OCB مدعومًا الآن. |
v10.2.0 | يمكن الآن استعمال الخيار authTagLength لتوليد بطاقات مصادقة قصيرة في الوضع GCM بحجم 16 بايت افتراضيًّا.
|
v9.9.0 | يمكن الآن أن يأخذ المتغير iv القيمة null عند عدم الحاجة إلى متغير أولي (initialization vector).
|
v0.1.94 | أضيف هذا التابع. |
algorithm
: <string>key
: <string> | <Buffer> | <TypedArray> | <DataView>iv
: <string> | <Buffer> | <TypedArray> | <DataView>options
: <Object> خيارات التابعstream.transform
.- القيم المعادة: <Cipher>
ينشئ هذا التابع كائنًا من النوع Cipher
ثم يعيده وذلك باستعمال الخوارزمية algorithm
والمفتاح key
والمتغير الأولي iv
. يتحكم الوسيط options
بسلوك المجرى وهو اختياري إلا عند التشفير باستعمال الوضع CCM أو الوضع OCB (مثل 'aes-128-ccm'). في هذه الحالة، يُطلَب الخيار authTagLength لتحديد طول بطاقة المصادقة بواحدة البايت (راجع الوضع CCM في الأسفل). في الوضع GCM، لا يُطلب استعمال الخيار authTagLength
، ولكن يمكن استعماله لضبط طول بطاقة المصادقة التي ستُعاَد عبر التابع getAuthTag()
؛ الطول الافتراضي هو 16 بايت. تعتمد الخوارزمية algorithm
المعطاة على OpenSSL، مثل 'aes192' وغيرها. في إصدارات OpenSSL الحديثة، سيُظهِر الأمر openssl list -cipher-algorithms
(أو openssl list-cipher-algorithms
في الإصدارات القديمة) خوارزميات التشفير المتاحة. الوسيط key
هو المفتاح الخام (raw key) الذي تستعمله الخوارزمية algorithm
، والوسيط iv هو المتغير الأولي (initialization vector). يجب أن يكون كلا هذين الوسيطين إما سلسلةً نصيةً مرمزةً بالترميز 'utf8'
، أو كائنًا من النوع Buffer
، أو TypedArray
، أو DataView
. إن لم يكن هنالك حاجة لاستعمال المتغير الأولي في عملية التشفير، فيمكن استعمال القيمة null
حينئذٍ مع الوسيط iv
. يجب أن تكون المتغيرات الأولية (IV) فريدةً وغير قابلة للتنبؤ بأي شكل من الأشكال. من الناحية المثالية، يجب أن يكونوا قيمًا عشوائية بشكل مشفرة. لا يفترض أن تكون هذه المتغيرات سرِّية، إذ تضاف عادةً بدون تشفير إلى الرسائل المشفرة نصيًّا (ciphertext messages). قد يبدو -للوهلة الأولى- أن هنالك شيئًا من التناقض المتعلق بالشرط الذي ينص على أنَّ هذه المتغيرات يجب أن تكون فريدةً وغير قابلة للتنبؤ في آنٍ واحدٍ ولكن لا يجب أن تكون سرية أيضًا؛ على أي حال، من المهم حاليًا أن تبقي في بالك أنه لا ينبغي على المهاجم أن يكون قادرًا على التنبؤ في وقت مبكر ما هي قيمة المتغير الأولي التي ستُعطَى.
crypto.createCredentials(details)
أضيف في الإصدار: 0.1.92، وأهمل في الإصدار: v0.11.13.
الاستقرار: 0-مهمل؛ استعمل التابع tls.createSecureContext()
عوضًا عنه.
details
: <Object> مماثل تمامًا للتابعtls.createSecureContext()
.- القيم المعادة: <tls.SecureContext>
هذا التابع هو تابعٌ مهملٌ، ويستعمل في إنشاء الكائن tls.SecureContext
وإعادته. على أي حال، لا يجب استعماله، إذ حل التابع tls.createSecureContext()
-الذي يشبه هذا التابع في الوسائط والقيم المعادة تمامًا- مكانه. يعيد هذا التابع الكائن tls.SecureContext
، كما يفعل التابع tls.createSecureContext()
عند استدعائه.
crypto.createDecipher(algorithm, password[, options])
الإصدار | التغييرات |
---|---|
v10.10.0 | أصبح التشفير باستعمال الوضع OCB مدعومًا الآن. |
v10.0.0 | أهمل هذا التابع. |
v0.1.94 | أضيف هذا التابع. |
الاستقرار: 0-مهمل؛ استعمل التابع crypto.createDecipheriv()
عوضًا عنه.
algorithm
: <string>password
: <string> | <Buffer> | <TypedArray> | <DataView>options
: <Object> خيارات التابعstream.transform
.- القيم المعادة: <Decipher>
ينشئ هذا التابع كائنًا من النوع Decipher
ثم يعيده وذلك باستعمال الخوارزمية algorithm
وكلمة المرور password
(المفتاح). يتحكم الوسيط options
بسلوك المجرى وهو اختيار إلا عند التشفير باستعمال الوضع CCM أو الوضع OCB (مثل 'aes-128-ccm'). في هذه الحالة، يُطلب الخيار authTagLength
لتحديد طول بطاقة المصادقة بواحدة البايت (راجع الوضع CCM في الأسفل). يُنفَّذ التابع crypto.createDecipher()
لاشتقاق المفاتيح باستعمال الدالة EVP_BytesToKey
التي تخص OpenSSL مع ضبط الخوارزمية التي تحسب قيمة hash إلى MD5، والتكرار مرةً واحدةً، وبدون طول إضافي (salt). يسمح نقص الطول الإضافي (salt) بهجمات القاموس (dictionary attacks) لأنَّ كلمة المرور نفسها تولد دومًا المفتاح نفسه. يؤدي أيضًا عدد مرات التكرار المنخفض والخوارزمية hash الغير آمنة إلى التحقق من كلمات المرور بسرعة كبيرة. تماشيًا مع توصية OpenSSL باستعمال خوارزمية أحدث عوضًا عن EVP_BytesToKey
، يوصى بأن يعمل المطورون على اشتقاق مفتاح ومتغير أولي (IV) بأنفسهم باستعمال التابع crypto.scrypt()
، وأن يستعملوا التابع crypto.createDecipheriv()
لإنشاء الكائن Decipher
.
crypto.createDecipheriv(algorithm, key, iv[, options])
الإصدار | التغييرات |
---|---|
v10.10.0 | أصبح التشفير باستعمال الوضع OCB مدعومًا الآن. |
v10.2.0 | يمكن الآن استعمال الخيار authTagLength لتقييد أطوال بطاقة المصادقة GCM المقبولة.
|
v9.9.0 | يمكن الآن أن يأخذ المتغير iv القيمة null عند عدم الحاجة إلى استعمال متغير أولي (initialization vector).
|
v0.1.94 | أضيف هذا التابع. |
algorithm
: <string>key
: <string> | <Buffer> | <TypedArray> | <DataView>iv
: <string> | <Buffer> | <TypedArray> | <DataView>options
: <Object> خيارات التابعstream.transform
.- القيم المعادة: <Decipher>
ينشئ هذا التابع كائنًا من النوع Decipher
ثم يعيده وذلك باستعمال الخوارزمية algorithm
والمفتاح key
والمتغير الأولي (IV). يتحكم الوسيط options
بسلوك المجرى وهو اختياري إلا عند التشفير باستعمال الوضع CCM أو الوضع OCB (مثل 'aes-128-ccm'). في هذه الحالة، يُطلَب الخيار authTagLength
لتحديد طول بطاقة المصادقة بواحدة البايت (راجع الوضع CCM في الأسفل). في الوضع GCM، لا يُطلب استعمال الخيار authTagLength
، ولكن يمكن استعماله لتقييد طول بطاقات المصادقة المقبولة بطول محدد. تعتمد الخوارزمية algorithm
المعطاة على OpenSSL، مثل 'aes192' وغيرها. في إصدارات OpenSSL الحديثة، سيُظهِر الأمر openssl list -cipher-algorithms
(أو openssl list-cipher-algorithms
في الإصدارات القديمة) خوارزميات التشفير المتاحة. الوسيط key
هو المفتاح الخام (raw key) الذي تستعمله الخوارزمية algorithm
، والوسيط iv
هو المتغير الأولي (initialization vector). يجب أن يكون كلا هذين الوسيطين إما سلسلةً نصيةً مرمزةً بالترميز 'utf8'
، أو كائنًا من النوع Buffer
، أو النوع TypedArray
، أو النوع DataView
. إن لم يكن هنالك حاجة لاستعمال المتغير الأولي في عملية التشفير، فيمكن استعمال القيمة null
حينئذٍ مع الوسيط iv
. يجب أن تكون المتغيرات الأولية (IVs) فريدةً وغير قابلة للتنبؤ بأي شكل من الأشكال. من الناحية المثالية، يجب أن يكونوا قيمًا عشوائية بطريقة مشفرة. لا يفترض أن تكون هذه المتغيرات سرِّية، إذ تضاف عادةً بدون تشفير إلى الرسائل المشفرة نصيًّا (ciphertext messages). قد يبدو أن هنالك شيئًا من التناقض المتعلق بالشرط الذي ينص على أنَّ هذه المتغيرات يجب أن تكون فريدةً وغير قابلة للتنبؤ في آنٍ واحدٍ ولكن لا يجب أن تكون سرية أيضًا؛ على أي حال، من المهم حاليًا أن تُبقِي في بالك أنَّه لا ينبغي على المهاجم أن يكون قادرًا على التنبؤ في وقت مبكر بقيمة المتغير IV التي ستعطى.
crypto.createDiffieHellman(prime[, primeEncoding][, generator][, generatorEncoding])
الإصدار | التغييرات |
---|---|
v8.0.0 | يمكن أن يكون الوسيط prime الآن كائنًا من النوع TypeArra أو النوع DataView.
|
v8.0.0 | يمكن أن يكون الوسيط prime الآن كائنًا من النوع Uint8Array .
|
v6.0.0 | تغيرت القيمة الافتراضية لمعاملات الترميز الآن من binary إلى utf8 .
|
v0.11.12 | أضيف هذا التابع. |
prime
: <string> | <Buffer> | <TypedArray> | <DataView>primeEncoding
: <string>generator
: <number> | <string> | <Buffer> | <TypedArray> | <DataView> القيمة الافتراضية هي: 2generatorEncoding
: <string>
ينشئ هذا التابع كائن تبادل المفتاح DiffieHellman
باستعمال العدد الأولي prime
المعطى والمولد generator
الاختياري (إن أعطي). يمكن أن يكون الوسيط gernerator
عددًا، أو سلسلة نصية، أو كائنًا من النوع Buffer
. إن لم يُعطَ هذا الوسيط، فستكون قيمته الافتراضية هي: 2. يمكن أن يأخذ الوسيطان primeEncoding
و generatorEncoding
القيمة 'latin1'
، أو 'hex'
، أو 'base64'
. إن أعطي الوسيط generatorEncoding
، فسيُتوقَع أن يكون الوسيط gernerator
سلسلةً نصيةً؛ خلا ذلك، سيُتوقع أن يكون عددًا، أو كائنًا من النوع Buffer
، أو النوع TypedArray
، أو النوع DataView
.
crypto.createDiffieHellman(primeLength[, generator])
أضيف في الإصدار: v0.5.0.
primeLength
: <number>generator
: <number> | <string> | <Buffer> | <TypedArray> | <DataView> القيمة الافتراضية هي: 2
ينشئ هذا التابع كائن تبادل المفتاح DiffieHellman
ويولد عددًا أوليًا بطول primeLength
بت باستعمال المولد generator
العددي الاختياري. إن لم يُعطَ الوسيط generator
، فستُستعمَل القيمة 2 الافتراضية.
crypto.createECDH(curveName)
أضيف في الإصدار: v0.11.14.
curveName
: <string>
ينشئ هذا التابع كائن تبادل المفتاح ECDH
(اختصارٌ للعبارة Elliptic Curve Diffie-Hellman) باستعمال المنحني المُعرَّف مسبقًا والمُحدَّد عبر السلسلة النصية curveName
. يمكن استعمال التابع crypto.getCurves()
للحصول على قائمة بأسماء المنحنيات المتوافرة. في إصدارات OpenSSL الأخيرة، سيُظهر الأمر openssl ecparam -list_curves
أيضًا اسمًا ووصفًا لكل منحني بيضاوي (elliptic curve) متاح.
crypto.createHash(algorithm[, options])
أضيف في الإصدار: v0.1.92.
ينشئ هذا التابع الكائن Hash
الذي يمكن استعماله لتوليد القيمة hash المشفرة للبيانات والرسائل باستعمال الخوارزمية algorithm
المعطاة. يعتمد الوسيط algorithm
على الخوارزميات المتاحة التي يدعمها الإصدار OpenSSL المثبَّت على المنصة آنذاك، مثل 'sha256' و 'sha512' وغيرها. في إصدارات OpenSSL الحديثة، سيُظهِر الأمر openssl list -digest-algorithms
(أو الأمر openssl list-message-digest-algorithms
في الإصدارات القديمة) الخوارزميات المتاحة التي تحسب القيمة hash. يوضح المثال التالي كيفية توليد المجموع sha256 لملف:
const filename = process.argv[2];
const crypto = require('crypto');
const fs = require('fs');
const hash = crypto.createHash('sha256');
const input = fs.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])
أضيف في الإصدار: v0.1.94.
Algorithm
: <string>
Key
: <string> | <Buffer> | <TypedArray> | <DataView>
Options
: <Object> خيارات التابعstream.transform
.
- القيم المعادة: <Hmac>
ينشئ هذا التابع الكائن Hmac
ثم يعيده والذي يستعمل الخوارزمية algorithm
والمفتاح key
المعطى. يتحكم الوسيط options
الاختياري بسلوك المجرى. يعتمد الوسيط algorithm
على الخوارزميات المتاحة التي يدعمها الإصدار OpenSSL المثبَّت على المنصة آنذاك، مثل 'sha256' و 'sha512' وغيرها. في إصدارات OpenSSL الحديثة، سيُظر الأمر openssl list -digest-algorithms
(أو الأمر openssl list-message-digest-algorithms
في الإصدارات القديمة) الخوارزميات المتاحة التي تحسب القيمة hash. الوسيط key
هو المفتاح HMAC المستعمل في توليد قيمة hash المشفرة للكائن Hmac
. يوضح المثال التالي كيفية توليد HMAC باستعمال الخوارزمية sha256 لملف:
const filename = process.argv[2];
const crypto = require('crypto');
const fs = require('fs');
const hmac = crypto.createHmac('sha256', 'a secret');
const input = fs.createReadStream(filename);
input.on('readable', () => {
const data = input.read();
if (data)
hmac.update(data);
else {
console.log(`${hmac.digest('hex')} ${filename}`);
}
});
crypto.createSign(algorithm[, options])
أضيف في الإصدار: v0.1.92.
ينشئ هذا التابع كائنًا من النوع Sign
التي يستعمل الخوارزمية algorithm
المعطاة. استعمل التابع crypto.getHashes()
للحصول على مصفوفة بأسماء خوارزميات التوقيع المتاحة. يتحكم الوسيط options
الاختياري بسلوك المجرى stream.Writable
.
crypto.createVerify(algorithm[, options])
أضيف في الإصدار: v0.1.92.
Algorithm
: <string>
Options
: <Object> خيارات التابعstream.Writable
.
- القيم المعادة: <Verify>
ينشئ هذا التابع كائنًا من النوع Verify
الذي يستعمل الخوارزمية algorithm
المعطاة. استعمل التابع crypto.getHashes()
للحصول على مصفوفة بأسماء خوارزميات التوقيع المتاحة. يتحكم الوسيط options
الاختياري بسلوك المجرى stream.Writable
.
crypto.getCiphers()
أضيف في الإصدار: v0.9.3.
- القيم المعادة: <string[]> مصفوفةٌ بأسماء خوارزميات التشفير المدعومة.
const ciphers = crypto.getCiphers();
console.log(ciphers); // ['aes-128-cbc', 'aes-128-ccm', ...]
crypto.getCurves()
أضيف في الإصدار: v2.3.0.
- القيم المعادة: <string[]> مصفوفةٌ بأسماء المنحنيات البيضاوية (elliptic curves) المدعومة.
const curves = crypto.getCurves();
console.log(curves); // ['Oakley-EC2N-3', 'Oakley-EC2N-4', ...]
crypto.getDiffieHellman(groupName)
أضيف في الإصدار: v0.7.5.
ينشئ هذا التابع كائن تبادل المفتاح DiffieHellman
المعرَّف مسبقًا. المجموعات المدعومة هي: 'modp1'، و 'modp2'، و 'modp5' (المعرفة في المعيار RFC 2412، ولكن انظر أيضًا قسم «دعم الخوارزميات الضعيفة والخطرة»)، و 'modp14'، و 'modp15'، و 'modp16'، و 'modp17'، و 'modp18' (المعرف في المعيار RFC 3526). يحاكي الكائن المعاد واجهة الكائنات المنشأة عبر التابع crypto.createDiffieHellman()
، ولكن لن يسمح بتعديل المفاتيح (مع التابع diffieHellman.setPublicKey()
مثلًا). ميزة استعمال هذا التابع هي أنه لا يتوجب على الأطراف توليد ولا تبادل معاملات مجموعة (group modulus) مسبقًا مما يوفر وقت المعالجة والاتصال.
const crypto = require('crypto');
const alice = crypto.getDiffieHellman('modp14');
const bob = crypto.getDiffieHellman('modp14');
alice.generateKeys();
bob.generateKeys();
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');
// متماثلين bobSecret والثابت aliceSecret يجب أن يكون الثابت
console.log(aliceSecret === bobSecret);
crypto.getFips()
أضيف في الإصدار: v10.0.0.
- القيم المعادة: <boolean> القيمة
true
إذا، وفقط إذا، كان مزود التشفير المتوافق مع FIPS قيد الاستخدام.
crypto.getHashes()
أضيف في الإصدار: v0.9.3.
- القيم المعادة: <string[]> مصفوفةٌ بأسماء الخوارزميات hash المدعومة، مثل 'RSA-SHA256'.
const hashes = crypto.getHashes();
console.log(hashes); // ['DSA', 'DSA-SHA', 'DSA-SHA1', ...]
crypto.pbkdf2(password, salt, iterations, keylen, digest, callback)
الإصدار | التغييرات |
---|---|
v8.0.0 | أصبح المعامل digest مطلوبًا دومًا.
|
v6.0.0 | أصبح استدعاء هذا التابع دون تمرير المعامل digest مهملًا الآن، وسيُطلَق تحذير بذلك.
|
v6.0.0 | تغيَّر الترميز الافتراضي للمعامل password عندما يكون سلسلة نصية من binary إلى utf8 .
|
v0.5.5 | أضيف هذا التابع. |
password
: <string> | <Buffer> | <TypedArray> | <DataView>salt
: <string> | <Buffer> | <TypedArray> | <DataView>iterations
: <number>keylen
: <number>digest
: <string>callback
: <Function>
يوفر هذا التابع تنفيذًا غير متزامن للدالة PBKDF2
(اختصارٌ للعبارة Password-Based Key Derivation Function 2 أي دالة اشتقاق المفتاح الذي يعتمد على كلمة المرور). تُطبَّق الخوارزمية التي تحسب HMAC المحددة بالوسيط digest
لاشتقاق مفتاح بالطول keylen
المطلوب (بالبايت) من الوسائط password
، و salt
، و iterations
. تُستدعَى الدالة callback
المعطاة مع الوسيطين: err
، و derivedKey
. إن حدث خطأ أثناء اشتقاق المفتاح، فستُعيَّن قيمة الوسيط err
؛ خلا ذلك، ستكون قيمة الوسيط err
هي null
. ستُمرَّر القيمة derivedKey
المولَّدة بنجاح إلى دالة رد النداء ككائن من النوع Buffer
. سيُرمَى خطأ إن كان أيٌّ من الوسائط المدخلة يحدد قيمًا أو أنواعًا غير صالحة. يجب أن يكون الوسيط iterations
عددًا يأخذ أعلى قيمة ممكنة. كلما كان عدد التكرارات كبيرًا، كان المفتاح المشتق آمنًا أكثر ولكن ذلك سيستهلك مزيدًا من الوقت لإتمام العملية. أما الوسيط salt
، فيجب أن يكون فريدًا قدر الإمكان. يوصى أيضًا أن يكون عشوائيًّا وبطول 16 بايت على الأقل. لمزيد من التفاصيل، اطلع على المرجع NIST SP 800-132.
const crypto = require('crypto');
crypto.pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae'
});
يمكن استعمال الخاصية crypto.DEFAULT_ENCODING
لتغيير كيفية تمرير derivedKey
إلى دالة رد النداء. على أي حال، هذه الخاصية قد أصبحت مهملةً ويجب تجنب استعمالها.
const crypto = require('crypto');
crypto.DEFAULT_ENCODING = 'hex';
crypto.pbkdf2('secret', 'salt', 100000, 512, 'sha512', (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey); // '3745e48...aa39b34'
});
يمكن استعمال التابع crypto.getHashes()
لمعرفة أسماء الخوارزميات hash المدعومة. انتبه إلى أنَّ الواجهة البرمجية هذه تستعمل مجمع الخيوط الخاص بالمكتبة libuv التي يكون لها آثارًا مفاجئة وسلبية على الأداء لبعض التطبيقات. راجع القسم UV_THREADPOOL_SIZE=size
في توثيق خيارات سطر الأوامر في Node.js لمزيد من التفاصيل.
crypto.pbkdf2Sync(password, salt, iterations, keylen, digest)
الإصدار | التغييرات |
---|---|
v6.0.0 | أصبح استدعاء هذا التابع دون تمرير المعامل digest مهملًا الآن، وسيُطلَق تحذير بذلك.
|
v6.0.0 | تغير الترميز الافتراضي للمعامل password عندما يكون سلسلة نصية من binary إلى utf8 .
|
v0.5.5 | أضيف هذا التابع. |
password
: <string> | <Buffer> | <TypedArray> | <DataView>salt
: <string> | <Buffer> | <TypedArray> | <DataView>iterations
: <number>keylen
: <number>digest
: <string>- القيم المعادة: <Buffer>
يوفر هذا التابع تنفيذًا متزامنًا للدالة PBKDF2
(اختصارٌ للعبارة Password-Based Key Derivation Function 2، أي دالة اشتقاق المفتاح الذي تعتمد على كلمة المرور). تُطبَّق الخوارزمية التي تحسب HMAC المحددة بالوسيط digest
لاشتقاق مفتاحٍ بالطول keylen
المطلوب (بالبايت) من الوسائط password
، و salt
، و iterations
. إن حصل أي خطأ، فسيُرمَى الخطأ Error
، أو سيعاد المفتاح المشتق ككائن من النوع Buffer
. يجب أن يكون الوسيط iterations
عددًا بأعلى قيمة ممكنة. كلما كان عدد التكرارات كبيرًا، كان المفتاح المشتق أكثر أمانًا، ولكن ذلك سيستهلك مزيدًا من الوقت لإتمام العملية. يجب أن يكون الوسيط salt
فريدًا قدر الإمكان، ويوصى أيضًا أن يكون عشوائيًّا وبطول 16 بايت على الأقل. لمزيد من التفاصيل، اطلع على المرجع NIST SP 800-132.
const crypto = require('crypto');
const key = crypto.pbkdf2Sync('secret', 'salt', 100000, 64, 'sha512');
console.log(key.toString('hex')); // '3745e48...08d59ae'
يمكن استعمال الخاصية crypto.DEFAULT_ENCODING
لتغيير كيفية إعادة المفتاح derivedKey
. على أي حال، هذه الخاصية قد أصبحت مهملةً ويجب تجنب استعمالها.
const crypto = require('crypto');
crypto.DEFAULT_ENCODING = 'hex';
const key = crypto.pbkdf2Sync('secret', 'salt', 100000, 512, 'sha512');
console.log(key); // '3745e48...aa39b34'
يمكن استعمال التابع crypto.getHashes()
لمعرفة أسماء الخوارزميات hash المدعومة.
crypto.privateDecrypt(privateKey, buffer)
أضيف في الإصدار: v0.11.14.
privateKey
: <Object> | <string>key
: <string> مفتاحٌ خاص مُرمَّز بالترميز PEM.passphrase
: <string> عبارة مرور اختيارية للمفتاحkey
الخاص.padding
: <crypto.constants> قيمة حشوة إضافية معرَّفة في الثوابتcrypto.constants
والتي يمكن أن تكون:crypto.constants.RSA_NO_PADDING
، أوcrypto.constants.RSA_PKCS1_PADDING
، أوcrypto.constants.RSA_PKCS1_OAEP_PADDING
.
buffer
: <Buffer> | <TypedArray> | <DataView>- القيم المعادة: <Buffer> كائن جديد من النوع
Buffer
يحوي المحتويات الوسيطbuffer
المعطى بعد فك تشفيرها.
يفك هذا التابع تشفير محتويات الوسيط buffer
المعطى باستعمال المفتاح privateKey
. يمكن أن يكون الوسيط privateKey
كائنًا أو سلسلة نصية. إن كان سلسلة نصية، فسيُعامَل وكأنه المفتاح المعطى بدون عبارة مرور (passphrase) وسيستعمل القيمة RSA_PKCS1_OAEP_PADDING
للطول الإضافي.
crypto.privateEncrypt(privateKey, buffer)
أضيف في الإصدار: v1.1.0.
privateKey
: <Object> | <string>key
:<string> مفتاحٌ خاص مُرمَّز بالترميز PEM.passphrase
: <string> عبارة مرور اختيارية للمفتاح key الخاص.padding
: <crypto.constants> قيمة حشوة إضافية معرَّفة في الثوابتcrypto.constants
والتي يمكن أن تكون:crypto.constants.RSA_NO_PADDING
، أوcrypto.constants.RSA_PKCS1_PADDIN
.buffer
: <Buffer> | <TypedArray> | <DataView>- القيم المعادة: <Buffer> كائن جديد من النوع
Buffer
يحوي المحتويات الوسيطbuffer
المعطى بعد تشفيرها.
يشفِّر هذا التابع محتويات الوسيط buffer
المعطى باستعمال المفتاح privateKey
. يمكن أن يكون الوسيط privateKey
كائنًا أو سلسلةً نصيةً. إن كان سلسلة نصية، فسيُعامَل وكأنه المفتاح المعطى بدون عبارة مرور (passphrase) وستُستعمَل القيمة RSA_PKCS1_PADDING
للحاشية.
crypto.publicDecrypt(key, buffer)
أضيف في الإصدار: v1.1.0.
key
: <Object> | <string>buffer
: <Buffer> | <TypedArray> | <DataView>- القيم المعادة: <Buffer> كائن جديد من النوع
Buffer
يحوي المحتويات الوسيطbuffer
المعطى بعد فك تشفيرها.
يفك هذا التابع تشفير محتويات الوسيط buffer
المعطى باستعمال المفتاح key
. يمكن أن يكون الوسيط key
كائنًا أو سلسلة نصية. إن كان سلسلة نصية، فسيُعامَل وكأنه المفتاح المعطى بدون عبارة مرور (passphrase) وسيُستعمَل القيمة RSA_PKCS1_PADDING
للحاشية. لما كان بالإمكان اشتقاق المفاتيح RSA العامة من المفاتيح الخاصة، فيمكن بناءً على ذلك تمرير مفتاح خاص عوضًا عن مفتاح عام.
crypto.publicEncrypt(key, buffer)
أضيف في الإصدار: v0.11.14.
key
: <Object> | <string>key
: <string> مفتاحٌ عام أو خاص مُرمَّز بالترميز PEM.passphrase
: <string> عبارة مرور اختيارية للمفتاح key الخاص.padding
: <crypto.constants> قيمة حاشية إضافية مُعرَّفَة في الثوابتcrypto.constants
والتي يمكن أن تكون:crypto.constants.RSA_NO_PADDING
، أوcrypto.constants.RSA_PKCS1_PADDING
، أوRSA_PKCS1_OAEP_PADDIN
.
buffer
: <Buffer> | <TypedArray> | <DataView>- القيم المعادة: <Buffer> كائن جديد من النوع
Buffer
يحوي المحتويات الوسيطbuffer
المعطى بعد تشفيرها.
يفك هذا التابع تشفير محتويات الوسيط buffer
المعطى باستعمال المفتاح key
. يمكن أن يكون الوسيط key
كائنًا أو سلسلة نصية. إن كان سلسلة نصية، فسيُعامَل وكأنه المفتاح المعطى بدون عبارة مرور (passphrase) وستُستعمَل القيمة RSA_PKCS1_PADDING
للحاشية. لما كان بالإمكان اشتقاق المفاتيح RSA العامة من المفاتيح الخاصة، فيمكن بناءً على ذلك تمرير مفتاح خاص عوضًا عن مفتاح عام.
crypto.randomBytes(size[, callback])
الإصدار | التغييرات |
---|---|
v9.0.0 | يؤدي تمرير القيمة null إلى الوسيط callback إلى رمي الخطأ ERR_INVALID_CALLBACK .
|
v0.5.8 | أضيف هذا التابع. |
size
: <number>callback
: <Function>- القيم المعادة: <Buffer> كائنٌ من النوع
Buffer
إن لم تُعطَ الدالةcallback
.
يولِّد هذا التابع بيانات ذات تشفير جيد وشبه عشوائية. يحدد الوسيط size
عدد البايتات المراد توليدها. إن أعطيت الدالة callback
، فستُولَّد البايتات بشكل غير متزامن وستستدعى الدالة callback
مع الوسيطين: err
، و buf
. إن حصل أي خطأ، فسيكون الوسيط err
كائنًا من النوع Error
؛ خلا ذلك، ستكون قيمته null
. أما الوسيط buf
، فهو كائنٌ من النوع Buffer
يحوي البايتات المولدة.
// توليد البايتات بشكل غير متزامن
const crypto = require('crypto');
crypto.randomBytes(256, (err, buf) => {
if (err) throw err;
console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`);
});
أما إن لم تُعطَ الدالة callback
، فستُولَّد البايتات بشكل متزامن وتعاد في كائن من النوع Buffer
. سيُرمَى خطأٌ إن حصل أي خطأ أثناء عملية توليد البايتات.
// توليد البايتات بشكل متزامن
const buf = crypto.randomBytes(256);
console.log(
`${buf.length} bytes of random data: ${buf.toString('hex')}`);
انتبه إلى أنَّ التابع crypto.randomBytes()
لن يكمل عملية التوليد حتى تكون العشوائية (entropy) كافية. لا يجب أن يستغرق هذا أكثر من بضعة أجزاء من الميلي ثانية. الوقت الوحيد الذي قد تستغرق فيه الدالة أطول فترة يمكن أن تتخيلها لتوليد البايتات العشوائية هي بعد الإقلاع حقيقةً؛ أي في الفترة التي لا يزال فيها مقياس العشوائية في النظام بأكمله منخفضًا. انتبه إلى أنَّ الواجهة البرمجية هذه تستعمل مجمع الخيوط الخاص بالمكتبة libuv التي يكون لها آثارًا مفاجئة وسلبية على الأداء لبعض التطبيقات. راجع القسم UV_THREADPOOL_SIZE=size
في توثيق «خيارات سطر الأوامر في Node.js» لمزيد من التفاصيل. ينفَّذ الإصدار غير المتزامن من التابع crypto.randomBytes()
في طلب مجمع خيط وحيد (single threadpool request). إن أردت تقليل التغيير في طول مهمة مجمع الخيط، فَاعْمَل على تجزئة الطلبات randomBytes
الكبيرة عند تنفيذ ذلك بوصفه جزءًا من عملية إنجاز طلبٍ لعميل.
crypto.randomFillSync(buffer[, offset][, size])
الإصدار | التغييرات |
---|---|
v9.0.0 | أصبح بالإمكان أن يكون الوسيط buffer كانئًا من النوع TypedArray أو DataView .
|
v7.10.0 | أضيف هذا التابع. |
buffer
: <Buffer> | <TypedArray> | <DataView>يجب أن يعطى هذا الوسيط.offset
: <number> القيمة الافتراضية هي: 0size
: <number> القيمة الافتراضية هي:buffer.length - offset
.- القيم المعادة: <Buffer> | <TypedArray> | <DataView> الكائن المعطى في الوسيط
buffer
.
يمثل هذا التابع الإصدار المتزامن من التابع crypto.randomFill()
.
const buf = Buffer.alloc(10);
console.log(crypto.randomFillSync(buf).toString('hex'));
crypto.randomFillSync(buf, 5);
console.log(buf.toString('hex'));
// :كل ما سبق مماثل تمامًا لما يلي
crypto.randomFillSync(buf, 5, 5);
console.log(buf.toString('hex'));
يمكن الآن أن يكون الوسيط buffer
كائنًا من النوع TypedArray
أو DataView
:
const a = new Uint32Array(10);
console.log(Buffer.from(crypto.randomFillSync(a).buffer,
a.byteOffset, a.byteLength).toString('hex'));
const b = new Float64Array(10);
console.log(Buffer.from(crypto.randomFillSync(b).buffer,
b.byteOffset, b.byteLength).toString('hex'));
const c = new DataView(new ArrayBuffer(10));
console.log(Buffer.from(crypto.randomFillSync(c).buffer,
c.byteOffset, c.byteLength).toString('hex'));
crypto.randomFill(buffer[, offset][, size], callback)
الإصدار | التغييرات |
---|---|
v9.0.0 | أصبح بالإمكان أن يكون الوسيط buffer كانئًا من النوع TypedArray أو DataView .
|
v7.10.0 | أضيف هذا التابع. |
buffer
: <Buffer> | <TypedArray> | <DataView>يجب أن يعطى هذا الوسيط.offset
: <number> القيمة الافتراضية هي: 0size
: <number> القيمة الافتراضية هي:buffer.length - offset
.callback
: <Function> دالة من الشكلfunction(err, buf) {}
.
هذا التابع مماثل تمامًا للتابع crypto.randomBytes()
باستثناء أنه يتطلب أن يكون الوسيط الأول المُمرَّر إليها كائنًا من النوع Buffer
الذي يراد ملؤه. أضف إلى ذلك أنه يتطلب أيضًا تمرير دالة رد نداء (callback). إن لم تعطَ الدالة callback
، فسيُرمى خطأٌ.
const buf = Buffer.alloc(10);
crypto.randomFill(buf, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
crypto.randomFill(buf, 5, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
// :كل ما سبق مماثل تمامًا لما يلي
crypto.randomFill(buf, 5, 5, (err, buf) => {
if (err) throw err;
console.log(buf.toString('hex'));
});
يمكن الآن أن يكون الوسيط buffer
كائنًا من النوع TypedArray
أو DataView
:
const a = new Uint32Array(10);
crypto.randomFill(a, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
.toString('hex'));
});
const b = new Float64Array(10);
crypto.randomFill(b, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
.toString('hex'));
});
const c = new DataView(new ArrayBuffer(10));
crypto.randomFill(c, (err, buf) => {
if (err) throw err;
console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
.toString('hex'));
});
انتبه إلى أنَّ الواجهة البرمجية هذه تستعمل مجمع الخيوط الخاص بالمكتبة libuv التي يكون لها آثارًا مفاجئة وسلبية على الأداء لبعض التطبيقات. راجع القسم UV_THREADPOOL_SIZE=size
في توثيق «خيارات سطر الأوامر في Node.js» لمزيد من التفاصيل. ينفَّذ الإصدار غير المتزامن من التابع crypto.randomFill()
في طلب مجمع خيط وحيد (single threadpool request). إن أردت تقليل التغيير في طول مهمة مجمع الخيط، فَاعْمَل على تجزئة الطلبات randomFill
الكبيرة عند تنفيذ ذلك بوصفه جزءًا من عملية إنجاز طلبٍ لعميل.
crypto.scrypt(password, salt, keylen[, options], callback)
الإصدار | التغييرات |
---|---|
v10.9.0 | أضيفت أسماء الخيارات التالية: cost ، و blockSize ، و parallelization .
|
v10.5.0 | أضيف هذا التابع. |
password
: <string> | <Buffer> | <TypedArray> | <DataView>salt
: <string> | <Buffer> | <TypedArray> | <DataView>keylen
: <number>options
: <Object>cost
: <number> معامل يحدد المقدار المطلوب من الذاكرة أو المعالج. يجب أن يكون من مضاعفات العدد 2n، إذ n هو 1، أو 2، ...إلخ.N
: <number> معامل يحدد المقدار المطلوب من الذاكرة أو المعالج. يجب أن يكون من مضاعفات العدد 2n، إذ n هو 1، أو 2، ...إلخ. القيمة الافتراضية هي: 16384.blockSize
: <number> معامل حجم الكتلة (block size). القيمة الافتراضية هي: 8.parallelization
: <number> معامل التوازي (Parallelization parameter). القيمة الافتراضية هي: 1.N
: <number> اسمٌ بديل للمعاملcost
. يجب تحديد أحدهما فقط.r
: <number> اسمٌ بديل للمعاملblockSize
. يجب تحديد أحدهما فقط.p
: <number> اسمٌ بديل للمعاملparallelization
. يجب تحديد أحدهما فقط.maxmem
: <number> الحد الأعلى للذاكرة. يجب أن تكون (تقريبًا)128 * N * r > maxmem
. القيمة الافتراضية هي: 32 * 1024 * 1024.
callback
: <Function>err
: <Error>derivedKey
: <Buffer>
يوفر هذا التابع تنفيذًا غير متزامن للدالة scrypt
. الدالة scrypt
هي دالة اشتقاق مفتاح يعتمد على كلمة سر صُمِّمَت خصيصًا لتكون ذات قدرة حسابية كبيرة واستهلاك ذكي للذاكرة لكي لا تحقق أية هجمات شرسة غايتها. يجب أن تكون قيمة الوسيط salt
فريدةً قدر الإمكان. يوصى أيضًا أن تكون قيمة salt
عشوائية ولا يقل طولها عن 10 بايت. ارجع إلى المستند NIST SP 800-132 لمزيد من التفاصيل. تُستدعَى الدالة callback
مع الوسيطين err
، و derivedKey
. يكون الوسيط err
كائنَ استثناء عند فشل اشتقاق المفتاح وإلا ستكون قيمته null
. يُمرَّر الوسيط derivedKey
إلى دالة رد النداء ككائن من النوع Buffer
. يُرمَى استثناءٌ إن كانت قيمة أو نوع أحد الوسائط الممررة غير صالحة.
const crypto = require('crypto');
// استعمال القيم الافتراضية
crypto.scrypt('secret', 'salt', 64, (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae'
});
// N استعمال قيمة مخصصة للمعامل
crypto.scrypt('secret', 'salt', 64, { N: 1024 }, (err, derivedKey) => {
if (err) throw err;
console.log(derivedKey.toString('hex')); // '3745e48...aa39b34'
});
crypto.scryptSync(password, salt, keylen[, options])
الإصدار | التغييرات |
---|---|
v10.9.0 | أضيفت أسماء الخيارات التالية: cost ، و blockSize ، و parallelization .
|
v10.5.0 | أضيف هذا التابع. |
password
: <string> | <Buffer> | <TypedArray> | <DataView>salt
: <string> | <Buffer> | <TypedArray> | <DataView>keylen
: <number>options
: <Object>cost
: <number>معامل يحدد المقدار المطلوب من الذاكرة أو المعالج. يجب أن يكون من مضاعفات العدد 2n، إذ n هو 1، أو 2، ...إلخ.N
: <number> معامل يحدد المقدار المطلوب من الذاكرة أو المعالج. يجب أن يكون من مضاعفات العدد 2n، إذ n هو 1، أو 2، ...إلخ. القيمة الافتراضية هي: 16384.blockSize
: <number>معامل حجم الكتلة (block size). القيمة الافتراضية هي: 8.parallelization
: <number> معامل التوازي (Parallelization parameter). القيمة الافتراضية هي: 1.N
: <number>اسمٌ بديل للمعاملcost
. يجب تحديد أحدهما فقط.r
: <number>اسمٌ بديل للمعاملblockSize
. يجب تحديد أحدهما فقط.p
: <number>اسمٌ بديل للمعاملparallelization
. يجب تحديد أحدهما فقط.maxmem
: <number>الحد الأعلى للذاكرة. يجب أن تكون (تقريبًا)128 * N * r > maxmem
. القيمة الافتراضية هي: 32 * 1024 * 1024.
callback
: <Function>- القيم المعادة: <Buffer>
يوفر هذا التابع تنفيذًا متزامنًا للدالة scrypt
. الدالة scrypt
هي دالة اشتقاق مفتاح يعتمد على كلمة سر صُمِّمَت خصيصًا لتكون ذات قدرة حسابية كبيرة واستهلاك ذكي وواسع للذاكرة لكي لا تحقق أية هجمات شرسة غايتها. يجب أن تكون قيمة الوسيط salt فريدةً قدر الإمكان. يُوصَى أيضًا أن تكون قيمة salt عشوائية ولا يقل طولها عن 10 بايت. ارجع إلى المستند NIST SP 800-132 لمزيد من التفاصيل. يرمى استثناءٌ إن كانت قيمة أو نوع أحد الوسائط الممررة غير صالح.
const crypto = require('crypto');
// استخدام القيم الافتراضية
const key1 = crypto.scryptSync('secret', 'salt', 64);
console.log(key1.toString('hex')); // '3745e48...08d59ae'
// N استعمال قيمة مخصصة للمعامل
const key2 = crypto.scryptSync('secret', 'salt', 64, { N: 1024 });
console.log(key2.toString('hex')); // '3745e48...aa39b34'
crypto.setEngine(engine[, flags])
أضيف في الإصدار: v0.11.11.
engine
: <string>flags
: <crypto.constants> القيمة الافتراضية هي:crypto.constants.ENGINE_METHOD_ALL
.
تحمل هذه الدالة وتضبط الوسيط engine
لبعض أو جميع دوال OpenSSL (المحددة عبر الوسيط flags
). يمكن أن يكون الوسيط engine
إما مُعرِّفًا (id) أو مسارًا لمكتبة المحرك المشتركة. الوسيط flags هو حقل بِتِّي (bit field)، وقيمته الافتراضية هي ENGINE_METHOD_ALL
. يمكن أن يأخذ رايةً واحدةً أو مزيجًا من الرايات التالية (المعرَّفة في 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
الرايات التالية قد أهملت في الإصدار OpenSSL-1.1.0:
crypto.constants.ENGINE_METHOD_ECDH
crypto.constants.ENGINE_METHOD_ECDSA
crypto.constants.ENGINE_METHOD_STORE
crypto.setFips(bool)
أضيف في الإصدار: v10.0.0.
bool
: <boolean> إن أعطيت القيمةtrue
فسيُفعَّل الوضع FIPS.
يفعِّل هذا التابع الوضع FIPS المتوافق مع مزوِّد التشفير (crypto provider) في الإصدار Node.js المبني مع تمكين FIPS. سيُرمى خطأٌ إن لم يكن الوضع FIPS متاحًا.
crypto.timingSafeEqual(a, b)
أضيف في الإصدار: v6.6.0.
a
: <Buffer> | <TypedArray> | <DataView>b
: <Buffer> | <TypedArray> | <DataView>- القيم المعادة: <boolean>
يعتمد هذا التابع على إحدى خوارزميات الوقت الثابت (constant-time algorithm). تعيد القيمة true
إن كان الوسيط a
مساويًا للوسيط b
دون تسريب معلومات التوقيت التي ستسمح للمهاجم باستنتاج قيمة ما. هذا التابع مناسب للموازنة بين القيم HMAC أو القيم السرية مثل الكعكات المتعلقة بالمصادقة أو العناوين url الخارقة (capability urls). يجب أن يكون كلا الوسيطين a
و b
من النوع Buffer
، أو TypedArray
، أو DataView
، ويجب أيضًا أن يكون لهما الطول نفسه. لا يضمن استعمال التابع crypto.timingSafeEqual
أن تكون الشيفرة المحيطة ذات توقيت آمن (timing-safe). يجب أخذ الحيطة والحذر للتأكد من أنَّ الشيفرة المحيطة لا تخلق نقاط ضعف من ناحية التوقيت.
ملاحظات
واجهات المجاري البرمجية الإرثية (Legacy Streams API) قبل الإصدار Node.js v0.10
أضيفت الوحدة Crypto
إلى Node.js قبل ظهور مصطلح واجهة مجرى موحَّد برمجية (unified Stream API)، وحتى قبل وجود الكائنات Buffer
التي تُستعمَل في التعامل مع البيانات الثنائية. بناءً على ذلك، امتلكت الأصناف crypto
المُعرَّفة آنذاك توابع لم توجد في أصناف أخرى تنفذ واجهة المجاري البرمجية (مثل update()
، أو final()
، أو digest()
). أضف إلى ذلك، أغلب التوابع قبلت وأعادت سلاسل نصية مرمَّزة بالترميز 'latin1'
بشكل افتراضي بدلًا من الكائنات Buffer
. هذا السلوك الافتراضي تغيَّر بعد الإصدار Node.js v0.8 إلى استعمال الكائنات Buffer
افتراضيًّا.
تغييرات الصنف ECDH
الحديثة
استعمال الصنف ECDH
مع أزواج من المفاتيح المولَّدة بشكل غير ديناميكي قد أصبح بسيطًا. يمكن الآن استدعاء التابع ecdh.setPrivateKey()
مع مفتاح خاص حُدِّد مسبقًا وسيُحسَب المفتاح العام المرتبط ثم يخزَّن في الكائن. هذا يسمح للشيفرة بتخزين وتوفير الجزء الخاص من زوج المفاتيح EC فقط. يتحقق التابع ecdh.setPrivateKey()
الآن أيضًا من كون المفتاح الخاص صالحًا للمنحني المحدد. أصبح التابع ecdh.setPublicKey()
الآن مهملًا، إذ أنَّ إدراجه ضمن واجهة برمجية لم يكن مفيدًا. يجب إمَّا أن يعيَّن المفتاح الخاص الذي خُزِّن مسبقًا لتوليد المفتاح العام المرتبط به تلقائيًّا، أو استدعاء التابع ecdh.generateKeys()
. العقبة الرئيسية في استعمال التابع ecdh.setPublicKey()
هي أنه يمكن استعماله لوضع زوج المفاتيح ECDH
في حالة غير ثابتة (inconsistent state).
دعم الخوارزميات الضعيفة والخطرة
لا زالت الوحدة crypto
تدعم بعض الخوارزميات التي تُعدُّ خطرة وتحوي ثغرات والتي لا يُنصَح باستعمالها مطلقًا في الوقت الحالي. تسمح الواجهة البرمجية أيضًا باستعمال عمليات التشفير وحساب hash مع مفاتيح صغيرة الحجم تعدُّ ضعيفةً للغاية وغير آمنة. يجب على المستخدمين أن يأخذوا على عاتقهم مسؤولية اختيار خوارزمية تشفير وحجم مفتاح بما يتطابق مع متطلبات الأمان التي يحتاجونها. بناءً على التوصيات المشار إليها في المستند NIST SP 800-131A:
- لم يعد يُقبَل باستعمال الخوارزمية MD5 و SHA1 في المواقع التي لا يجب أن يحصل فيها أي تضارب مثل التواقيع الرقمية.
- يوصى بأن لا يقل حجم المفتاح المستعمل مع الخوارزميات RSA، و DSA، و DH عن 2048 بت، والذي للمنحني ECDSA و ECDH لا يقل أيضًا عن 244 بت في حال أريد استعماله بشكل آمن لعدة سنوات.
- تملك مجموعات DH التي تخص
modp1
، وmodp2
، وmodp5
حجم مفتاح أصغر من 2048 ولا يوصى باستعمالها.
ألقِ نظرة على المستند الذي أشرنا إليه آنفًا للاطلاع على المزيد من التوصيات والتفاصيل.
الوضع CCM
الوضع CCM هو أحد الخوارزميات AEAD المدعومة. يجب على التطبيقات التي تستعمل هذا الوضع أن تلتزم بقيود معينة عند استعمال واجهة التشفير البرمجية وهي:
- يجب تحديد طول بطاقة المصادقة أثناء إنشاء عملية التشفير عبر ضبط الخيار
authTagLength
، ويجب أن يكون أحد القيم التالية: 4، أو 6، أو 8، أو 10، 12، أو 14، أو 16 بايت. - يجب أن يتراوح طول المتغير الأولي (initialization vector)
N
بين 7 و 13 بايت؛ أي7 ≤ N ≤ 13
. - يجب أن يحدد طول النص المجرد (plaintext) إلى القيمة 2 ** (8 * (15 - N)) بايت.
- عند فك التشفير، يجب ضبط بطاقة المصادقة عبر
setAuthTag()
قبل تحديد بيانات موثوقة إضافية أو استدعاءupdate()
. خلا ذلك، ستفشل عملية فك التشفير وسيرميfinal()
خطأً يتطابق مع الفقرة 2.6 في المعيار RFC 3610. - قد يؤدي استعمال توابع الصنف
stream
، مثل التابعwrite(data)
، أو التابعend(data)
، أوpipe()
، في الوضع CCM إلى فشلها، إذ لا يستطيع الوضع CCM معالجة أكثر من قطعة واحدة من البيانات لكل نسخة. - عند تمرير بيانات موثوقة إضافية (AAD، اختصارٌ للعبارة additional authenticated data)، يجب أن يُمرَّر طول الرسالة الفعلية بالبايت إلى
setAAD()
عبر الخيارplaintextLength
. هذا الامر ليس ضروريًّا إن لم تُستعمَل بيانات موثوقة إضافية. - بما أن الوضع CCM يعالج الرسالة بأكملها في الوقت نفسه، فلا يمكن استدعاء التابع update() سوى مرةً واحدةً فقط.
- رغم أنَّ استدعاء
update()
كافٍ لتشفير أو فك تشفير الرسالة إلا أنه يجب استدعاءfinal()
لحساب أو التحقق من بطاقة المصادقة.
const crypto = require('crypto');
const key = 'keykeykeykeykeykeykeykey';
const nonce = crypto.randomBytes(12);
const aad = Buffer.from('0123456789', 'hex');
const cipher = crypto.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 = crypto.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) {
console.error('Authentication failed!');
}
console.log(receivedPlaintext);
ثوابت الوحدة Crypto
يمكن تصدير الثوابت التالية باستدعاء crypto.constants
التي يمكن تطبيقها واستعمالها في أماكن متعددة في الوحدات crypto
، و tls
، و https
وعلى وجه الخصوص في OpenSSL.
خيارات OpenSSL
الثابت | الوصف |
---|---|
SSL_OP_ALL
|
يطبِّق حلول متعددة لخطأ ضمن OpenSSL. للمزيد من التفاصيل، ألقِ نظرة على هذا التوثيق. |
SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION
|
يسمح بإعادة عملية التفاوض الإرثية غير الآمنة (legacy insecure renegotiation) بين OpenSSL والعملاء أو الخوادم غير المحمية. |
SSL_OP_CIPHER_SERVER_PREFERENCE
|
يحاول استعمال أولويات الخادم بدلًا من العميل عند تحديد عملية التشفير. للمزيد من التفاصيل، ألقِ نظرة على هذا التوثيق |
SSL_OP_CISCO_ANYCONNECT
|
يوجه OpenSSL لاستعمال الإصدار «speshul» من DTLS_BAD_VER من Cisco. |
SSL_OP_COOKIE_EXCHANGE
|
يوجه OpenSSL لتشغيل عملية تبادل الكعكات (cookie exchange). |
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_EPHEMERAL_RSA
|
يوجه OpenSSL لاستعمال المفتاح tmp_rsa دومًا عند تنفيذ العملية RSA. |
SSL_OP_LEGACY_SERVER_CONNECT
|
يسمح باتصال مبدئي مع الخوادم التي لا تدعم RI. |
SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER
|
|
SSL_OP_MICROSOFT_SESS_ID_BUG
|
|
SSL_OP_MSIE_SSLV2_RSA_PADDING
|
يوجه OpenSSL لتعطيل الحل البديل لثغرة بروتوكول الوسيط (man-in-the-middle protocol-version vulnerability) في تنفيذ الخادم SSL 2.0. |
SSL_OP_NETSCAPE_CA_DN_BUG
|
|
SSL_OP_NETSCAPE_CHALLENGE_BUG
|
|
SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG
|
|
SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG
|
|
SSL_OP_NO_COMPRESSION
|
يوجه OpenSSL لتعطيل دعم ضغط SSL/TLS. |
SSL_OP_NO_SSLv2
|
|
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 لتعطيل استعمال بطاقات ( tickets) 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_PKCS1_CHECK_1
|
|
SSL_OP_PKCS1_CHECK_2
|
|
SSL_OP_SINGLE_DH_USE
|
يوجه OpenSSL لإنشاء مفتاح جديد دومًا عند استعمال المعاملات DH المؤقتة أو سريعة الزوال (temporary/ephemeral). |
SSL_OP_SINGLE_ECDH_USE
|
يوجه OpenSSL لإنشاء مفتاح جديد دومًا عند استعمال المعاملات ECDH المؤقتة أو سريعة الزوال (temporary/ephemeral). |
SSL_OP_SSLEAY_080_CLIENT_DH_BUG
|
|
SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG
|
|
SSL_OP_TLS_BLOCK_PADDING_BUG
|
|
SSL_OP_TLS_D5_BUG
|
|
SSL_OP_TLS_ROLLBACK_BUG
|
يوجه OpenSSL لتعطيل اكتشاف هجوم استعادة الإصدار السابق (version rollback attack). |
ثوابت محرك 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_METHDS. |
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
|
|
ALPN_ENABLED
|
|
RSA_PKCS1_PADDING
|
|
RSA_SSLV23_PADDING
|
|
RSA_NO_PADDING
|
|
RSA_PKCS1_OAEP_PADDING
|
|
RSA_X931_PADDING
|
|
RSA_PKCS1_PSS_PADDING
|
|
RSA_PSS_SALTLEN_DIGEST
|
يضبط الطول الإضافي (salt) الذي يخص RSA_PKCS1_PSS_PADDING إلى حجم قيمة hash عند التوقيع أو التحقق.
|
RSA_PSS_SALTLEN_MAX_SIGN
|
يضبط الطول الإضافي (salt) الذي يخص RSA_PKCS1_PSS_PADDING إلى أكبر قيمة مسموحة عند التوقيع أو التحقق.
|
RSA_PSS_SALTLEN_AUTO
|
تعمل على جعل الطول الإضافي الذي يخص RSA_PKCS1_PSS_PADDING يحدد تلقائيًّا عند التوقيع أو التحقق.
|
POINT_CONVERSION_COMPRESSED
|
|
POINT_CONVERSION_UNCOMPRESSED
|
|
POINT_CONVERSION_HYBRID
|
ثوابت الوحدة crypto في Node.js
الثابت | الوصف |
---|---|
defaultCoreCipherList
|
يحدد قائمة التشفير الافتراضية الضمنيَّة التي تستعملها Node.js. |
defaultCipherList
|
تحدد قائمة التشفيرالافتراضية الفعالة التي تستعملها عملية Node.js الحالية. |