ahmad mahamid

زيزوومي جديد
إنضم
23 أغسطس 2025
المشاركات
10
مستوى التفاعل
7
النقاط
10
متصل

السلام عليكم
مرفق مولد كلمات مرور سهل للاستخدام ويودلك عدد غير محدود من كلمات المرور بسهولة .
السكربت مبني بـ html ليتم استخدامه على الجهاز مباشرة بدون الحاجه لفتح موقع معين .
تم تطويره ليحتوي على المزيد من الخصائص المفيدة
1756137622247.webp


1756137543386.webp


كود html للكود النهائي بعد اضافة ميزات اضافية مثل فحص كلمة المرور​
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>مولّد كلمات المرور الآمنة</title>
<link rel="preconnect" href="
يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي
">
<link rel="preconnect" href="
يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي
" crossorigin>
<link href="
يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي
" rel="stylesheet">
<style>
/* CSS Reset and Global Styles */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}

body {
font-family: 'Tajawal', sans-serif;
background-color: #1a202c;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
color: #e2e8f0;
}

/* Dashboard-style container */
.dashboard-container {
background-color: #2d3748;
padding: 2.5rem;
border-radius: 1rem;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
width: 100%;
max-width: 600px;
display: flex;
flex-direction: column;
direction: rtl;
gap: 1.5rem;
}

h1 {
text-align: center;
color: #fff;
margin-bottom: 1rem;
font-weight: 700;
}

/* Dashboard cards/sections */
.card {
background-color: #4a5568;
padding: 1.5rem;
border-radius: 0.75rem;
display: flex;
flex-direction: column;
gap: 1rem;
}

.option {
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
}

.option label {
font-size: 1em;
color: #e2e8f0;
flex-grow: 1;
text-align: right;
}

input[type="checkbox"] {
width: 1.25rem;
height: 1.25rem;
cursor: pointer;
accent-color: #42b72a;
}

input[type="number"], input[type="text"], select {
width: 4rem;
height: 2rem;
text-align: center;
background-color: #2d3748;
border: 1px solid #4a5568;
border-radius: 0.25rem;
padding: 0.25rem;
color: #fff;
direction: ltr;
}

input[type="text"] {
width: 10rem;
}

input[type="range"] {
width: 60%;
cursor: pointer;
accent-color: #4299e1;
}

#generateButton, #auditButton {
width: 100%;
padding: 1rem;
font-size: 1.1em;
font-weight: bold;
background-color: #42b72a;
color: white;
border: none;
border-radius: 0.5rem;
cursor: pointer;
transition: background-color 0.3s ease;
}
#auditButton {
background-color: #4299e1;
margin-top: 1rem;
}

#generateButton:hover {
background-color: #38a169;
}
#auditButton:hover {
background-color: #3182ce;
}

#generateButton:disabled, #auditButton:disabled {
background-color: #6b7280;
cursor: not-allowed;
}

.length-container {
display: flex;
align-items: center;
justify-content: space-between;
}

#lengthValue {
font-weight: bold;
background-color: #2d3748;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
border: 1px solid #4a5568;
}

.scrollable-list-container {
max-height: 250px;
overflow-y: auto;
border: 1px solid #4a5568;
border-radius: 0.5rem;
padding: 1rem;
background-color: #2d3748;
display: flex;
flex-direction: column;
gap: 0.75rem;
}

.password-item {
display: flex;
justify-content: space-between;
align-items: center;
background-color: #4a5568;
padding: 0.75rem;
border-radius: 0.375rem;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
direction: ltr;
}

.password-item-text {
font-size: 1em;
letter-spacing: 1px;
text-align: left;
direction: ltr;
word-wrap: break-word;
overflow-wrap: break-word;
flex-grow: 1;
color: #fff;
padding-right: 0.75rem;
}

.copy-btn {
background-color: #4299e1;
color: white;
border: none;
padding: 0.5rem 0.75rem;
border-radius: 0.25rem;
cursor: pointer;
font-weight: bold;
font-size: 0.8em;
transition: background-color 0.3s ease;
}

.copy-btn:hover {
background-color: #3182ce;
}

.strength-meter {
height: 0.5rem;
border-radius: 0.25rem;
margin-top: 1rem;
overflow: hidden;
background-color: #4a5568;
}

.strength-bar {
height: 100%;
transition: width 0.3s ease-in-out, background-color 0.3s ease-in-out;
}

.weak { background-color: #e53e3e; }
.medium { background-color: #ecc94b; }
.strong { background-color: #48bb78; }

#entropyValue {
text-align: center;
color: #a0aec0;
font-size: 0.9em;
margin-top: 0.5rem;
}

.error-message {
color: #fc8181;
font-size: 0.9em;
margin-top: -0.5rem;
display: none;
}

.hidden {
display: none !important;
}

.tab-buttons {
display: flex;
gap: 1rem;
margin-bottom: 1rem;
}
.tab-buttons button {
flex: 1;
padding: 0.75rem;
border: 1px solid #4a5568;
background-color: #2d3748;
color: #e2e8f0;
border-radius: 0.5rem;
cursor: pointer;
font-weight: bold;
transition: background-color 0.3s ease;
}
.tab-buttons button.active, .tab-buttons button:hover {
background-color: #4a5568;
}

#audit-input {
width: 100%;
height: 3rem;
background-color: #2d3748;
border: 1px solid #4a5568;
border-radius: 0.25rem;
color: #fff;
padding: 0.5rem;
resize: vertical;
direction: ltr;
}

#audit-results {
text-align: center;
font-size: 1.1em;
font-weight: bold;
margin-top: 1rem;
}
.breached {
color: #e53e3e;
}
.not-breached {
color: #48bb78;
}

/* Responsive Design */
@media (max-width: 600px) {
.dashboard-container {
padding: 1rem;
}
.card {
padding: 1rem;
}
.option {
flex-direction: column;
align-items: flex-end;
gap: 0.5rem;
}
.option label, .option input, .option select {
width: 100%;
}
.length-container, .length-container input {
width: 100%;
}
}
</style>
</head>
<body>

<div class="dashboard-container">
<h1>مولّد كلمات المرور الآمنة</h1>

<div class="tab-buttons">
<button id="generator-tab" class="active">مولّد</button>
<button id="audit-tab">فحص الأمان</button>
</div>

<div id="generator-section">
<div class="card">
<div class="option">
<label for="passphrase-mode">مولّد عبارة مرور</label>
<input type="checkbox" id="passphrase-mode">
</div>

