سؤال

كنت أبحث عن خوارزمية فعالة التي يمكن أن تعطيني فكرة دقيقة عن مدى قوة كلمة المرور.

وجدت أن العديد من المواقع المختلفة باستخدام عدة خوارزميات مختلفة كما يمكنني الحصول على كلمة مرور مختلفة قوة التقييم في مواقع مختلفة.

هل كانت مفيدة؟

المحلول

لقد نمت هذه لبلدي تفريغ الدماغ العام لأفضل الممارسات للعمل مع كلمات المرور في PHP / ماي. الأفكار المطروحة هنا هي عموما ليست بلدي، ولكن أفضل ما وجدتها حتى الآن.


تأكد من أنك تستخدم SSL لكافة العمليات التي تتضمن معلومات المستخدم. وينبغي لجميع الصفحات التي تتضمن هذه الأشكال التحقق يتم استدعائهم عبر HTTPS، ورفض العمل على خلاف ذلك.

ويمكنك قضاء معظم الهجمات ببساطة عن طريق الحد من عدد عمليات تسجيل الدخول الفاشلة المسموح بها.

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

وتقديم فشل تسجيل الدخول للمستخدم يحتاج إلى فكر بعناية حتى لا تقدم معلومات إلى المهاجمين. A تسجيل الدخول فشلت بسبب مستخدم غير موجود يجب أن تعود نفس الرسالة مثل تسجيل دخول فاشلة بسبب كلمة مرور غير صالحة. سوف تقدم رسالة مختلفة تسمح للمهاجمين لتحديد تسجيلات دخول المستخدم صالحة.

وتأكد أيضا من العودة بالضبط نفس الرسالة في حالة حدوث فشل لعدد كبير جدا من تسجيل الدخول باستخدام كلمة مرور صالحة، وفشل مع عدد كبير جدا من تسجيل الدخول وكلمة مرور غير صحيحة. سوف تقدم رسالة مختلفة تسمح للمهاجمين لتحديد كلمات مرور المستخدم صالحة. وهناك عدد لا بأس به من المستخدمين عندما أجبر على إعادة تعيين كلمة المرور الخاصة بهم سوف ببساطة وضع إعادته إلى ما كان عليه.

والحد من سوء الحظ عدد من تسجيلات سمح لكل عنوان IP غير عملي. العديد من مقدمي مثل AOL ومعظم الشركات بالوكالة طلبات على شبكة الإنترنت. وفرض هذا الحد القضاء على هؤلاء المستخدمين على نحو فعال.


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

والتحقق من وجود كلمات سر ضعيفة بطبيعتها ناقص كلمات القاموس هو عملي العميل مع بعض جافا سكريبت بسيط.

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

وذات مرة كنت سعيدا مع كلمة السر التي اخترت تشفير مع PHP أولا، ثم المخزن. وظيفة تشفير كلمة المرور التالية ليست فكرتي سواء، ولكن لا يحل عدد من المشاكل. تشفير ضمن PHP يمنع الناس على خادم مشترك من اعتراض كلمات السر مشفرة الخاص بك. إضافة شيء لكل مستخدم التي لن تتغير (I استخدام البريد الإلكتروني وهذا هو اسم المستخدم لمواقع بلدي) وإضافة هاش (SALT هو ثابت سلسلة قصيرة أغير لكل موقع) يزيد من مقاومة للهجمات. لأنه يقع في SALT ضمن كلمة السر، وكلمة المرور يمكن أن يكون أي طول، يصبح من المستحيل تقريبا لمهاجمة هذا مع جدول قوس قزح. بالتناوب وهذا يعني أيضا أن الناس لا يمكن أن تتغير بريدهم الإلكتروني وأنت لا تستطيع تغيير SALT بدون إبطال كلمة المرور الجميع بالرغم من ذلك.

وتحرير: أود الآن نوصي باستخدام PhPass بدلا من ذلك من بلدي لفة وظيفة الخاصة بك هنا، أو فقط ننسى تسجيلات المستخدم تماما واستخدام رض بدلا من ذلك.

function password_crypt($email,$toHash) {
  $password = str_split($toHash,(strlen($toHash)/2)+1);
  return hash('sha256', $email.$password[0].SALT.$password[1]); 
}

وبلدي Jqueryish العميل كلمة المرور متر. يجب أن يكون الهدف من شعبة. انها عرض وتغيير بين 0 و 100 ولون الخلفية وتغيير على أساس الطبقات تدل طن النصي. مرة أخرى مسروقة معظمهم من الأشياء الأخرى التي وجدتها:

