Como descriptografar uma string encriptada com HMACSHA1?
-
19-09-2019 - |
Pergunta
Eu sou um novato criptografia tentando passar alguns valores e para trás entre sistemas. I pode criptografar o valor, mas não consigo descobrir como para descriptografar na outra extremidade. Eu criei um simples aplicativo Windows Forms usando VB.NET. Tentando introduzir um valor e uma chave, criptografar e descriptografar para obter o valor original. Aqui está o meu código até agora. Qualquer ajuda muito apreciada. Obrigado.
Imports System
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text
Public Class Form1
Private Sub btnEncode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEncode.Click
Dim hmacsha1 As New HMACSHA1(Encoding.ASCII.GetBytes(txtKey.Text))
Dim hashValue As Byte() = hmacsha1.ComputeHash(Encoding.ASCII.GetBytes(txtValue.Text))
txtResult.Text = BytesToHexString(hashValue)
hmacsha1.Clear()
End Sub
Private Sub btnDecode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDecode.Click
'???
End Sub
Private Function BytesToHexString(ByVal bytes As Byte()) As String
Dim output As String = String.Empty
Dim i As Integer = 0
Do While i < bytes.Length
output += bytes(i).ToString("X2")
i += 1
Loop
Return output
End Function
End Class
Solução
HMAC-SHA1 é um one-way de hash , não um bidirecional criptografia algoritmo. Você não pode decifrá-lo. Eu não tenho tempo para fornecer o código de encriptação completa aqui - é um tema complicado, mas Barry Dorrans' "começando ASP.NET Segurança" iria dar-lhe um bom ponto de partida. (Apenas alguns dos que é específico do ASP.NET.) Você também pode assistir a sua DDD talk sobre o tema.
Outras dicas
Apenas para expandir a resposta de Jon, porque você provavelmente está se perguntando qual é o ponto de criptografar algo que você não pode descriptografar - HMAC-SHA1 é, como Jon disse, um hash. A cadeia de caracteres produzido não contém a informação original, mesmo em forma criptografada ... É apenas uma seqüência de bytes.
A beleza do hash, porém, é que qualquer tipo de mudança que você pode fazer na seqüência quase certamente irá resultar em uma mudança no resultado hash, eo resultado hash tende a ser relativamente pequeno. Por esta razão, hashs são muitas vezes utilizados para garantir que um pedaço de informação não foi adulterado.
Por exemplo,
Eu quero enviar Jon aqui uma mensagem - e eu quero que ele seja confiante de que um de seus companheiros não mudou a mensagem antes de sua leitura. Eu não posso simplesmente tirar o hash da minha mensagem e enviá que, juntamente, porque todos um causador problema teria que fazer é substituir a mensagem com um dos seus próprios, e fornecer um hash apropriado ...
No entanto, se eu fornecer a minha mensagem com um hash não da mensagem em si, mas sim da mensagem com alguns extras específica bytes que John e eu acordaram com antecedência, o fabricante de problema é derrotado. Jon sabe para adicionar os bytes extra (vulgarmente conhecido como salgar o hash) antes que ele hashes minha mensagem, mas o causador problemas não - por isso, se ele muda a mensagem, mesmo que ele funciona seu próprio hash Jon pode ver que algo está errado ...
Encyryption / Hashes são um negócio complicadas, e eu mal arranhamos a superfície mim - mas eu pensei que isso poderia dar-lhe um exemplo simples do que hashes são usados ??para ...
Outro uso muito comum é para manter as informações de local da sociedade - as pessoas não armazenar a senha, mas o hash da senha. Isto significa que mesmo se alguém conseguir nick seus dados de usuário, eles não são capazes de usá-lo para entrar em seu sistema.
Martin
Um simples one-way hash explicação de por que as pessoas gostariam de fazê-lo.
Vamos dizer que você tem uma conta de usuário com o nome de usuário e senha John Doe. Você armazenar o hash da seguinte string.
Primeiro nome, seu número favorito, e sua senha selecionada
Por exemplo: de hash = myHash ( "john7 @ password")
now hash = "qk239qa*@$)(*84509053903" or whatever
Agora que hash é seguro e não pode ser revertido de volta para descobrir o que o seu número favorito é na maioria dos casos. Para verificar se o hash é o caminho certo para o login, você re-hash de entrada fornecido (nome, seu número ou w / e, password) e se você conseguir o mesmo hash exata, é um negócio válido. wo0t não é ele completamente simples!
- devo usar a mesma chave para re-hash de meus dados?