<div id="password-options">
<div class="option length-container">
<label for="length">طول كلمة المرور:</label>
<input type="range" id="length" min="8" max="32" value="16">
<span id="lengthValue">16</span>
</div>
<div class="option">
<label for="uppercase">أحرف كبيرة (A-Z)</label>
<input type="checkbox" id="uppercase" checked>
<input type="number" id="min-uppercase" min="0" value="1">
</div>
<div class="option">
<label for="lowercase">أحرف صغيرة (a-z)</label>
<input type="checkbox" id="lowercase" checked>
<input type="number" id="min-lowercase" min="0" value="1">
</div>
<div class="option">
<label for="numbers">أرقام (0-9)</label>
<input type="checkbox" id="numbers" checked>
<input type="number" id="min-numbers" min="0" value="1">
</div>
<div class="option">
<label for="symbols">رموز (!@#$)</label>
<input type="checkbox" id="symbols" checked>
<input type="number" id="min-symbols" min="0" value="1">
</div>
<div class="option">
<label for="excludeSimilar">استثناء أحرف متشابهة (0, O, l, 1...)</label>
<input type="checkbox" id="excludeSimilar">
</div>
<div class="option">
<label for="preventDuplicates">منع تكرار الأحرف المتجاورة</label>
<input type="checkbox" id="preventDuplicates">
</div>
<div class="option">
<label for="prefix-input">بادئة (Prefix):</label>
<input type="text" id="prefix-input">
</div>
<div class="option">
<label for="suffix-input">لاحقة (Suffix):</label>
<input type="text" id="suffix-input">
</div>
<div class="option">
<label for="excludeChars">استثناء أحرف إضافية:</label>
<input type="text" id="excludeChars">
</div>
</div>

<div id="passphrase-options" class="hidden">
<div class="option">
<label for="word-count">عدد الكلمات:</label>
<input type="number" id="word-count" min="3" max="10" value="4">
</div>
<div class="option">
<label for="word-separator">فاصل الكلمات:</label>
<input type="text" id="word-separator" value="-">
</div>
<div class="option">
<label for="language-select">لغة الكلمات:</label>
<select id="language-select">
<option value="ar">عربي</option>
<option value="en">إنجليزي</option>
</select>
</div>
</div>
</div>

<div class="card">
<div class="option">
<label for="quantity">عدد كلمات المرور:</label>
<input type="number" id="quantity" min="1" max="50" value="5">
</div>
<span id="quantityError" class="error-message">الرجاء إدخال عدد صحيح موجب (1-50).</span>
<span id="separatorError" class="error-message hidden">لا يمكن أن يكون الفاصل فارغاً أو مسافات.</span>
</div>

<div class="strength-meter">
<div id="strengthBar" class="strength-bar"></div>
</div>
<div id="entropyValue"></div>

<button id="generateButton">أنشئ كلمات المرور</button>

<div class="scrollable-list-container">
<div id="passwordsList"></div>
</div>
</div>

<div id="audit-section" class="hidden">
<div class="card">
<h2>فحص كلمة مرور</h2>
<p>الصق كلمة مرورك هنا للتحقق من أمانها ووجودها في تسريبات البيانات المعروفة.</p>
<textarea id="audit-input" placeholder="الصق كلمة المرور هنا..."></textarea>
<button id="auditButton">فحص</button>
<div id="audit-results"></div>
</div>
</div>
</div>

<script>
// 1. تعريف مجموعات الأحرف وقوائم الكلمات
const uppercaseChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
const lowercaseChars = 'abcdefghijklmnopqrstuvwxyz';
const numberChars = '0123456789';
const symbolChars = '!@#$%^&*()_+-=[]{}|;:,.<>?';
const similarChars = '0Oo1lI|';
const wordLists = {
'en': ['library', 'sky', 'mountain', 'river', 'sea', 'book', 'pen', 'tree', 'city', 'happiness', 'hope', 'house', 'moon', 'sun', 'car', 'computer', 'keyboard'],
'ar': ['مكتبة', 'سماء', 'جبل', 'نهر', 'بحر', 'كتاب', 'قلم', 'شجرة', 'مدينة', 'سعادة', 'أمل', 'بيت', 'قمر', 'شمس', 'سيارة', 'حاسوب', 'لوحة'],
};
const defaultLanguage = document.documentElement.lang === 'ar' ? 'ar' : 'en';

// 2. الحصول على مراجع لعناصر HTML
const lengthSlider = document.getElementById('length');
const lengthValue = document.getElementById('lengthValue');
const quantityInput = document.getElementById('quantity');
const uppercaseCheckbox = document.getElementById('uppercase');
const lowercaseCheckbox = document.getElementById('lowercase');
const numbersCheckbox = document.getElementById('numbers');
const symbolsCheckbox = document.getElementById('symbols');
const minUppercase = document.getElementById('min-uppercase');
const minLowercase = document.getElementById('min-lowercase');
const minNumbers = document.getElementById('min-numbers');
const minSymbols = document.getElementById('min-symbols');
const excludeSimilarCheckbox = document.getElementById('excludeSimilar');
const preventDuplicatesCheckbox = document.getElementById('preventDuplicates');
const excludeCharsInput = document.getElementById('excludeChars');
const prefixInput = document.getElementById('prefix-input');
const suffixInput = document.getElementById('suffix-input');

const strengthBar = document.getElementById('strengthBar');
const entropyValueDisplay = document.getElementById('entropyValue');
const passwordsList = document.getElementById('passwordsList');
const generateButton = document.getElementById('generateButton');
const quantityError = document.getElementById('quantityError');
const passphraseModeCheckbox = document.getElementById('passphrase-mode');
const passwordOptionsDiv = document.getElementById('password-options');
const passphraseOptionsDiv = document.getElementById('passphrase-options');
const wordCountInput = document.getElementById('word-count');
const wordSeparatorInput = document.getElementById('word-separator');
const separatorError = document.getElementById('separatorError');
const languageSelect = document.getElementById('language-select');

const generatorTab = document.getElementById('generator-tab');
const auditTab = document.getElementById('audit-tab');
const generatorSection = document.getElementById('generator-section');
const auditSection = document.getElementById('audit-section');
const auditInput = document.getElementById('audit-input');
const auditButton = document.getElementById('auditButton');
const auditResultsDisplay = document.getElementById('audit-results');

// 3. تحديث الطول والقوة عند تغيير شريط التمرير
lengthSlider.oninput = function() {
lengthValue.textContent = this.value;
checkAndUpdateStrength();
};

// 4. دالة للتحقق من قوة كلمة المرور وعرض الأنتـروبـي
function checkAndUpdateStrength() {
if (passphraseModeCheckbox.checked) {
strengthBar.style.width = '0%';
strengthBar.className = 'strength-bar';
entropyValueDisplay.textContent = '';
return;
}

const length = parseInt(lengthSlider.value);
let charSetSize = 0;
if (uppercaseCheckbox.checked) charSetSize += uppercaseChars.length;
if (lowercaseCheckbox.checked) charSetSize += lowercaseChars.length;
if (numbersCheckbox.checked) charSetSize += numberChars.length;
if (symbolsCheckbox.checked) charSetSize += symbolChars.length;

// حساب الأنتـروبـي: H = L * log2(N) حيث L هو الطول وN هو حجم مجموعة الأحرف
const entropy = length * Math.log2(charSetSize > 0 ? charSetSize : 1);

// V3: استخدام عتبات الأنتـروبـي لتقييم قوة أكثر دقة
strengthBar.className = 'strength-bar';
let strengthPercentage = 0;
if (entropy < 60) {
strengthBar.classList.add('weak');
strengthPercentage = entropy / 60 * 40;
} else if (entropy < 100) {
strengthBar.classList.add('medium');
strengthPercentage = 40 + (entropy - 60) / 40 * 30;
} else {
strengthBar.classList.add('strong');
strengthPercentage = 70 + (entropy - 100) / 28 * 30; // الأنتـروبـي الأقصى لـ 32 حرف هو ~128 بت
strengthPercentage = Math.min(100, strengthPercentage);
}
strengthBar.style.width = strengthPercentage + '%';

entropyValueDisplay.textContent = `الأنتـروبـي: ${Math.round(entropy * 10) / 10} بت`;
}

// 5. دالة للتحقق من صحة إدخال الكمية
function validateQuantity() {
const count = quantityInput.value;
const isValid = count >= 1 && count <= 50;
if (!isValid) {
quantityError.style.display = 'block';
} else {
quantityError.style.display = 'none';
}
updateButtonState();
}

// 6. دالة للتحقق من صحة إدخال الفاصل
function validateSeparator() {
const separator = wordSeparatorInput.value.trim();
const isValid = separator.length > 0;
if (!isValid) {
separatorError.classList.remove('hidden');
} else {
separatorError.classList.add('hidden');
}
updateButtonState();
}

// 7. دالة للتحكم في حالة الزر بناءً على جميع التحققات
function updateButtonState() {
const isQuantityValid = quantityInput.value >= 1 && quantityInput.value <= 50;
const isSeparatorValid = wordSeparatorInput.value.trim().length > 0;

if (passphraseModeCheckbox.checked) {
generateButton.disabled = !isQuantityValid || !isSeparatorValid;
} else {
generateButton.disabled = !isQuantityValid;
}
}

// V3 - منطق توليد كلمة المرور المُحسّن
function createOnePassword() {
let excluded = excludeCharsInput.value.toLowerCase();
if (excludeSimilarCheckbox.checked) {
excluded += similarChars.toLowerCase();
}

let characterPool = '';
if (uppercaseCheckbox.checked) characterPool += uppercaseChars.split('').filter(char => !excluded.includes(char.toLowerCase())).join('');
if (lowercaseCheckbox.checked) characterPool += lowercaseChars.split('').filter(char => !excluded.includes(char)).join('');
if (numbersCheckbox.checked) characterPool += numberChars.split('').filter(char => !excluded.includes(char)).join('');
if (symbolsCheckbox.checked) characterPool += symbolChars.split('').filter(char => !excluded.includes(char)).join('');

if (characterPool.length === 0) {
alert('عذراً، كل الأحرف المتاحة تم استثناؤها. الرجاء تعديل خياراتك أو الأحرف المستثناة.');
return '';
}

const length = parseInt(lengthSlider.value);

let required = [];
let requirements = {
uppercase: uppercaseCheckbox.checked ? parseInt(minUppercase.value) : 0,
lowercase: lowercaseCheckbox.checked ? parseInt(minLowercase.value) : 0,
numbers: numbersCheckbox.checked ? parseInt(minNumbers.value) : 0,
symbols: symbolsCheckbox.checked ? parseInt(minSymbols.value) : 0
};

// V3 - التحقق من أن الطول المطلوب ليس قصيراً جداً
let totalRequired = requirements.uppercase + requirements.lowercase + requirements.numbers + requirements.symbols;
if (totalRequired > length) {
alert('أורך كلمة المرور قصير جداً لتلبية المتطلبات المحددة.');
return '';
}

// V3 - دالة للحصول على حرف عشوائي من مجموعة معينة
const getRandomCharFromSet = (set) => {
const filteredSet = set.split('').filter(char => !excluded.includes(char.toLowerCase())).join('');
if (filteredSet.length === 0) {
return '';
}
const randomArray = new Uint32Array(1);
window.crypto.getRandomValues(randomArray);
const randomIndex = randomArray[0] % filteredSet.length;
return filteredSet[randomIndex];
};

// V3 - إضافة الحد الأدنى من الأحرف المطلوبة أولاً
for (let i = 0; i < requirements.uppercase; i++) required.push(getRandomCharFromSet(uppercaseChars));
for (let i = 0; i < requirements.lowercase; i++) required.push(getRandomCharFromSet(lowercaseChars));
for (let i = 0; i < requirements.numbers; i++) required.push(getRandomCharFromSet(numberChars));
for (let i = 0; i < requirements.symbols; i++) required.push(getRandomCharFromSet(symbolChars));

// V3 - توليد الأحرف المتبقية
let passwordChars = required;
for (let i = passwordChars.length; i < length; i++) {
const randomArray = new Uint32Array(1);
window.crypto.getRandomValues(randomArray);
const randomIndex = randomArray[0] % characterPool.length;
passwordChars.push(characterPool[randomIndex]);
}

// V3 - خلط Fisher-Yates لخلط الأحرف المطلوبة والعشوائية
for (let i = passwordChars.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[passwordChars, passwordChars[j]] = [passwordChars[j], passwordChars];
}

// V3 - فحص ما بعد الخلط للتحقق من التكرار المتجاور
if (preventDuplicatesCheckbox.checked) {
let attempts = 0;
const maxAttempts = 100;
let isDone = false;
while (!isDone && attempts < maxAttempts) {
isDone = true;
for (let i = 0; i < passwordChars.length - 1; i++) {
if (passwordChars === passwordChars[i+1]) {
isDone = false;
const charToSwap = passwordChars[i+1];
let newChar = characterPool[Math.floor(Math.random() * characterPool.length)];
while(newChar === charToSwap || newChar === passwordChars) {
newChar = characterPool[Math.floor(Math.random() * characterPool.length)];
}
passwordChars[i+1] = newChar;
}
}
if (!isDone) {
// إعادة الخلط لتوزيع الأحرف بشكل أكثر توازناً
for (let i = passwordChars.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[passwordChars, passwordChars[j]] = [passwordChars[j], passwordChars];
}
}
attempts++;
}
}

const prefix = prefixInput.value || '';
const suffix = suffixInput.value || '';

return prefix + passwordChars.join('') + suffix;
}

function generatePassphrase() {
const wordCount = wordCountInput.value;
const separator = wordSeparatorInput.value;

// V3 - الحصول على اللغة من عنصر الاختيار الجديد
const language = languageSelect.value;
const words = wordLists[language] || wordLists['ar']; // الرجوع إلى "ar" في حالة عدم العثور على اللغة

let passphrase = [];
for (let i = 0; i < wordCount; i++) {
const randomIndex = Math.floor(Math.random() * words.length);
passphrase.push(words[randomIndex]);
}
return passphrase.join(separator);
}

function generateMultiplePasswords() {
passwordsList.innerHTML = '';

const count = quantityInput.value;
if (count < 1 || count > 50) {
return;
}

if (passphraseModeCheckbox.checked) {
const separator = wordSeparatorInput.value.trim();
if (separator.length === 0) {
return;
}
for (let i = 0; i < count; i++) {
const newPassphrase = generatePassphrase();
const passwordItem = createPasswordItem(i, newPassphrase);
passwordsList.appendChild(passwordItem);
}
} else {
for (let i = 0; i < count; i++) {
const newPassword = createOnePassword();
if (!newPassword) {
return;
}
const passwordItem = createPasswordItem(i, newPassword);
passwordsList.appendChild(passwordItem);
}
}
}

function createPasswordItem(index, text) {
const passwordItem = document.createElement('div');
passwordItem.className = 'password-item';

const passwordNumber = document.createElement('span');
passwordNumber.textContent = (index + 1) + '. ';

const passwordText = document.createElement('div');
passwordText.className = 'password-item-text';
passwordText.textContent = text;

const copyBtn = document.createElement('button');
copyBtn.className = 'copy-btn';
copyBtn.textContent = 'نسخ';

copyBtn.addEventListener('click', () => {
navigator.clipboard.writeText(text)
.then(() => {
copyBtn.textContent = 'تم النسخ!';
setTimeout(() => {
copyBtn.textContent = 'نسخ';
}, 2000);
})
.catch(err => console.error('Failed to copy: ', err));
});

passwordItem.appendChild(passwordNumber);
passwordItem.appendChild(passwordText);
passwordItem.appendChild(copyBtn);
return passwordItem;
}

function toggleOptions() {
if (passphraseModeCheckbox.checked) {
passwordOptionsDiv.classList.add('hidden');
passphraseOptionsDiv.classList.remove('hidden');
} else {
passwordOptionsDiv.classList.remove('hidden');
passphraseOptionsDiv.classList.add('hidden');
}
checkAndUpdateStrength();
updateButtonState();
}

async function auditPassword() {
const password = auditInput.value;
if (password.length === 0) {
auditResultsDisplay.textContent = 'الرجاء إدخال كلمة مرور.';
auditResultsDisplay.classList.remove('breached', 'not-breached');
return;
}

auditButton.disabled = true;
auditResultsDisplay.textContent = 'جاري الفحص...';
auditResultsDisplay.classList.remove('breached', 'not-breached');

try {
const hashBuffer = await crypto.subtle.digest('SHA-1', new TextEncoder().encode(password));
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();
const prefix = hashHex.substring(0, 5);
const suffix = hashHex.substring(5);

const response = await fetch(`
يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي
{prefix}`);

if (response.status === 404) {
auditResultsDisplay.textContent = 'لم يتم العثور على كلمة المرور في أي تسريبات!';
auditResultsDisplay.classList.add('not-breached');
} else if (response.ok) {
const text = await response.text();
const lines = text.split('\r\n');
const foundLine = lines.find(line => line.startsWith(suffix));

if (foundLine) {
const count = foundLine.split(':')[1];
auditResultsDisplay.textContent = `كلمة المرور هذه تم اختراقها ${count} مرة!`;
auditResultsDisplay.classList.add('breached');
} else {
auditResultsDisplay.textContent = 'لم يتم العثور على كلمة المرور في أي تسريبات!';
auditResultsDisplay.classList.add('not-breached');
}
} else {
auditResultsDisplay.textContent = 'خطأ في الاتصال بالخدمة. حاول مرة أخرى لاحقًا.';
auditResultsDisplay.classList.remove('breached', 'not-breached');
}
} catch (err) {
console.error(err);
auditResultsDisplay.textContent = 'حدث خطأ. الرجاء التحقق من اتصالك بالإنترنت.';
auditResultsDisplay.classList.remove('breached', 'not-breached');
} finally {
auditButton.disabled = false;
}
}

// إضافة مستمعي الأحداث
generatorTab.addEventListener('click', () => {
generatorTab.classList.add('active');
auditTab.classList.remove('active');
generatorSection.classList.remove('hidden');
auditSection.classList.add('hidden');
updateButtonState();
});

auditTab.addEventListener('click', () => {
auditTab.classList.add('active');
generatorTab.classList.remove('active');
auditSection.classList.remove('hidden');
generatorSection.classList.add('hidden');
updateButtonState();
});

generateButton.addEventListener('click', generateMultiplePasswords);
uppercaseCheckbox.addEventListener('change', checkAndUpdateStrength);
lowercaseCheckbox.addEventListener('change', checkAndUpdateStrength);
numbersCheckbox.addEventListener('change', checkAndUpdateStrength);
symbolsCheckbox.addEventListener('change', checkAndUpdateStrength);
minUppercase.addEventListener('input', checkAndUpdateStrength);
minLowercase.addEventListener('input', checkAndUpdateStrength);
minNumbers.addEventListener('input', checkAndUpdateStrength);
minSymbols.addEventListener('input', checkAndUpdateStrength);
excludeSimilarCheckbox.addEventListener('change', checkAndUpdateStrength);
preventDuplicatesCheckbox.addEventListener('change', checkAndUpdateStrength);
excludeCharsInput.addEventListener('input', checkAndUpdateStrength);
prefixInput.addEventListener('input', checkAndUpdateStrength);
suffixInput.addEventListener('input', checkAndUpdateStrength);
quantityInput.addEventListener('input', validateQuantity);
wordSeparatorInput.addEventListener('input', validateSeparator);
passphraseModeCheckbox.addEventListener('change', toggleOptions);
languageSelect.addEventListener('change', generateMultiplePasswords);
auditButton.addEventListener('click', auditPassword);
auditInput.addEventListener('input', () => {
auditResultsDisplay.textContent = '';
auditResultsDisplay.classList.remove('breached', 'not-breached');
});

// اختصارات لوحة المفاتيح
document.addEventListener('keydown', (e) => {
if (e.ctrlKey || e.metaKey) {
if (e.key === 'g' || e.key === 'G') {
e.preventDefault();
if (!generateButton.disabled) {
generateButton.click();
}
} else if (e.key === 'c' || e.key === 'C') {
e.preventDefault();
const firstPasswordCopyBtn = document.querySelector('#passwordsList .copy-btn');
if (firstPasswordCopyBtn) {
firstPasswordCopyBtn.click();
}
}
}
});

// استدعاءات أولية
toggleOptions();
checkAndUpdateStrength();
generateMultiplePasswords();
</script>
</body>
</html>

رابط التحميل
يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي


اتمنى ان يكون مفيد لكم​
 

المرفقات

  • Screenshot 2025-08-25 072842.webp
    Screenshot 2025-08-25 072842.webp
    22.3 KB · المشاهدات: 72
  • 1756137499143.webp
    1756137499143.webp
    19.5 KB · المشاهدات: 3
التعديل الأخير بواسطة المشرف:
شكرا جزيلا لك...
ولكن الرابط لا يعمل ...
 
بارك الله فيك وجزاك الله خيرا
 
توقيع : (Microsoft)
بارك الله فيك وجزاك الله خيرا
لكن الرابط لا يعمل
 
توقيع : alranteesi
عليكم السلام ورحمة الله وبركاته
جزاك الله خير وبارك الله فيك
شكراً
 
اسف تم تغييرر الرابط :
يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي

تم تطويره ليحتوي على المزيد من الخصائص المفيدة

Screenshot 2025-08-25 181855.webp


Screenshot 2025-08-25 181849.webp
 
كود html للكود النهائي بعد اضافة ميزات اضافية مثل فحص كلمة المرور
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>مولّد كلمات المرور الآمنة</title>
<link rel="preconnect" href="
يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي
">
<link rel="preconnect" href="
يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي
" crossorigin>
<link href="
يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي
" rel="stylesheet">
<style>
/* CSS Reset and Global Styles */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}