$.updatePasswordMeter = function(password,username,target) {
$.updatePasswordMeter._checkRepetition = function(pLen,str) {
res = ""
for ( i=0; i<str.length ; i++ ) {
    repeated=true;
    for (j=0;j < pLen && (j+i+pLen) < str.length;j++)
        repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen));
    if (j<pLen) repeated=false;
    if (repeated) {
        i+=pLen-1;
        repeated=false;
    }
    else {
        res+=str.charAt(i);
    };
};
return res;
};
var score = 0;
var r_class = 'weak-password';
//password < 4
if (password.length < 4 || password.toLowerCase()==username.toLowerCase()) { 
target.width(score + '%').removeClass("weak-password okay-password good-password strong-password"
).addClass(r_class);
  return true;
} 
//password length
score += password.length * 4;
score += ( $.updatePasswordMeter._checkRepetition(1,password).length - password.length ) * 1;
score += ( $.updatePasswordMeter._checkRepetition(2,password).length - password.length ) * 1;
score += ( $.updatePasswordMeter._checkRepetition(3,password).length - password.length ) * 1;
score += ( $.updatePasswordMeter._checkRepetition(4,password).length - password.length ) * 1;
//password has 3 numbers
if (password.match(/(.*[0-9].*[0-9].*[0-9])/))  score += 5; 

//password has 2 symbols
if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) score += 5; 

//password has Upper and Lower chars
if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))  score += 10; 

//password has number and chars
if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))  score += 15; 
//
//password has number and symbol
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/))  score += 15; 

//password has char and symbol
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/))  score += 15; 

//password is just a nubers or chars
if (password.match(/^\w+$/) || password.match(/^\d+$/) )  score -= 10; 

//verifing 0 < score < 100
score = score * 2;
if ( score < 0 )  score = 0;
if ( score > 100 )  score = 100;
if (score > 25 ) r_class = 'okay-password';
if (score > 50  ) r_class = 'good-password';
if (score > 75 ) r_class = 'strong-password';
target.width(score + '%').removeClass("weak-password okay-password good-password strong-password"
).addClass(r_class);
return true;
};

نصائح أخرى

في الأساس كنت ترغب في منع الكبرى أنواع من الهجمات

  • هجمات القاموس
  • هجمات القوة الغاشمة

لمنع الأولى, كنت ترغب في النظر في كلمات السر التي تحتوي على الكلمات الشائعة ضعيفة.لمنع الثانية ، كنت ترغب في تشجيع كلمات السر معقولة طول (8+ الشخصيات هو شائع) و معقول كبيرة الأحرف تعيين (يشمل الحروف والأرقام والأحرف الخاصة).إذا كنت تنظر في حالة انخفاض و رسائل الحالة العلوي أن تكون مختلفة, أن يزيد من مجموعة أحرف كبيرة.ومع ذلك ، فإن هذا يخلق مشكلة الاستخدام لبعض المستخدم المجتمعات لذلك تحتاج إلى التوازن النظر.

جوجل للبحث سريع تحولت الحلول التي تمثل هجمات القوة الغاشمة (كلمة مرور معقدة) ولكن ليس عن هجمات القاموس.PHP قوة كلمة المرور متر من هذه لائحة من قوة لعبة الداما يعمل على التحقق من جانب الخادم ، لذلك يمكن أن تمتد إلى التحقق من القاموس.

تحرير:

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

في الأساس ربما كنت ترغب في استخدام التعابير العادية للتحقق من طول وتعقيد كلمة المرور.

مثال جيد على القيام بذلك باستخدام جافا سكريبت يمكن العثور عليها هنا:

http://marketingtechblog.com/programming/javascript-password-strength/

كما دارين Schwenke أشار بها ، من الأفضل العمل على أمن نفسك و لا تضع هذا في يد المستخدم.

ولكن من الجيد أن نقدم بعض النصائح للمستخدم مدى قوة كلمة السر الخاصة به ، لأن أفضل طريقة للحصول على كلمة المرور لا يزال الاجتماعية engenering.

حتى تتمكن من الإختراق قليلا النصية من جانب العميل أن يتحقق المستخدم كلمة المرور القوة مجاملة المؤشر في الوقت الحقيقي.فإنه يمنع شيئا ، ولكن يعطيه جيدة شعور دافئ عندما يتحول إلى اللون الأخضر :-)

