openssl
é um fluxo de bytes.
O conteúdo de $user
é uma seqüência de não-0 bytes (que pode ou não formar caracteres válidos em UTF-8 ou outro conjunto de caracteres / codificação).
printf %s "$user"
é um fluxo de bytes.
printf %s "$user" | openssl dgst -sha256 –binary
Conectará o stdout de printf
com o stdin de openssl
. O stdout de openssl
é outro fluxo de bytes.
Agora, se você estiver inserindo $user
do usuário em um terminal, o usuário entrará pressionando as teclas do teclado. O terminal enviará caracteres correspondentes (conforme escritos no rótulo da chave) codificados em seu conjunto de caracteres configurado. Normalmente, esse conjunto de caracteres será baseado no conjunto de caracteres da localidade atual. Você pode encontrar o que é isso com locale charmap
.
Por exemplo, com uma localidade como fr_FR.iso885915@euro
e uma xterm
iniciada nessa localidade, locale charmap
retornará ISO-8859-15
. Se o usuário inserir stéphane
como o nome de usuário, esse é
provavelmente será codificado como 0xe9
byte porque é assim que é definido no conjunto de caracteres ISO-8859-15
.
Se você quiser que é
seja codificado como UTF-8 antes de passar para openssl
, é onde você usa iconv
para converter esse 0xe9
byte na codificação correspondente em UTF-8 (dois bytes: 0xc3
0xa9
):
IFS= read -r user # read username from stdin as a sequence of bytes
# assumed to be encoded from characters as per the
# locale's encoding
printf %s "$user" |
iconv -t utf-8 | # convert from locale encoding to UTF-8
openssl dgst -sha256 –binary