body {
font-family: 'Tajawal', sans-serif;
background-color: #1a202c;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
color: #e2e8f0;
}

/* Dashboard-style container */
.dashboard-container {
background-color: #2d3748;
padding: 2.5rem;
border-radius: 1rem;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
width: 100%;
max-width: 600px;
display: flex;
flex-direction: column;
direction: rtl;
gap: 1.5rem;
}

h1 {
text-align: center;
color: #fff;
margin-bottom: 1rem;
font-weight: 700;
}

/* Dashboard cards/sections */
.card {
background-color: #4a5568;
padding: 1.5rem;
border-radius: 0.75rem;
display: flex;
flex-direction: column;
gap: 1rem;
}

.option {
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
}

.option label {
font-size: 1em;
color: #e2e8f0;
flex-grow: 1;
text-align: right;
}

input[type="checkbox"] {
width: 1.25rem;
height: 1.25rem;
cursor: pointer;
accent-color: #42b72a;
}

input[type="number"], input[type="text"], select {
width: 4rem;
height: 2rem;
text-align: center;
background-color: #2d3748;
border: 1px solid #4a5568;
border-radius: 0.25rem;
padding: 0.25rem;
color: #fff;
direction: ltr;
}

input[type="text"] {
width: 10rem;
}

input[type="range"] {
width: 60%;
cursor: pointer;
accent-color: #4299e1;
}

