اقتراح كلمات مرور قوية

من موسوعة حسوب

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

تعدّ كلمة المرور قوية إذا حققت ما يلي:

  1. أن تتكوّن من 8 حروف.
  2. أن تحتوي على حرف واحد على الأقل.
  3. أن تحتوي على رقم واحد على الأقل.
  4. أن تحتوي على حرف واحد كبير وحرف واحد صغير على الأقل.

مثال:

Input : keshav123
Output : Suggested Password
k(eshav12G3
keshav1@A23
kesh!Aav123
ke(shav12V3
keGshav1$23
kesXhav@123
keAshav12$3
kesKhav@123
kes$hav12N3
$kesRhav123

Input :rakesh@1995kumar
Output : Your Password is Strong

خطوات الخوارزمية

تتحقّق الخوارزمية من موافقة كلمة المرور المدخلة للمعايير السابقة، فإن كانت كذلك تكون كلمة مرور قوية، وتتحقق الخوارزمية كذلك من الحروف الغائبة في كلمة المرور، وتعيد للمستخدم كلمة مرور عشوائية.

تنفيذ الخوارزمية

تعرض الأمثلة التالية طريقة تنفيذ الخوارزمية في عدد من لغات البرمجة:

  • C++‎:
#include <bits/stdc++.h> 

using namespace std; 

// إضافة المزيد من الحروف لاقتراح كلمة مرور قوية
string add_more_char(string str, int need) 
{ 
	int pos = 0; 

	// حروف الهجاء
	string low_case = "abcdefghijklmnopqrstuvwxyz"; 

	for (int i = 0; i < need; i++) { 
		pos = rand() % str.length(); 
		str.insert(pos, 1, low_case[rand() % 26]); 
	} 
	return str; 
} 

// إنشاء سلسلة نصية قوية
string suggester(int l, int u, int d, int s, string str) 
{ 

	// جميع الأرقام
	string num = "0123456789"; 

	// جميع الحروف الكبيرة والصغيرة والخاصة
	string low_case = "abcdefghijklmnopqrstuvwxyz"; 
	string up_case = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
	string spl_char = "@#$_()!"; 

	// الموقع الذي يوضع فيه الحرف
	int pos = 0; 

	// تضاف حروف صغيرة إلى السلسلة النصية إن لم تكن موجودة فيها
	if (l == 0) { 
		// توليد عدد صحيح عشوائي أقل من طول السلسلة النصية
		pos = rand() % str.length(); 

		// توليد عدد صحيح عشوائية أقل من 26 لفهرسة الحروف الأبجدية من أولها إلى آخرها
		str.insert(pos, 1, low_case[rand() % 26]); 
	} 

	// تضاف حروف كبيرة إلى السلسلة النصية إن لم تكن موجودة فيها
	if (u == 0) { 
		pos = rand() % str.length(); 
		str.insert(pos, 1, up_case[rand() % 26]); 
	} 

	// تضاف الأعداد إلى السلسلة النصية إن لم تكن موجودة فيها
	if (d == 0) { 
		pos = rand() % str.length(); 
		str.insert(pos, 1, num[rand() % 10]); 
	} 

	// تضاف الأحرف الخاصة إلى السلسلة النصية إن لم تكن موجودة فيها
	if (s == 0) { 
		pos = rand() % str.length(); 
		str.insert(pos, 1, spl_char[rand() % 7]); 
	} 

	return str; 
} 

/* تستخدم هذه الدالة للتحقق من قوة كلمة المرور المدخلة من قبل المستخدم
وإن لم تكن كذلك تقترح الدالة بعض كلمات المرور القوية */
void generate_password(int n, string p) 
{ 
	// رايات تشير إلى عدد الحروف الصغيرة والكبيرة والخاصة والحروف التي تحتاجها الدالة لإكمال كلمة المرور
	int l = 0, u = 0, d = 0, s = 0, need = 0; 

	// كلمات المرور المقترحة
	string suggest; 

	for (int i = 0; i < n; i++) { 
		// كلمات المرور المقترحة
		if (p[i] >= 97 && p[i] <= 122) 
			l = 1; 
		else if (p[i] >= 65 && p[i] <= 90) 
			u = 1; 
		else if (p[i] >= 48 && p[i] <= 57) 
			d = 1; 
		else
			s = 1; 
	} 
	
	// التحقق من أن كلمة المرور المدخلة قوية وذلك بالتحقق من أن جميع الرايات فعالة
	if ((l + u + d + s) == 4) { 
		cout << "Your Password is Strong" << endl; 
		return; 
	} 
	else
		cout << "Suggested passowrd " << endl; 

	/*اقتراح عشر كلمات مرور */
	for (int i = 0; i < 10; i++) { 
		suggest = suggester(l, u, d, s, p); 
		need = 8 - suggest.length(); 
		if (need > 0) 
			suggest = add_more_char(suggest, need); 
		cout << suggest << endl; 
	} 
} 

// اختبار الدوال السابقة
int main() 
{ 
	string input_string = "geek@2018"; 
	srand(time(NULL)); 

	generate_password(input_string.length(), input_string); 
	return 0; 
}
  • جافا:
import java.io.*; 
import java.util.*; 
import java.util.Random; 

public class GFG { 

	// إضافة المزيد من الحروف لاقتراح كلمة مرور قوية 
	static StringBuilder add_more_char( 
						StringBuilder str, int need) 
	{ 
		int pos = 0; 
		Random randm = new Random(); 
		
		// حروف الهجاء 
		String low_case = "abcdefghijklmnopqrstuvwxyz"; 

		for (int i = 0; i < need; i++) { 
			pos = randm.nextInt(1000) % str.length(); 
			str.setCharAt(pos,low_case.charAt( 
							randm.nextInt(1000) % 26)); 
		} 
		return str; 
	} 

	// إنشاء سلسلة نصية قوية 
	static StringBuilder suggester(int l, int u, int d, 
							int s, StringBuilder str) 
	{ 
		Random randm = new Random(); 
		
		// جميع الأرقام 
		String num = "0123456789"; 

		// جميع الحروف الكبيرة والصغيرة والخاصة 
		String low_case = "abcdefghijklmnopqrstuvwxyz"; 
		String up_case = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
		String spl_char = "@#$_()!"; 

		// الموقع الذي يوضع فيه الحرف 
		int pos = 0; 

		// تضاف حروف صغيرة إلى السلسلة النصية إن لم تكن موجودة فيها 
		// String, add it 
		if (l == 0) { 
			
			//  توليد عدد صحيح عشوائي أقل من طول السلسلة النصية 
			pos = randm.nextInt(1000) % str.length(); 

			//  توليد عدد صحيح عشوائية أقل من 26 لفهرسة الحروف الأبجدية من أولها إلى آخرها 
			str.setCharAt(pos,low_case.charAt(randm.nextInt(1000) 
										% 26)); 
		} 

		// تضاف حروف كبيرة إلى السلسلة النصية إن لم تكن موجودة فيها 
		if (u == 0) { 
			pos = randm.nextInt(1000) % str.length(); 
			str.setCharAt(pos,low_case.charAt(randm.nextInt(1000) 
										% 26)); 
		} 

		// تضاف الأعداد إلى السلسلة النصية إن لم تكن موجودة فيها
		if (d == 0) { 
			pos = randm.nextInt(1000) % str.length(); 
			str.setCharAt(pos,low_case.charAt(randm.nextInt(1000) 
										% 10)); 
		} 

		// تضاف الأحرف الخاصة إلى السلسلة النصية إن لم تكن موجودة فيها
		// String, add it 
		if (s == 0) { 
			pos = randm.nextInt(1000) % str.length(); 
			str.setCharAt(pos,low_case.charAt(randm.nextInt(1000) 
										% 7)); 
		} 

		return str; 
	} 

	/* تستخدم هذه الدالة للتحقق من قوة كلمة المرور المدخلة من قبل المستخدم
وإن لم تكن كذلك تقترح الدالة بعض كلمات المرور القوية */
	static void generate_password(int n, StringBuilder p) 
	{ 
		
		// رايات تشير إلى عدد الحروف الصغيرة والكبيرة والخاصة والحروف التي تحتاجها الدالة لإكمال كلمة المرور 
		int l = 0, u = 0, d = 0, s = 0, need = 0; 

		// كلمات المرور المقترحة 
		StringBuilder suggest; 

		for (int i = 0; i < n; i++) { 
			
			// كلمات المرور المقترحة 
			if (p.charAt(i) >= 97 && p.charAt(i) <= 122) 
				l = 1; 
			else if (p.charAt(i) >= 65 && p.charAt(i) <= 90) 
				u = 1; 
			else if (p.charAt(i) >= 48 && p.charAt(i) <= 57) 
				d = 1; 
			else
				s = 1; 
		} 

		// التحقق من أن كلمة المرور المدخلة قوية وذلك بالتحقق من أن جميع الرايات فعالة 
		if ((l + u + d + s) == 4) { 
			System.out.println("Your Password is Strong"); 
			return; 
		} 
		else
			System.out.println("Suggested password "); 

		/*اقتراح عشر كلمات مرور */
		for (int i = 0; i < 10; i++) { 
			suggest = suggester(l, u, d, s, p); 
			need = 8 - suggest.length(); 
			if (need > 0) 
				suggest = add_more_char(suggest, need); 
			System.out.println(suggest);; 
		} 
	} 

	// اختبار التوابع السابقة
	public static void main(String[] args) 
	{ 
		StringBuilder input_String = new StringBuilder("geek@2018"); 
		generate_password(input_String.length(), input_String); 
	} 
}

تعطي الشيفرات السابقة المعطيات التالية:

Suggested password 
geek@201K8
geek@201S8
gOeek@2018
geek@201N8
geek@2P018
geek@D2018
geUek@2018
geek@2Q018
geek@2F018
geekZ@2018

مصادر