Por que a saída do algoritmo MacTripleDes no PowerShell não é estável?

14

Estou verificando os hashes de arquivo usando vários algoritmos diferentes no PowerShell. Quando uso o MacTripleDes, sempre recebo hashes diferentes. Todos os outros, como SHA256 ou MD5, sempre fornecem respostas confiáveis. Você pode replicar o problema no seu próprio computador:

"this is a test" | out-file test.txt
get-filehash test.txt -algorithm sha256
get-filehash test.txt -algorithm sha256
get-filehash test.txt -algorithm mactripledes
get-filehash test.txt -algorithm mactripledes

Eu recebo os mesmos valores de hash para os dois primeiros hashes, mas valores diferentes para os segundos dois hashes. O MacTripleDes deve ser usado de maneira diferente?

Algorithm       Hash                                                                   Path                                                                                                                      
---------       ----                                                                   ----                                                                                                                      
SHA256          3F8CB2CDF03347329CAB0C80A6CE3B01EF3B17AF02E0F6E101FA67CE63729F51       C:\temp\test.txt                                                                                                          
SHA256          3F8CB2CDF03347329CAB0C80A6CE3B01EF3B17AF02E0F6E101FA67CE63729F51       C:\temp\test.txt                                                                                                          
MACTRIPLEDES    904D74A529C7A739                                                       C:\temp\test.txt                                                                                                          
MACTRIPLEDES    AF720778A2C878A2                                                       C:\temp\test.txt   
user6722022
fonte
3
MACTripleDES é um algoritmo de hash com chave . O Get-FileHashcmdlet não parece oferecer suporte a um parâmetro-chave.
Jscott 12/12
Isso soa como um bug. Portanto, esse comentário parece ser a melhor resposta. Mas não vejo como marcá-lo como tal.
user6722022

Respostas:

18

MACTripleDES é diferente dos outros algoritmos oferecidos pelo Get-FileHashcmdlet. Não sei por que ele foi incluído no cmdlet, para ser sincero. Não combina com os outros, IMO.

SHA1, SHA256, MD5, RIPEMD, etc., essas são todas as funções de hash regulares. Eles pegam alguns dados de comprimento arbitrário e criam um resumo de comprimento fixo que representa esses dados. O MACTripleDES é diferente, pois não é apenas um algoritmo de hash. Ele possui TripleDES no nome e o 3DES é um algoritmo de criptografia, não um algoritmo de hash. A maior diferença entre funções hash e funções de criptografia é que a criptografia pode ser revertida com uma chave. Hashes são funções de mão única.

E MAC significa código de autenticação de mensagens. É um código usado para autenticar uma mensagem. Para verificar se não foi adulterado. Os MACs são projetados para serem efêmeros ou exclusivos de uma mensagem para a seguinte.

Confira o construtor :

 public MACTripleDES() {
        KeyValue = new byte[24]; 
        Utils.StaticRandomNumberGenerator.GetBytes(KeyValue);

        // Create a TripleDES encryptor 
        des = TripleDES.Create();
        HashSizeValue = des.BlockSize; 

        m_bytesPerBlock = des.BlockSize/m_bitsPerByte;
        // By definition, MAC-CBC-3DES takes an IV=0.  C# zero-inits arrays,
        // so all we have to do here is define it. 
        des.IV = new byte[m_bytesPerBlock];
        des.Padding = PaddingMode.Zeros; 
        ...

StaticRandomNumberGenerator gera números aleatórios ... números aleatórios significa que o resultado será diferente a cada execução.

Ryan Ries
fonte
Sim, é bastante inútil aqui. Em um uso adequado, você deve passar uma chave conhecida para o construtor ou recuperar a chave aleatória do KeyedHashAlgorithmobjeto. Mas não há nenhuma maneira de fazer tanto com Get-FileHash...
Bob
1
Se Get-FileHashnão permitir que você especifique a chave a ser usada e, em vez disso, gerar uma chave aleatória que nunca expõe ao usuário, isso parece ser um bug (conforme o título original da pergunta), pois você não pode realmente usar para qualquer coisa. (Não que eu entendo por que você iria pegar MACTripleDES em primeiro lugar se você queria um MAC.)
Håkan Lindqvist
@ HåkanLindqvist Entendo o seu ponto, mas depende da sua definição de bug. Se o código faz o que ele deveria fazer, mesmo que faça algo totalmente inútil , ainda não é um erro no meu livro. É uma solicitação de alteração de design, ou seja, "Altere o cmdlet para que ele realmente faça algo útil". :)
Ryan Ries
@RyanRies Mesmo assim, é realmente razoável supor que isso se destina? Existe algo além do código em si e de seu comportamento que apóia a idéia de que a opção do algoritmo MACTripleDES Get-FileHashdeve ser alguma forma de RNG complicado?
Håkan Lindqvist