A resposta dada pelo @slm faz bom uso das ferramentas disponíveis no shell, mas quando combinadas com o seu '' scr.bash 'é um pouco complicado. Se você tem Python (versão 2.7 ou 3.x), aqui está um script que faz o mesmo trabalho de forma mais legível:
#!/usr/bin/env python
"""
Create a formulaic but reasonably strong password.
"""
import random
def shuffled_password():
"""Using one random member of special and num and three members each
from upper and lower return a shuffled string of their concatenation.
"""
num = list('012345789')
special = list('@#$%*-+')
upper = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
lower = list('abcdefghijklmnopqrstuvwxyz')
random.shuffle(num)
random.shuffle(special)
random.shuffle(upper)
random.shuffle(lower)
letters = [special[0], num[0]]
letters.extend(lower[0:3] + upper[0:3])
random.shuffle(letters)
s = ''.join(letters) # funny way to turn list of chars into string
return s
if __name__ == '__main__':
print(shuffled_password())
Eu escrevi este código no curso de explorar a complexidade combinatória de seu método. Alguém acima mencionou o uso de pwgen
; Inicialmente pensei que deveria ser mais strong que o seu método de homebrew, mas meu palpite estava errado.
Seu método, mesmo sem o shuffle(letters)
, produz 21 bilhões de combinações. Isso produz uma entropia estimada de 39 bits. Isso recebe uma classificação informal do Teste de Força de:
36 - 59 bits = Reasonable; fairly secure passwords for network and company passwords
Adicionando o shuffle final adiciona cerca de 5 bits de entropia para a mistura. Para referência,
pwgen --symbols --numerals
produz senhas com entropia estimada de 37 bits. Eu atribuo isso à tentativa do pwgen de produzir senhas "memorizáveis" que reduz o conjunto de saída de alguma forma. Isso ainda é "Razoável" de acordo com as categorias do Teste de Força.
Advertência: minha matemática combinatória, particularmente em permutações multiset é limitada, correções são bem-vindas.