#generateButton, #auditButton {
width: 100%;
padding: 1rem;
font-size: 1.1em;
font-weight: bold;
background-color: #42b72a;
color: white;
border: none;
border-radius: 0.5rem;
cursor: pointer;
transition: background-color 0.3s ease;
}
#auditButton {
background-color: #4299e1;
margin-top: 1rem;
}

#generateButton:hover {
background-color: #38a169;
}
#auditButton:hover {
background-color: #3182ce;
}

#generateButton:disabled, #auditButton:disabled {
background-color: #6b7280;
cursor: not-allowed;
}

.length-container {
display: flex;
align-items: center;
justify-content: space-between;
}

#lengthValue {
font-weight: bold;
background-color: #2d3748;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
border: 1px solid #4a5568;
}

.scrollable-list-container {
max-height: 250px;
overflow-y: auto;
border: 1px solid #4a5568;
border-radius: 0.5rem;
padding: 1rem;
background-color: #2d3748;
display: flex;
flex-direction: column;
gap: 0.75rem;
}

.password-item {
display: flex;
justify-content: space-between;
align-items: center;
background-color: #4a5568;
padding: 0.75rem;
border-radius: 0.375rem;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
direction: ltr;
}

.password-item-text {
font-size: 1em;
letter-spacing: 1px;
text-align: left;
direction: ltr;
word-wrap: break-word;
overflow-wrap: break-word;
flex-grow: 1;
color: #fff;
padding-right: 0.75rem;
}

