ahmad mahamid

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

السلام عليكم
مرفق مولد كلمات مرور سهل للاستخدام ويودلك عدد غير محدود من كلمات المرور بسهولة .
السكربت مبني بـ 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


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


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