أساسا ما يجب عليك التحقق الشائعة المعنى :تحقق إذا كانت كلمة المرور تحتوي على أحرف وأرقام غير الأبجدي احرف في كمية معقولة.

يمكنك الإختراق الخاص بك algo بسهولة جدا :جعل مجرد 10 / 10 مارك :

  • 0 صفر طول كلمة المرور ؛
  • +2 لكل 8 احرف في كلمة (15 يفترض أن تكون آمنة الممكن تغليفها);
  • +1 على استخدام رسالة +2 استخدام 2 الرسائل ؛
  • +1 على استخدام رقم ، +2 استخدام 2 الأرقام ؛
  • +1 من أجل الاستخدام من غير الأبجدي احرف, +2 ل 2.

كنت لا تحتاج إلى التحقق إلهي كلمات السر (هناك رسملة الحروف ، حيث يتم وضع خاص احرف, الخ), المستخدمين ليسوا في البنك / العسكرية / المخابرات / monthy الثعبان صناعة الأفلام ؟

يمكنك البرمجية في ساعة بدون مجنون جافا سكريبت المهارات.

و على أي حال, صالح كلمة المرور و نقل كل رمز الأمان على الملقم.إذا كنت يمكن أن يفوض صحة المستندات (هـ.g :فتح ID), حتى أفضل.

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

ويمكنك تحديد مستوى العديد من مختلف من قوتها إذا مع throeshold مختلفة، أو يمكنك تحديد قيمة مختلفة لمعايير محددة. على سبيل المثال، إذا كان كلمة السر لديه 5 الطابع، ونضيف إلى 1، ولكن إذا حصل على 10، ثم نضيف 2.

وهنا لائحة من معيار للتحقق من

وطول (8-12 على ما يرام، وأكثر هو أفضل) يحتوي على حرف صغير يحتوي على حرف كبير الرسالة حالة العلوي ليس هو أول واحد. يحتوي على عدد يحتوي على حرف الحرف الأخير ليس الإنسان مثل الرمز (مثلا: أو!) لا تبدو وكأنها كلمة dictionnary. يحتوي على بعض الكراك كلمة السر الحكمة مكتبة كلمة وحرف بدائل (مثل المكتبة -> L1br @ راي)

ونأمل أن مساعدة.

لا لفة الخاص بك بين عون!

تشفير خبراء تثبيط لفة الخاص بك بين الخاصة التشفير لأسباب التي يجب أن تكون واضحة.

لنفس الأسباب جدا، ينبغي للمرء أن لا يحاول أن يلف حل بلده لمشكلة قياس قوة كلمة مرور ل، فمن كثيرا مشكلة التشفير.

ولا ندخل في العمل القبيح من تأليف بعض التعبير العادية ضخمة لهذا الغرض؛ هل من المحتمل ستفشل لحساب العديد من العوامل التي تؤثر على القوة الشاملة كلمة مرور ل.

انها مشكلة صعبة

وهناك صعوبة كبيرة المتأصلة لمشكلة قياس قوة كلمة مرور ل. لمزيد من الأبحاث التي أقوم بها حول هذا الموضوع، وأكثر وأنا أدرك أن هذا هو "أحادي الاتجاه" مشكلة. وهذا هو، لا يمكن للمرء قياس "صعوبة" (تكلفة الحسابية) من تكسير كلمة مرور <م> بكفاءة . بدلا من ذلك، وهو أكثر فعالية لتوفير متطلبات التعقيد وقياس قدرة كلمة المرور على الوفاء بها.

وعندما ننظر المشكلة منطقيا، "مؤشر crackability" لا معنى كبير، ومريحة كما يبدو. هناك الكثير من العوامل التي تدفع الحساب، ومعظمها تتصل الموارد الحاسوبية المخصصة لعملية تكسير، وذلك ليكون غير عملي.

وتخيل تأليب جون السفاح (أو أداة مماثلة) ضد كلمة المرور في المسألة؛ قد يستغرق عدة أيام لكسر كلمة المرور لائقة، أشهر لكسر كلمة مرور جيدة وحتى تطلع الشمس حروق التدريجي للقضاء مرور استثنائية. هذه ليست وسيلة عملية يمكن من خلالها قياس قوة كلمة المرور.

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

حلا قابلا للتطبيق

