Entropia aleatória em Bash

Entropia aleatória em Bash

Ao usar números aleatórios em Bash, a questão da entropia aleatória será mais cedo ou mais tarde. Este artigo ajudará você a entender o que é a entropia, como ela pode ser modificada e otimizada em Bash e como isso afetará a geração de números aleatórios.

Neste tutorial, você aprenderá:

  • Como gerar entropia aleatória em Bash
  • Como pré-semear o gerador de números aleatórios em Bash
  • Exemplos demonstrando geração de entropia aleatória em Bash
Entropia aleatória em Bash

Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
Categoria Requisitos, convenções ou versão de software usada
Sistema Independente da distribuição Linux
Programas Linha de comando Bash, sistema baseado em Linux
Convenções # - requer que o Linux -Commands seja executado com privilégios de raiz diretamente como usuário root ou por uso de sudo comando
$-exige que o Linux-Commands seja executado como um usuário não privilegiado regular

Exemplo 1: aleatório ou não tão aleatório?

Podemos facilmente gerar um número aleatório em Bash:

$ eco $ aleatórios 13 


No entanto, embora esse número pareça aleatório, na verdade não é, ou na melhor das hipóteses pseudo-aleatório. Isso ocorre porque um computador pode dentro e, por si só $ Aleatório variável/função.

Vamos pré-semear o gerador de números aleatórios de algumas maneiras diferentes. Começaremos ao pré-semear o gerador aleatório com a semente '1', configurando ALEATÓRIO para 1:

$ echo $ aleatório 25552 $ aleatório = 1 $ echo $ aleatório 16807 $ aleatório 20034 

Observe que o 16807 e chamada secundária 15089 Os resultados permanecem os mesmos enquanto o gerador aleatório foi pré-semeado com 1. Muda quando pré-semeado com a.

Enquanto o $ Aleatório A variável no Bash sempre produzirá um número aleatório gerado pelo gerador de números aleatórios Bash, também é uma variável que, quando definida, pré-semeia o gerador aleatório. O desafio é que, se a semente for a mesma, o resultado (e a sequência!) também será o mesmo, como você pode ver ao estudar o exemplo acima.

Como o gerador aleatório é inicializado em seu sistema pode depender do sistema operacional Linux ou UNIX em uso, hardware usado e configuração. Vamos concordar imediatamente que não é uma maneira muito segura de gerar um número aleatório verdadeiro/real, daí os termos pseudo-aleatório e pseudo-aleatomidade. Dito isto, muito pode ser feito para torná -lo (muito) melhor.

Exemplo 2: Nosso próprio gerador de entropia aleatória

A única entrada que está disponível para o gerador aleatório é basicamente a semente passada para Aleatório =. Então, como podemos criar uma semente verdadeiramente aleatória para semear o gerador aleatório e criar entropia aleatória real (entropia: a qualidade da falta de previsibilidade)? A entropia aleatória é importante, especialmente no campo da segurança do computador.

Pense sobre esta pergunta; Como você pode fornecer (para bater) a entrada mais aleatória para usar como semente para geração de entropia aleatória?

Eu acredito que encontrei uma solução no código a seguir:



$ data +%s%n 1593785871313595555 # | -------- | < Selected part indicated $ date +%s%N | cut -b10-19 4418322030 $ date +%s%N | cut -b10-19 4914627208 $ date +%s%N | cut -b10-19 5282934388 $ date +%s%N | cut -b10-19 5635463163 $ date +%s%N | cut -b10-19 5967700148 $ date +%s%N | cut -b10-19 6322917009 $ RANDOM=$(date +%s%N | cut -b10-19) $ echo $RANDOM 16349 $ RANDOM=$(date +%s%N | cut -b10-19) $ echo $RANDOM 9713 

O final 9713 O resultado é quase verdadeiramente aleatório.

data +%s%n é uma combinação de %s que são os segundos desde então 1970-01-01 00:00:00 UTC - um número bastante único, mas ainda algo que poderia ser recalculado. E %N são nanossegundos. Em seguida, cortamos a entrada para pegar apenas os últimos 10 dígitos.

Isso significa que estamos passando o segundo (último 0-9 dígito) + o nanossegundo exato completo 000000000-999999999 para o gerador aleatório como uma semente. Isso seria tão bom quanto impossível de reconstruir, a menos que você capture o valor gerado antes de atribuí -lo. Quase verdadeiramente aleatório.

Isso também significa que você pode obter um número semi-aleatório de dígitos X simplesmente selecionando a parte mais granular do microssegundo:

data +%s%n | corte -b19-19 data +%s%n | corte -b18-19 data +%s%n | corte -b17-19 

O primeiro comando produzirá 1 dígito, os segundos 2 dígitos etc.

No entanto, quanto mais o seu corte fatia se torna (aumentando o corte comprimento), quanto menos pseudo-aleatório será o número, especialmente quando você cortar a parte dos segundos. Você também pode deixar de fora o %s, e reduza o tamanho do corte para ter uma chamada de sistema menos intensiva. Embora possa não importar uma única chamada de $ Aleatório, Seria importar se fosse chamado centenas de milhares de vezes.

Conclusão

Neste artigo, vimos como gerar entropia aleatória, de maneira razoavelmente aleatória. Embora nenhum gerador de entropia aleatório seja perfeito (e, portanto, qualquer número aleatório resultante dele), chegamos perto, chamando o tempo de nanossegundos. Também vimos como a pré-semear a variável de entropia do gerador aleatório com uma semente específica produzirá subsequentemente os mesmos resultados sempre que um número aleatório for gerado usando o $ Aleatório variável.

Atualize seus scripts com nosso inicializador de entropia aleatória ou informe -nos se você descobriu um melhor nos comentários abaixo. Quem mais está interessado em melhor entropia?!

Aproveitar!

Tutoriais do Linux relacionados:

  • Coisas para instalar no Ubuntu 20.04
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Mastering Bash Script Loops
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Como configurar um servidor OpenVPN no Ubuntu 20.04
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
  • Arquivos de configuração do Linux: os 30 primeiros mais importantes
  • Loops aninhados em scripts de basquete
  • Download do Linux
  • Linux pode obter vírus? Explorando a vulnerabilidade do Linux…