Equivalente de String.getBytes () do Java no Unix Shell (Cygwin)

2

Digamos que eu converta minha string em array de bytes.

byte[] byte sUserID.getBytes(“UTF-8”);  //Convert User ID String to byte array    

Agora preciso escrever um script no Shell que tenha exatamente a mesma funcionalidade do meu código Java. Em algum momento eu devo hash minha matriz de bytes (usando MessageDigest.getInstance(“SHA-256”) em Java e openssl dgst -sha256 –binary no Shell), mas porque digests no código Java são gerados a partir de matrizes de bytes, eles não corresponderão aos resultados que recebo no Shell (no Shell I simplesmente seqüências hash no momento, então os formatos de entrada não correspondem).

Como minha entrada para openssl no shell deve ser semelhante à entrada Java, quero saber se existe uma maneira de "simular" o método getBytes() no Shell? Eu não tenho muita experiência na Shell, então não sei qual poderia ser a melhor abordagem neste caso. Alguma ideia? Felicidades!

    
por C_U 23.01.2015 / 15:29

1 resposta

4
O stdin de

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).

O stdout de

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 
    
por 23.01.2015 / 16:00