وهناك أداة مستقل المتاحة من Openwall بعنوان passwdqc (ويفترض، والوقوف ل<م> كلمة المرور مدقق جودة ). Openwall مطور، مصمم للطاقة الشمسية، لا يبدو أن هناك نية خبير التشفير النية (أعماله تتحدث عن نفسها)، وكذلك المؤهلين على الكاتب هذه الأداة.

لبلدي خاصة حالة الاستخدام، وهذا هو حل أكثر جاذبية بكثير من استخدام سوء تصور مقتطف جافا سكريبت الذين يعيشون في بعض زاوية مظلمة من الويب.

ووضع معايير لتلبية الاحتياجات الخاصة بك هو الجزء الأصعب. تنفيذ هو الجزء السهل.

مثال عملي

وأنا أقدم تنفيذ بسيط في PHP لتوفير انطلاقة. تنطبق التنازلات القياسية.

وهذا المثال يفترض أننا تغذية قائمة كاملة من كلمات السر للنص PHP. وغني عن القول أنه إذا كنت تفعل هذا مع كلمات السر الحقيقية (على سبيل المثال، تلك التي ألقيت من مدير كلمة السر)، وينبغي توخي الحذر الشديد فيما يتعلق كلمة المرور للمناولة. ببساطة كتابة تفريغ كلمة المرور غير مشفرة على القرص يهدد أمن كلمات السر الخاصة بك!

وpasswords.csv:

"Title","Password"
"My Test Password","password123"
"Your Test Password","123456!!!"
"A strong password","NFYbCoHC5S7dngitqCD53tvQkAu3dais"

وpassword-check.php:

<?php

//A few handy examples from other users:
//http://php.net/manual/en/function.str-getcsv.php#117692

$csv = array_map('str_getcsv', file('passwords.csv'), [',']);

array_walk($csv, function(&$a) use ($csv) {
    $a = array_combine($csv[0], $a);
});

//Remove column header.

array_shift($csv);

//Define report column headers.

$results[] = [
    'Title',
    'Result',
    'Exit Code',
];

$i = 1;

foreach ($csv as $p) {
    $row['title'] = $p['Title'];

    //If the value contains a space, it's considered a passphrase.

    $isPassphrase = stristr($p['Password'], ' ') !== false ? true : false;

    $cmd = 'echo ' . escapeshellarg($p['Password']) . ' | pwqcheck -1 min=32,24,22,20,16 max=128';

    if ($isPassphrase) {
        $cmd .= ' passphrase=3';
    }
    else {
        $cmd .= ' passphrase=0';
    }

    $output = null;
    $exitCode = null;

    $stdOut = exec($cmd, $output, $exitCode);

    //Exit code 0 represents an unacceptable password (not an error).
    //Exit code 1 represents an acceptable password (it meets the criteria).

    if ($exitCode === 0 || $exitCode === 1) {
        $row['result'] = trim($stdOut);
        $row['exitCode'] = $exitCode;
    }
    else {
        $row['result'] = 'An error occurred while calling pwqcheck';
        $row['exitCode'] = null;
    }

    $results[$i] = $row;

    $i++;
}

$reportFile = 'report.csv';

$fp = @fopen($reportFile, 'w');

if ($fp !== false) {
    foreach ($results as $p) {
        fputcsv($fp, $p);
    }

    fclose($fp);
}
else {
    die($reportFile . ' could not be opened for writing (destination is not writable or file is in use)');
}

exit;

وreport.csv الناتجة:

Title,Result,"Exit Code"
"My Test Password","Bad passphrase (too short)",1
"Your Test Password","Bad passphrase (too short)",1
"A strong password",OK,0

تغليف الهاتفي

وليس لدي حتى الآن لإيجاد حل أكثر شمولا على شبكة الانترنت. وغني عن القول، وأنا أرحب بأي توصيات أخرى.

ومن الواضح أن هذا النهج ليس مثاليا بالنسبة لبعض حالات الاستخدام (على سبيل المثال، فإن "قوة كلمة المرور متر" تنفيذ "من جانب العميل"). وحتى مع ذلك، فإنه سيكون تافها لإجراء مكالمة أجاكس إلى مورد من جانب الخادم التي ترجع تمريرة / تفشل استجابة باستخدام النهج المبين أعلاه، ولكن يجب أن مثل هذا النهج تحملاحتمال سوء المعاملة (على سبيل المثال، هجمات حجب الخدمة) ويتطلب اتصال آمن بين العميل والخادم، وكذلك قبول المخاطر المصاحبة لعمليات تحيل كلمة السر تجزئته الامم المتحدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top