
تشفير الملفات بشفافية في git
يمكّن git-crypt من تشفير وفك تشفير الملفات بشفافية في مستودع git. يتم تشفير الملفات التي تختار حمايتها عند الالتزام (commit)، وفك تشفيرها عند السحب (checkout). يسمح لك git-crypt بمشاركة مستودع بحرية يحتوي على مزيج من المحتوى العام والخاص. يتدهور أداء git-crypt بلطف، بحيث يمكن للمطورين الذين ليس لديهم المفتاح السري الاستمرار في استنساخ (clone) والالتزام (commit) بمستودع يحتوي على ملفات مشفرة. يتيح لك هذا تخزين موادك السرية (مثل المفاتيح أو كلمات المرور) في نفس مستودع الكود الخاص بك، دون الحاجة إلى قفل المستودع بأكمله.
تم كتابة git-crypt بواسطة Andrew Ayer ([email protected]). لمزيد من المعلومات، راجع https://www.agwa.name/projects/git-crypt.
راجع ملف INSTALL.md.
قم بتكوين مستودع لاستخدام git-crypt:
cd repo
git-crypt init
حدد الملفات المراد تشفيرها عن طريق إنشاء ملف .gitattributes:
secretfile filter=git-crypt diff=git-crypt
*.key filter=git-crypt diff=git-crypt
secretdir/** filter=git-crypt diff=git-crypt
مثل ملف .gitignore، يمكنه مطابقة أنماط البدل (wildcards) ويجب تسجيله في المستودع. راجع أدناه لمزيد من المعلومات حول .gitattributes. تأكد من عدم تشفير ملف .gitattributes نفسه عن طريق الخطأ (أو ملفات git الأخرى مثل .gitignore أو .gitmodules). تأكد من أن قواعد .gitattributes موجودة قبل إضافة الملفات الحساسة، وإلا فلن يتم تشفير هذه الملفات!
شارك المستودع مع الآخرين (أو مع نفسك) باستخدام GPG:
git-crypt add-gpg-user USER_ID
يمكن أن يكون USER_ID معرف مفتاح، أو بصمة كاملة، أو عنوان بريد إلكتروني، أو أي شيء آخر يحدد بشكل فريد مفتاحًا عامًا لـ GPG (راجع "HOW TO SPECIFY A USER ID" في صفحة دليل gpg). ملاحظة: git-crypt add-gpg-user سيضيف ويلتزم (commit) بملف مفتاح مشفر بـ GPG في دليل .git-crypt في جذر مستودعك.
بدلاً من ذلك، يمكنك تصدير مفتاح سري متماثل، والذي يجب عليك توصيله بشكل آمن إلى المتعاونين (GPG غير مطلوب، ولا تتم إضافة أي ملفات إلى مستودعك):
git-crypt export-key /path/to/key
بعد استنساخ مستودع يحتوي على ملفات مشفرة، قم بفتح القفل باستخدام GPG:
git-crypt unlock
أو باستخدام مفتاح متماثل:
git-crypt unlock /path/to/key
هذا كل ما عليك فعله - بعد إعداد git-crypt (إما باستخدام
git-crypt init أو git-crypt unlock)، يمكنك استخدام git بشكل طبيعي -
يتم التشفير وفك التشفير بشفافية.
أحدث إصدار من git-crypt هو 0.8.0، وتم إصداره في 2025-09-23. يهدف git-crypt إلى أن يكون خاليًا من الأخطاء وموثوقًا، مما يعني أنه لا ينبغي أن يتعطل أو يحدث خللًا أو يكشف بياناتك السرية. ومع ذلك، لم يصل بعد إلى مرحلة النضج، مما يعني أنه ليس موثقًا أو غنيًا بالميزات أو سهل الاستخدام كما ينبغي. بالإضافة إلى ذلك، قد تكون هناك تغييرات غير متوافقة مع الإصدارات السابقة تم تقديمها قبل الإصدار 1.0.
git-crypt أكثر أمانًا من أنظمة تشفير git الشفافة الأخرى. يقوم git-crypt بتشفير الملفات باستخدام AES-256 في وضع CTR مع IV اصطناعي مشتق من SHA-1 HMAC للملف. وضع التشغيل هذا آمن من الناحية الدلالية بشكل قابل للإثبات تحت هجوم النص العادي المحدد الحتمي (deterministic chosen-plaintext attack). وهذا يعني أنه على الرغم من أن التشفير حتمي (وهو مطلوب حتى يتمكن git من التمييز عندما يتغير ملف أو لا يتغير)، فإنه لا يسرب أي معلومات تتجاوز ما إذا كان ملفان متطابقين أم لا. الاقتراحات الأخرى لتشفير git الشفاف تستخدم ECB أو CBC مع IV ثابت. هذه الأنظمة ليست آمنة من الناحية الدلالية وتسرب المعلومات.
يعتمد git-crypt على مرشحات git، والتي لم يتم تصميمها مع مراعاة التشفير. على هذا النحو، فإن git-crypt ليس أفضل أداة لتشفير معظم أو كل الملفات في مستودع. حيث يتألق git-crypt حقًا عندما يكون معظم مستودعك عامًا، ولكن لديك بعض الملفات (ربما مفاتيح خاصة مسماة *.key، أو ملف يحتوي على بيانات اعتماد API) والتي تحتاج إلى تشفيرها. لتشفير مستودع كامل، فكر في استخدام نظام مثل git-remote-gcrypt بدلاً من ذلك. (ملاحظة: لا يتم تأييد أمان git-remote-gcrypt.)
لا يقوم git-crypt بتشفير أسماء الملفات أو رسائل الالتزام (commit) أو أهداف الارتباطات الرمزية (symlink targets) أو روابط git أو البيانات الوصفية الأخرى.
لا يخفي git-crypt وقت تغيير الملف أو عدم تغييره، أو طول الملف، أو حقيقة تطابق ملفين (راجع قسم "الأمان" أعلاه).
لا يدعم git-crypt إلغاء الوصول إلى مستودع مشفر تم منحه سابقًا. ينطبق هذا على وضع GPG متعدد المستخدمين (لا يوجد أمر del-gpg-user لاستكمال add-gpg-user) وكذلك وضع المفتاح المتماثل (لا يوجد دعم لتدوير المفتاح). وذلك لأنه مشكلة معقدة بطبيعتها في سياق البيانات التاريخية. على سبيل المثال، حتى إذا تم تدوير المفتاح في نقطة ما في التاريخ، لا يزال بإمكان المستخدم الذي لديه المفتاح السابق الوصول إلى تاريخ المستودع السابق. تمت مناقشة هذه المشكلة بمزيد من التفصيل في https://github.com/AGWA/git-crypt/issues/47.
الملفات المشفرة باستخدام git-crypt غير قابلة للضغط. حتى أصغر تغيير في ملف مشفر يتطلب من git تخزين الملف المتغير بالكامل، بدلاً من مجرد فرق (delta).
على الرغم من أن git-crypt يحمي محتويات الملفات الفردية باستخدام SHA-1 HMAC، إلا أنه لا يمكن استخدام git-crypt بشكل آمن ما لم يتم حماية المستودع بأكمله من العبث (المهاجم الذي يمكنه تحوير مستودعك يمكنه تغيير ملف .gitattributes الخاص بك لتعطيل التشفير). إذا لزم الأمر، استخدم ميزات git مثل العلامات الموقعة (signed tags) بدلاً من الاعتماد فقط على git-crypt للتكامل.
لا يمكن تطبيق التصحيحات (patches) على الملفات المشفرة باستخدام git-crypt باستخدام git-apply، ما لم يكن التصحيح نفسه مشفرًا. لإنشاء تصحيح مشفر، استخدم git diff --no-textconv --binary. بدلاً من ذلك، يمكنك تطبيق تصحيح نص عادي (plaintext) خارج git باستخدام أمر patch.
لا يعمل git-crypt بشكل موثوق مع بعض واجهات git الرسومية التابعة لجهات خارجية، مثل Atlassian SourceTree و GitHub for Mac. قد يتم ترك الملفات في حالة غير مشفرة.
يتم توثيق ملف .gitattributes في صفحة دليل gitattributes(5).
تنسيق نمط الملف هو نفسه المستخدم بواسطة .gitignore،
كما هو موثق في صفحة دليل gitignore(5)، مع استثناء أن تحديد مجرد دليل (مثل /dir/) ليس كافيًا لتشفير جميع الملفات الموجودة أسفله.
لاحظ أيضًا أن النمط dir/* لا يطابق الملفات الموجودة تحت الدلائل الفرعية لـ dir/. لتشفير شجرة فرعية كاملة dir/، استخدم dir/**:
dir/** filter=git-crypt diff=git-crypt
يجب ألا يتم تشفير ملف .gitattributes، لذا تأكد من أن أنماط البدل لا تطابقه عن طريق الخطأ. إذا لزم الأمر، يمكنك استبعاد .gitattributes من التشفير مثل هذا:
.gitattributes !filter !diff