.copy-btn {
background-color: #4299e1;
color: white;
border: none;
padding: 0.5rem 0.75rem;
border-radius: 0.25rem;
cursor: pointer;
font-weight: bold;
font-size: 0.8em;
transition: background-color 0.3s ease;
}

.copy-btn:hover {
background-color: #3182ce;
}

.strength-meter {
height: 0.5rem;
border-radius: 0.25rem;
margin-top: 1rem;
overflow: hidden;
background-color: #4a5568;
}

.strength-bar {
height: 100%;
transition: width 0.3s ease-in-out, background-color 0.3s ease-in-out;
}

.weak { background-color: #e53e3e; }
.medium { background-color: #ecc94b; }
.strong { background-color: #48bb78; }

#entropyValue {
text-align: center;
color: #a0aec0;
font-size: 0.9em;
margin-top: 0.5rem;
}

.error-message {
color: #fc8181;
font-size: 0.9em;
margin-top: -0.5rem;
display: none;
}

.hidden {
display: none !important;
}

.tab-buttons {
display: flex;
gap: 1rem;
margin-bottom: 1rem;
}
.tab-buttons button {
flex: 1;
padding: 0.75rem;
border: 1px solid #4a5568;
background-color: #2d3748;
color: #e2e8f0;
border-radius: 0.5rem;
cursor: pointer;
font-weight: bold;
transition: background-color 0.3s ease;
}
.tab-buttons button.active, .tab-buttons button:hover {
background-color: #4a5568;
}

#audit-input {
width: 100%;
height: 3rem;
background-color: #2d3748;
border: 1px solid #4a5568;
border-radius: 0.25rem;
color: #fff;
padding: 0.5rem;
resize: vertical;
direction: ltr;
}

#audit-results {
text-align: center;
font-size: 1.1em;
font-weight: bold;
margin-top: 1rem;
}
.breached {
color: #e53e3e;
}
.not-breached {
color: #48bb78;
}

/* Responsive Design */
@media (max-width: 600px) {
.dashboard-container {
padding: 1rem;
}
.card {
padding: 1rem;
}
.option {
flex-direction: column;
align-items: flex-end;
gap: 0.5rem;
}
.option label, .option input, .option select {
width: 100%;
}
.length-container, .length-container input {
width: 100%;
}
}
</style>
</head>
<body>

<div class="dashboard-container">
<h1>مولّد كلمات المرور الآمنة</h1>

<div class="tab-buttons">
<button id="generator-tab" class="active">مولّد</button>
<button id="audit-tab">فحص الأمان</button>
</div>

<div id="generator-section">
<div class="card">
<div class="option">
<label for="passphrase-mode">مولّد عبارة مرور</label>
<input type="checkbox" id="passphrase-mode">
</div>

