استخدام Discourse كمزود حساب ومشاكل PBKDF2

مرحباً. هذا سؤال غبي على الأرجح، لكننا نقوم بترحيل منتدانا من XenForo إلى Discourse. لدينا خادم خلفي للمصادقة يتضمن الاتصال بقاعدة البيانات والتحقق من بيانات الاعتماد مقابل جدول المستخدمين.

خوارزمية bcrypt الخاصة بـ XenForo عملت كما هو متوقع، ودون أي متاعب. عندما انتقلنا إلى Discourse، ومع ذلك، لم تبدو خوارزمية PBKDF2 متوافقة مع توقعاتي. نفس كلمة المرور بالضبط، نفس الملح بالضبط، نفس عدد التكرارات والطول بالضبط، ولكن تجزئة الإخراج مختلفة.

لقد جربت تطبيقات مختلفة لخوارزمية PBKDF2، لكنها جميعًا تنتج نفس التجزئة (المختلفة عن Discourse). بما في ذلك تطبيقي الخاص.
أفضل تجنب آليات مثل OAuth2 أو SSO بسبب الحمل الإضافي والعمل الإضافي الذي تفرضه علينا.

هل استخدم أي شخص Discourse لمثل هذه الحالات، وإذا كان الأمر كذلك، كيف قمت بحل هذه المشكلة؟

هل تستخدم إضافة ترحيل كلمة المرور؟

لا، على الأقل ليس حسب علمي. هل تتحدث عن هذا؟

إعجاب واحد (1)

هل جربت تطبيق openssl؟ هذا ما نستخدمه (يمكنك رؤيته في discourse/lib/pbkdf2.rb).

كمثال، بعد تعيين كلمة مرور المستخدم إلى swordfish#:

discourse_development=# select password_hash, salt, password_algorithm from users where id=2;
-[ RECORD 1 ]------+-----------------------------------------------------------------
password_hash      | 67650523776bdc87ebcd2fc11719553c87b11e6c4da49806d9d5232460d2adc9
salt               | 712ef44dd6fe6d6f0f1b6f702bb78459
password_algorithm | $pbkdf2-sha256$i=600000,l=32$
$ openssl kdf \
  -kdfopt pass:'swordfish#' \
  -kdfopt salt:712ef44dd6fe6d6f0f1b6f702bb78459  \
  -kdfopt digest:SHA2-256 \
  -kdfopt iter:600000 \
  -keylen 32 \
  PBKDF2 \
  | tr -d : | tr '[:upper:]' '[:lower:]'
67650523776bdc87ebcd2fc11719553c87b11e6c4da49806d9d5232460d2adc9
إعجاب واحد (1)

لقد استخدمنا بشكل أساسي تطبيق crypto/bcrypt الخاص بـ Go لـ Xenforo. نفس التجزئات من تطبيقات خوارزميات pbkdf2 المختلفة تشير لي إلى أن Go ربما يخزن السلاسل أو يحول السلاسل إلى بايتات بطريقة مختلفة إلى حد ما.

سيتعين علي تجربة ذلك غدًا (الوقت متأخر هنا). إذا أعطاني OpenSSL النتيجة المرجوة، فسيتعين علي البحث عن روابط OpenSSL لـ Go، أو سيتعين علي التبديل إلى لغة مختلفة تمامًا (لديها روابط OpenSSL) للواجهة الخلفية.

هل لديك حالة اختبار قصيرة؟

على سبيل المثال، إذا استخدمت المعلومات أعلاه، فماذا تحصل؟

إعجاب واحد (1)

عذرًا، أنا لست في وضع يسمح لي بإخبارك بذلك حاليًا لأن المناطق الزمنية مزعجة. الوقت متأخر جدًا هنا ولا يمكنني فعل ذلك إلا في اليوم التالي.

لقد فعلت كما طلبت. كلمة المرور هي swordfish#98765.

إدخال قاعدة البيانات:

discourse=> SELECT password_hash, salt, password_algorithm FROM users WHERE id=1;
                          password_hash                           |               salt               |      password_algorithm
------------------------------------------------------------------+----------------------------------+-------------------------------
 db3f0829e66336323e81110a1792a76000b9c60605e1fa6964797ea1b07c33c6 | 0d079078e220158011afaf497794166d | $pbkdf2-sha256$i=600000,l=32$
(1 row)

OpenSSL:

/var/discourse# openssl kdf \
> -kdfopt pass:'swordfish#98765' \
> -kdfopt salt:0d079078e220158011afaf497794166d \
> -kdfopt digest:SHA2-256 \
> -kdfopt iter:600000 \
> -keylen 32 \
> PBKDF2 \
> | tr -d : | tr '[:upper:]' '[:lower:]'
db3f0829e66336323e81110a1792a76000b9c60605e1fa6964797ea1b07c33c6

كود Go:

var userId int
var hash string
var salt string
var active bool

row := s.Database.QueryRow(`
	SELECT u.id, u.password_hash, u.salt, u.active
	FROM users AS u
	INNER JOIN user_emails AS ue ON u.id = ue.user_id
	WHERE ue.email = $1;`,
email,
)

if err := row.Scan(&userId, &hash, &salt, &active); err != nil {
	// error handling...
}

hashBytes, err := hex.DecodeString(hash)
if err != nil {
	// error handling...
}

saltBytes, err := hex.DecodeString(salt)
if err != nil {
	// error handling...
}

key := pbkdf2.Key([]byte(password), saltBytes, 600000, 32, sha256.New)

fmt.Printf("salt: %v\n", salt)
fmt.Printf("hash: %v\n", hash)
fmt.Printf("hex.EncodeToString(key): %v\n", hex.EncodeToString(key))

مخرجات الكود أعلاه:

salt: 0d079078e220158011afaf497794166d
hash: db3f0829e66336323e81110a1792a76000b9c60605e1fa6964797ea1b07c33c6
hex.EncodeToString(key): b378c12d96ac62a6099fc674d334f0793e6294f7927da0badc811e794a960802

لا بأس. كان علي استخدام التمثيل الست عشري للملح كوسيطة، وليس الملح المفكوك كما كنت أفعل في المنشور أعلاه. الآن الهاش متساوٍ.

5 إعجابات

كانت هذه نظريتي أيضًا! لقد ارتكبت نفس الخطأ في البداية.

إعجاب واحد (1)

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.