JavaScript Python PHP
async function executar(values = { "length": "24", "lowercase": "true", "uppercase": "true", "numbers": "true", "symbols": "true" }) {
function integer(values, key, fallback, min, max) {
const raw = values[key] ?? String(fallback);
const value = Number(raw);
if (!/^\d+$/.test(raw) || !Number.isSafeInteger(value) || value < min || value > max)
throw new Error(`${key}: informe um inteiro entre ${min} e ${max}.`);
return value;
}
function secureInt(max) {
const buffer = new Uint32Array(1), limit = Math.floor(2 ** 32 / max) * max;
do {
crypto.getRandomValues(buffer);
} while (buffer[0] >= limit);
return buffer[0] % max;
}
async function runSecurityTool(kind, values) {
if (!crypto.subtle)
throw new Error('Esta ferramenta requer Web Crypto em HTTPS ou localhost.');
if (Object.values(values).some(value => value.length > 1000000))
throw new Error('Limite de entrada: 1 milhão de caracteres por campo.');
{
{
const length = integer(values, 'length', 24, 12, 128);
const groups = [values.lowercase !== 'false' && 'abcdefghijklmnopqrstuvwxyz', values.uppercase !== 'false' && 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', values.numbers !== 'false' && '0123456789', values.symbols !== 'false' && '!@#$%^&*()-_=+[]{}:,.?'].filter(Boolean);
if (!groups.length)
throw new Error('Selecione pelo menos um conjunto de caracteres.');
const alphabet = groups.join('');
const characters = groups.map(group => group[secureInt(group.length)]);
while (characters.length < length)
characters.push(alphabet[secureInt(alphabet.length)]);
for (let i = characters.length - 1; i > 0; i--) {
const j = secureInt(i + 1);
[characters[i], characters[j]] = [characters[j], characters[i]];
}
return { text: characters.join('') };
}
}
}
return await runSecurityTool("password", values);
}
import secrets
import re
def executar(values=None):
values = {'length': '24', 'lowercase': 'true', 'uppercase': 'true', 'numbers': 'true', 'symbols': 'true'} if values is None else values
if not isinstance(values, dict) or any(not isinstance(v,str) or len(v.encode('utf-16-le',errors='surrogatepass')) // 2 > 1000000 for v in values.values()): raise ValueError('Informe campos textuais de até 1 milhão de caracteres')
def integer(key):
raw = values.get(key,'')
if not re.fullmatch(r'[0-9]+',raw): raise ValueError('Informe inteiro válido: ' + key)
return int(raw)
def process(length=24, lowercase=True, uppercase=True, numbers=True, symbols=True):
results = []
if type(length) is not int or not 12 <= length <= 128 or any((type(x) is not bool for x in (lowercase, uppercase, numbers, symbols))):
raise ValueError('Comprimento ou seleção inválida')
groups = [chars for (enabled, chars) in [(lowercase, 'abcdefghijklmnopqrstuvwxyz'), (uppercase, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), (numbers, '0123456789'), (symbols, '!@#$%^&*()-_=+[]{}:,.?')] if enabled]
if not groups:
raise ValueError('Selecione um conjunto de caracteres')
alphabet = ''.join(groups)
chars = [secrets.choice(group) for group in groups]
while len(chars) < length:
chars.append(secrets.choice(alphabet))
for i in range(len(chars) - 1, 0, -1):
j = secrets.randbelow(i + 1)
(chars[i], chars[j]) = (chars[j], chars[i])
results.append(''.join(chars))
return results[0] if len(results) == 1 else results
result = process(length=integer('length'), lowercase=values.get('lowercase', 'true') != 'false', uppercase=values.get('uppercase', 'true') != 'false', numbers=values.get('numbers', 'true') != 'false', symbols=values.get('symbols', 'true') != 'false')
return {'text':result}
<?php
function executar($values = ['length'=>'24','lowercase'=>'true','uppercase'=>'true','numbers'=>'true','symbols'=>'true']) {
foreach ($values as $value) if (!is_string($value) || strlen($value)>1000000) throw new InvalidArgumentException("Informe campos textuais de até 1 milhão de bytes");
$integer = function ($key) use ($values) { $raw = $values[$key] ?? ""; if (!preg_match("/^[0-9]+$/D",$raw)) throw new InvalidArgumentException("Inteiro inválido: " . $key); return (int)$raw; };
$process = function ($length = 24, $lowercase = true, $uppercase = true, $numbers = true, $symbols = true) {
$results = [];
if (!is_int($length) || $length < 12 || $length > 128 || !is_bool($lowercase) || !is_bool($uppercase) || !is_bool($numbers) || !is_bool($symbols)) throw new InvalidArgumentException('Comprimento ou seleção inválida');
$groups = array_values(array_filter([$lowercase ? 'abcdefghijklmnopqrstuvwxyz' : null, $uppercase ? 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' : null, $numbers ? '0123456789' : null, $symbols ? '!@#$%^&*()-_=+[]{}:,.?' : null]));
if (!$groups) throw new InvalidArgumentException('Selecione um conjunto de caracteres');
$alphabet = implode('', $groups);
$chars = array_map(fn($group) => $group[random_int(0, strlen($group) - 1)], $groups);
while (count($chars) < $length) $chars[] = $alphabet[random_int(0, strlen($alphabet) - 1)];
for ($i = count($chars) - 1; $i > 0; $i--) {
$j = random_int(0, $i);
[$chars[$i], $chars[$j]] = [$chars[$j], $chars[$i]];
}
$results[] = implode('', $chars);
return count($results) === 1 ? $results[0] : $results;
};
$result = $process($integer('length'), (($values['lowercase'] ?? 'true') !== 'false'), (($values['uppercase'] ?? 'true') !== 'false'), (($values['numbers'] ?? 'true') !== 'false'), (($values['symbols'] ?? 'true') !== 'false'));
return ['text'=>$result];
}