<div id="password-options">
<div class="option length-container">
<label for="length">طول كلمة المرور:</label>
<input type="range" id="length" min="8" max="32" value="16">
<span id="lengthValue">16</span>
</div>
<div class="option">
<label for="uppercase">أحرف كبيرة (A-Z)</label>
<input type="checkbox" id="uppercase" checked>
<input type="number" id="min-uppercase" min="0" value="1">
</div>
<div class="option">
<label for="lowercase">أحرف صغيرة (a-z)</label>
<input type="checkbox" id="lowercase" checked>
<input type="number" id="min-lowercase" min="0" value="1">
</div>
<div class="option">
<label for="numbers">أرقام (0-9)</label>
<input type="checkbox" id="numbers" checked>
<input type="number" id="min-numbers" min="0" value="1">
</div>
<div class="option">
<label for="symbols">رموز (!@#$)</label>
<input type="checkbox" id="symbols" checked>
<input type="number" id="min-symbols" min="0" value="1">
</div>
<div class="option">
<label for="excludeSimilar">استثناء أحرف متشابهة (0, O, l, 1...)</label>
<input type="checkbox" id="excludeSimilar">
</div>
<div class="option">
<label for="preventDuplicates">منع تكرار الأحرف المتجاورة</label>
<input type="checkbox" id="preventDuplicates">
</div>
<div class="option">
<label for="prefix-input">بادئة (Prefix):</label>
<input type="text" id="prefix-input">
</div>
<div class="option">
<label for="suffix-input">لاحقة (Suffix):</label>
<input type="text" id="suffix-input">
</div>
<div class="option">
<label for="excludeChars">استثناء أحرف إضافية:</label>
<input type="text" id="excludeChars">
</div>
</div>

<div id="passphrase-options" class="hidden">
<div class="option">
<label for="word-count">عدد الكلمات:</label>
<input type="number" id="word-count" min="3" max="10" value="4">
</div>
<div class="option">
<label for="word-separator">فاصل الكلمات:</label>
<input type="text" id="word-separator" value="-">
</div>
<div class="option">
<label for="language-select">لغة الكلمات:</label>
<select id="language-select">
<option value="ar">عربي</option>
<option value="en">إنجليزي</option>
</select>
</div>
</div>
</div>

<div class="card">
<div class="option">
<label for="quantity">عدد كلمات المرور:</label>
<input type="number" id="quantity" min="1" max="50" value="5">
</div>
<span id="quantityError" class="error-message">الرجاء إدخال عدد صحيح موجب (1-50).</span>
<span id="separatorError" class="error-message hidden">لا يمكن أن يكون الفاصل فارغاً أو مسافات.</span>
</div>

<div class="strength-meter">
<div id="strengthBar" class="strength-bar"></div>
</div>
<div id="entropyValue"></div>

<button id="generateButton">أنشئ كلمات المرور</button>

<div class="scrollable-list-container">
<div id="passwordsList"></div>
</div>
</div>

<div id="audit-section" class="hidden">
<div class="card">
<h2>فحص كلمة مرور</h2>
<p>الصق كلمة مرورك هنا للتحقق من أمانها ووجودها في تسريبات البيانات المعروفة.</p>
<textarea id="audit-input" placeholder="الصق كلمة المرور هنا..."></textarea>
<button id="auditButton">فحص</button>
<div id="audit-results"></div>
</div>
</div>
</div>

<script>
// 1. تعريف مجموعات الأحرف وقوائم الكلمات
const uppercaseChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
const lowercaseChars = 'abcdefghijklmnopqrstuvwxyz';
const numberChars = '0123456789';
const symbolChars = '!@#$%^&*()_+-=[]{}|;:,.<>?';
const similarChars = '0Oo1lI|';
const wordLists = {
'en': ['library', 'sky', 'mountain', 'river', 'sea', 'book', 'pen', 'tree', 'city', 'happiness', 'hope', 'house', 'moon', 'sun', 'car', 'computer', 'keyboard'],
'ar': ['مكتبة', 'سماء', 'جبل', 'نهر', 'بحر', 'كتاب', 'قلم', 'شجرة', 'مدينة', 'سعادة', 'أمل', 'بيت', 'قمر', 'شمس', 'سيارة', 'حاسوب', 'لوحة'],
};
const defaultLanguage = document.documentElement.lang === 'ar' ? 'ar' : 'en';

// 2. الحصول على مراجع لعناصر HTML
const lengthSlider = document.getElementById('length');
const lengthValue = document.getElementById('lengthValue');
const quantityInput = document.getElementById('quantity');
const uppercaseCheckbox = document.getElementById('uppercase');
const lowercaseCheckbox = document.getElementById('lowercase');
const numbersCheckbox = document.getElementById('numbers');
const symbolsCheckbox = document.getElementById('symbols');
const minUppercase = document.getElementById('min-uppercase');
const minLowercase = document.getElementById('min-lowercase');
const minNumbers = document.getElementById('min-numbers');
const minSymbols = document.getElementById('min-symbols');
const excludeSimilarCheckbox = document.getElementById('excludeSimilar');
const preventDuplicatesCheckbox = document.getElementById('preventDuplicates');
const excludeCharsInput = document.getElementById('excludeChars');
const prefixInput = document.getElementById('prefix-input');
const suffixInput = document.getElementById('suffix-input');

const strengthBar = document.getElementById('strengthBar');
const entropyValueDisplay = document.getElementById('entropyValue');
const passwordsList = document.getElementById('passwordsList');
const generateButton = document.getElementById('generateButton');
const quantityError = document.getElementById('quantityError');
const passphraseModeCheckbox = document.getElementById('passphrase-mode');
const passwordOptionsDiv = document.getElementById('password-options');
const passphraseOptionsDiv = document.getElementById('passphrase-options');
const wordCountInput = document.getElementById('word-count');
const wordSeparatorInput = document.getElementById('word-separator');
const separatorError = document.getElementById('separatorError');
const languageSelect = document.getElementById('language-select');

const generatorTab = document.getElementById('generator-tab');
const auditTab = document.getElementById('audit-tab');
const generatorSection = document.getElementById('generator-section');
const auditSection = document.getElementById('audit-section');
const auditInput = document.getElementById('audit-input');
const auditButton = document.getElementById('auditButton');
const auditResultsDisplay = document.getElementById('audit-results');

// 3. تحديث الطول والقوة عند تغيير شريط التمرير
lengthSlider.oninput = function() {
lengthValue.textContent = this.value;
checkAndUpdateStrength();
};

// 4. دالة للتحقق من قوة كلمة المرور وعرض الأنتـروبـي
function checkAndUpdateStrength() {
if (passphraseModeCheckbox.checked) {
strengthBar.style.width = '0%';
strengthBar.className = 'strength-bar';
entropyValueDisplay.textContent = '';
return;
}

const length = parseInt(lengthSlider.value);
let charSetSize = 0;
if (uppercaseCheckbox.checked) charSetSize += uppercaseChars.length;
if (lowercaseCheckbox.checked) charSetSize += lowercaseChars.length;
if (numbersCheckbox.checked) charSetSize += numberChars.length;
if (symbolsCheckbox.checked) charSetSize += symbolChars.length;

// حساب الأنتـروبـي: H = L * log2(N) حيث L هو الطول وN هو حجم مجموعة الأحرف
const entropy = length * Math.log2(charSetSize > 0 ? charSetSize : 1);

// V3: استخدام عتبات الأنتـروبـي لتقييم قوة أكثر دقة
strengthBar.className = 'strength-bar';
let strengthPercentage = 0;
if (entropy < 60) {
strengthBar.classList.add('weak');
strengthPercentage = entropy / 60 * 40;
} else if (entropy < 100) {
strengthBar.classList.add('medium');
strengthPercentage = 40 + (entropy - 60) / 40 * 30;
} else {
strengthBar.classList.add('strong');
strengthPercentage = 70 + (entropy - 100) / 28 * 30; // الأنتـروبـي الأقصى لـ 32 حرف هو ~128 بت
strengthPercentage = Math.min(100, strengthPercentage);
}
strengthBar.style.width = strengthPercentage + '%';

entropyValueDisplay.textContent = `الأنتـروبـي: ${Math.round(entropy * 10) / 10} بت`;
}

// 5. دالة للتحقق من صحة إدخال الكمية
function validateQuantity() {
const count = quantityInput.value;
const isValid = count >= 1 && count <= 50;
if (!isValid) {
quantityError.style.display = 'block';
} else {
quantityError.style.display = 'none';
}
updateButtonState();
}

// 6. دالة للتحقق من صحة إدخال الفاصل
function validateSeparator() {
const separator = wordSeparatorInput.value.trim();
const isValid = separator.length > 0;
if (!isValid) {
separatorError.classList.remove('hidden');
} else {
separatorError.classList.add('hidden');
}
updateButtonState();
}

// 7. دالة للتحكم في حالة الزر بناءً على جميع التحققات
function updateButtonState() {
const isQuantityValid = quantityInput.value >= 1 && quantityInput.value <= 50;
const isSeparatorValid = wordSeparatorInput.value.trim().length > 0;

if (passphraseModeCheckbox.checked) {
generateButton.disabled = !isQuantityValid || !isSeparatorValid;
} else {
generateButton.disabled = !isQuantityValid;
}
}

// V3 - منطق توليد كلمة المرور المُحسّن
function createOnePassword() {
let excluded = excludeCharsInput.value.toLowerCase();
if (excludeSimilarCheckbox.checked) {
excluded += similarChars.toLowerCase();
}

let characterPool = '';
if (uppercaseCheckbox.checked) characterPool += uppercaseChars.split('').filter(char => !excluded.includes(char.toLowerCase())).join('');
if (lowercaseCheckbox.checked) characterPool += lowercaseChars.split('').filter(char => !excluded.includes(char)).join('');
if (numbersCheckbox.checked) characterPool += numberChars.split('').filter(char => !excluded.includes(char)).join('');
if (symbolsCheckbox.checked) characterPool += symbolChars.split('').filter(char => !excluded.includes(char)).join('');

if (characterPool.length === 0) {
alert('عذراً، كل الأحرف المتاحة تم استثناؤها. الرجاء تعديل خياراتك أو الأحرف المستثناة.');
return '';
}

const length = parseInt(lengthSlider.value);

let required = [];
let requirements = {
uppercase: uppercaseCheckbox.checked ? parseInt(minUppercase.value) : 0,
lowercase: lowercaseCheckbox.checked ? parseInt(minLowercase.value) : 0,
numbers: numbersCheckbox.checked ? parseInt(minNumbers.value) : 0,
symbols: symbolsCheckbox.checked ? parseInt(minSymbols.value) : 0
};

// V3 - التحقق من أن الطول المطلوب ليس قصيراً جداً
let totalRequired = requirements.uppercase + requirements.lowercase + requirements.numbers + requirements.symbols;
if (totalRequired > length) {
alert('أורך كلمة المرور قصير جداً لتلبية المتطلبات المحددة.');
return '';
}

// V3 - دالة للحصول على حرف عشوائي من مجموعة معينة
const getRandomCharFromSet = (set) => {
const filteredSet = set.split('').filter(char => !excluded.includes(char.toLowerCase())).join('');
if (filteredSet.length === 0) {
return '';
}
const randomArray = new Uint32Array(1);
window.crypto.getRandomValues(randomArray);
const randomIndex = randomArray[0] % filteredSet.length;
return filteredSet[randomIndex];
};

// V3 - إضافة الحد الأدنى من الأحرف المطلوبة أولاً
for (let i = 0; i < requirements.uppercase; i++) required.push(getRandomCharFromSet(uppercaseChars));
for (let i = 0; i < requirements.lowercase; i++) required.push(getRandomCharFromSet(lowercaseChars));
for (let i = 0; i < requirements.numbers; i++) required.push(getRandomCharFromSet(numberChars));
for (let i = 0; i < requirements.symbols; i++) required.push(getRandomCharFromSet(symbolChars));

// V3 - توليد الأحرف المتبقية
let passwordChars = required;
for (let i = passwordChars.length; i < length; i++) {
const randomArray = new Uint32Array(1);
window.crypto.getRandomValues(randomArray);
const randomIndex = randomArray[0] % characterPool.length;
passwordChars.push(characterPool[randomIndex]);
}

// V3 - خلط Fisher-Yates لخلط الأحرف المطلوبة والعشوائية
for (let i = passwordChars.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[passwordChars, passwordChars[j]] = [passwordChars[j], passwordChars];
}

// V3 - فحص ما بعد الخلط للتحقق من التكرار المتجاور
if (preventDuplicatesCheckbox.checked) {
let attempts = 0;
const maxAttempts = 100;
let isDone = false;
while (!isDone && attempts < maxAttempts) {
isDone = true;
for (let i = 0; i < passwordChars.length - 1; i++) {
if (passwordChars === passwordChars[i+1]) {
isDone = false;
const charToSwap = passwordChars[i+1];
let newChar = characterPool[Math.floor(Math.random() * characterPool.length)];
while(newChar === charToSwap || newChar === passwordChars) {
newChar = characterPool[Math.floor(Math.random() * characterPool.length)];
}
passwordChars[i+1] = newChar;
}
}
if (!isDone) {
// إعادة الخلط لتوزيع الأحرف بشكل أكثر توازناً
for (let i = passwordChars.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[passwordChars, passwordChars[j]] = [passwordChars[j], passwordChars];
}
}
attempts++;
}
}

const prefix = prefixInput.value || '';
const suffix = suffixInput.value || '';

return prefix + passwordChars.join('') + suffix;
}

function generatePassphrase() {
const wordCount = wordCountInput.value;
const separator = wordSeparatorInput.value;

// V3 - الحصول على اللغة من عنصر الاختيار الجديد
const language = languageSelect.value;
const words = wordLists[language] || wordLists['ar']; // الرجوع إلى "ar" في حالة عدم العثور على اللغة

let passphrase = [];
for (let i = 0; i < wordCount; i++) {
const randomIndex = Math.floor(Math.random() * words.length);
passphrase.push(words[randomIndex]);
}
return passphrase.join(separator);
}

function generateMultiplePasswords() {
passwordsList.innerHTML = '';

const count = quantityInput.value;
if (count < 1 || count > 50) {
return;
}

if (passphraseModeCheckbox.checked) {
const separator = wordSeparatorInput.value.trim();
if (separator.length === 0) {
return;
}
for (let i = 0; i < count; i++) {
const newPassphrase = generatePassphrase();
const passwordItem = createPasswordItem(i, newPassphrase);
passwordsList.appendChild(passwordItem);
}
} else {
for (let i = 0; i < count; i++) {
const newPassword = createOnePassword();
if (!newPassword) {
return;
}
const passwordItem = createPasswordItem(i, newPassword);
passwordsList.appendChild(passwordItem);
}
}
}

function createPasswordItem(index, text) {
const passwordItem = document.createElement('div');
passwordItem.className = 'password-item';

const passwordNumber = document.createElement('span');
passwordNumber.textContent = (index + 1) + '. ';

const passwordText = document.createElement('div');
passwordText.className = 'password-item-text';
passwordText.textContent = text;

const copyBtn = document.createElement('button');
copyBtn.className = 'copy-btn';
copyBtn.textContent = 'نسخ';

copyBtn.addEventListener('click', () => {
navigator.clipboard.writeText(text)
.then(() => {
copyBtn.textContent = 'تم النسخ!';
setTimeout(() => {
copyBtn.textContent = 'نسخ';
}, 2000);
})
.catch(err => console.error('Failed to copy: ', err));
});

passwordItem.appendChild(passwordNumber);
passwordItem.appendChild(passwordText);
passwordItem.appendChild(copyBtn);
return passwordItem;
}

function toggleOptions() {
if (passphraseModeCheckbox.checked) {
passwordOptionsDiv.classList.add('hidden');
passphraseOptionsDiv.classList.remove('hidden');
} else {
passwordOptionsDiv.classList.remove('hidden');
passphraseOptionsDiv.classList.add('hidden');
}
checkAndUpdateStrength();
updateButtonState();
}

async function auditPassword() {
const password = auditInput.value;
if (password.length === 0) {
auditResultsDisplay.textContent = 'الرجاء إدخال كلمة مرور.';
auditResultsDisplay.classList.remove('breached', 'not-breached');
return;
}

auditButton.disabled = true;
auditResultsDisplay.textContent = 'جاري الفحص...';
auditResultsDisplay.classList.remove('breached', 'not-breached');

try {
const hashBuffer = await crypto.subtle.digest('SHA-1', new TextEncoder().encode(password));
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();
const prefix = hashHex.substring(0, 5);
const suffix = hashHex.substring(5);

const response = await fetch(`
يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي
{prefix}`);

if (response.status === 404) {
auditResultsDisplay.textContent = 'لم يتم العثور على كلمة المرور في أي تسريبات!';
auditResultsDisplay.classList.add('not-breached');
} else if (response.ok) {
const text = await response.text();
const lines = text.split('\r\n');
const foundLine = lines.find(line => line.startsWith(suffix));

if (foundLine) {
const count = foundLine.split(':')[1];
auditResultsDisplay.textContent = `كلمة المرور هذه تم اختراقها ${count} مرة!`;
auditResultsDisplay.classList.add('breached');
} else {
auditResultsDisplay.textContent = 'لم يتم العثور على كلمة المرور في أي تسريبات!';
auditResultsDisplay.classList.add('not-breached');
}
} else {
auditResultsDisplay.textContent = 'خطأ في الاتصال بالخدمة. حاول مرة أخرى لاحقًا.';
auditResultsDisplay.classList.remove('breached', 'not-breached');
}
} catch (err) {
console.error(err);
auditResultsDisplay.textContent = 'حدث خطأ. الرجاء التحقق من اتصالك بالإنترنت.';
auditResultsDisplay.classList.remove('breached', 'not-breached');
} finally {
auditButton.disabled = false;
}
}

// إضافة مستمعي الأحداث
generatorTab.addEventListener('click', () => {
generatorTab.classList.add('active');
auditTab.classList.remove('active');
generatorSection.classList.remove('hidden');
auditSection.classList.add('hidden');
updateButtonState();
});

auditTab.addEventListener('click', () => {
auditTab.classList.add('active');
generatorTab.classList.remove('active');
auditSection.classList.remove('hidden');
generatorSection.classList.add('hidden');
updateButtonState();
});

generateButton.addEventListener('click', generateMultiplePasswords);
uppercaseCheckbox.addEventListener('change', checkAndUpdateStrength);
lowercaseCheckbox.addEventListener('change', checkAndUpdateStrength);
numbersCheckbox.addEventListener('change', checkAndUpdateStrength);
symbolsCheckbox.addEventListener('change', checkAndUpdateStrength);
minUppercase.addEventListener('input', checkAndUpdateStrength);
minLowercase.addEventListener('input', checkAndUpdateStrength);
minNumbers.addEventListener('input', checkAndUpdateStrength);
minSymbols.addEventListener('input', checkAndUpdateStrength);
excludeSimilarCheckbox.addEventListener('change', checkAndUpdateStrength);
preventDuplicatesCheckbox.addEventListener('change', checkAndUpdateStrength);
excludeCharsInput.addEventListener('input', checkAndUpdateStrength);
prefixInput.addEventListener('input', checkAndUpdateStrength);
suffixInput.addEventListener('input', checkAndUpdateStrength);
quantityInput.addEventListener('input', validateQuantity);
wordSeparatorInput.addEventListener('input', validateSeparator);
passphraseModeCheckbox.addEventListener('change', toggleOptions);
languageSelect.addEventListener('change', generateMultiplePasswords);
auditButton.addEventListener('click', auditPassword);
auditInput.addEventListener('input', () => {
auditResultsDisplay.textContent = '';
auditResultsDisplay.classList.remove('breached', 'not-breached');
});

// اختصارات لوحة المفاتيح
document.addEventListener('keydown', (e) => {
if (e.ctrlKey || e.metaKey) {
if (e.key === 'g' || e.key === 'G') {
e.preventDefault();
if (!generateButton.disabled) {
generateButton.click();
}
} else if (e.key === 'c' || e.key === 'C') {
e.preventDefault();
const firstPasswordCopyBtn = document.querySelector('#passwordsList .copy-btn');
if (firstPasswordCopyBtn) {
firstPasswordCopyBtn.click();
}
}
}
});

// استدعاءات أولية
toggleOptions();
checkAndUpdateStrength();
generateMultiplePasswords();
</script>
</body>
</html>



اتمنى ان يكون مفيد لكم​
 
شكرآ جزيلآ للأخ أحمد
برمجة جميلة
انا حفظت الكود بملف html.
و أضفت إسم المبرمج على الكود
و قللت طول الباسوورد الإفتراضى ل 10
و قللت عدد النواتج ل 1

zzz.PNG


يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي


الفحص :
يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي
 
التعديل الأخير:
توقيع : AabedKhalifaAabedKhalifa is verified member.
شكرآ جزيلآ للأخ أحمد
برمجة جميلة
انا حفظت الكود بملف html.
و أضفت إسم المبرمج على الكود
و قللت طول الباسوورد الإفتراضى ل 10
و قللت عدد النواتج ل 1

zzz.PNG


يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي


الفحص :
يجب عليك تسجيل الدخول او تسجيل لمشاهدة الرابط المخفي
هذه نسخة الاولية للمشروع تم تحسينها بكود جديد
 
عودة
أعلى