Entrar
Home
Biblioteca
Wiki
Aprender
Galeria
Downloads
Suporte
Fóruns
Blogs
Resources For IT Professionals
Brasil (Português)
Россия (Pусский)
中国(简体中文)
United States (English)
Escrever um artigo
Wikis - Detalhes da Página
Primeira publicação por
Matheus Kamphorst
(Microsoft Partner, Microsoft Community Contributor)
Quando:
24 out 2012 7:29
Última revisão por
Matheus Kamphorst
(Microsoft Partner, Microsoft Community Contributor)
Quando:
24 out 2012 7:32
Revisões:
2
Comentários:
0
Tópicos Populares
Active Directory
Windows 7
SQL Server
Hyper-V
Ajuda & Opinião
Sobre o TechNet Wiki
Como Participar
Iniciando
Como Contribuir
Regras
Código de Conduta
Conselho da Comunidade
Como Obter Ajuda
Opnião sobre o Site
Popular Contributors
Brasil (Português)
»
artigos TechNet
»
Criptografia de textos com chave utilizando Powershell
Criptografia de textos com chave utilizando Powershell
Artigo
Histórico
Criptografia de textos com chave utilizando Powershell
Criptografando
Descriptografando
Referencias
Introdução
Em algum momento durante nossa vida de scripting guy, vamos precisar criptografar um texto no powershell,
seja por questões de segurança, por exemplo um script que vá salvar alguma senha em um banco de dados, ou enviar algum dado por email
que não posa ser lido por qualquer um.
Nesse artigo veremos o passo a passo de como trabalhar com criptografia de textos utilizando uma chave no Powershell.
Criptografando
Bem o primeiro passo é criptografar um texto, para isso utilizamos o bloco de scripts a baixo (Explicações depois):
$IV = (0x50,0x08,0xF1,0xDD,0xDE,0x3C,0xF2,0x18,0x44, 0x74, 0x19, 0x2C, 0x53, 0x49, 0xAB, 0xBC)
$Chave = [Text.Encoding]::ASCII.GetBytes("ChaveDeCriptografiaCom32Letras..")
$BytesTexto = [Text.Encoding]::UTF8.GetBytes("esse texto vai ser criptografado e é uma mensagem secreta para a technet wiki!")
$Rijndael = new-Object System.Security.Cryptography.RijndaelManaged
$Rijndael.KeySize = 256
$ms = new-Object IO.MemoryStream
$c = new-Object Security.Cryptography.CryptoStream $ms,$Rijndael.CreateEncryptor($Chave,$IV),"Write"
$sw = new-Object IO.StreamWriter $c
$sw.write($BytesTexto,0,$BytesTexto.Length)
$sw.Close()
$c.Close()
$ms.Close()
$Rijndael.Clear()
[byte[]]$result = $ms.ToArray()
$encstring = [Convert]::ToBase64String($result)
Write-Host "Texto criptografado: "$encstring
As explicações por linha são:
determina o vetor de inicialização para o algorítimo de criptografia na variável $IV.
Pega os bytes da chave de criptografia .
Pega os bytes do texto a ser criptografado.
Cria um novo objeto do tipo RijndaelManaged, que vai ser utilizado para criptografar o texto.
Determina o tamanho da chave de criptografia.
Cria um novo objeto MemoryStream.
Cria o objeto CryptoStream passando como parâmetro o encriptador e a chave de criptografia.
Cria um objeto de Stream Writer passando o criptostream.
Escreve a os bytes do texto e a sua lagura no stream do criptografador.
Fecha o objetos criado anteriormente.
Fecha o objetos criado anteriormente.
Fecha o objetos criado anteriormente.
Fecha o objetos criado anteriormente.
Salva no Result a Array presente na MemoryStream.
Converte o resultado final de bytes para uma string com base 64.
Exibe o texto criptografado na tela.
Um pouco complicado? sim também acho sugiro algumas leituras complementares para entender melhor o funcionamento desse processo
http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspx
Descriptografando
Tão importante quanto criptografar é saber como descriptografar, a baixo segue o código para descriptografar e em seguida as explicações:
$IV = (0x50,0x08,0xF1,0xDD,0xDE,0x3C,0xF2,0x18,0x44, 0x74, 0x19, 0x2C, 0x53, 0x49, 0xAB, 0xBC)
$Chave = [Text.Encoding]::ASCII.GetBytes("ChaveDeCriptografiaCom32Letras..")
$BytesTextoCriptografado = [Convert]::FromBase64String("mFoSdEP4Ua5ZXYAUs19BpbNYy44PG7h/2YGJe9xl4qjPPE2gggeQq9In5NqOEi89yaNNSj1ZBkc6opom+7MTtUEL7z8RAolIfLIK109G1V4=")
$Rijndael = new-Object System.Security.Cryptography.RijndaelManaged
$Rijndael.KeySize = 256;
$ms = new-Object IO.MemoryStream
$c = new-Object Security.Cryptography.CryptoStream $ms,$Rijndael.CreateDecryptor($Chave,$IV),"Write"
$c.write($BytesTextoCriptografado, 0,$BytesTextoCriptografado.Length)
$c.FlushFinalBlock();
$TextoLimpo = [Text.Encoding]::UTF8.GetString($ms.ToArray())
$c.Close()
$ms.Close()
Write-Host $TextoLimpo
Vamos então as explicações,
Determina o vetor de inicialização para o algorítimo de descriptografia na variável $IV.
Determina chave de descriptografia.
Recebe o texto cifrado e pega os bytes do mesmo.
Cria objeto RijndaelManaged.
Determina tamanho da chave.
Cria um novo objeto MemoryStream.
Cria o objeto CryptoStream passando como parâmetro o decryptor e a chave de descriptografia.
Aqui é onde a magica rola, utiliza o CryptoStream para descriptografar os bytes do texto cifrado.
Limpa o crypto.
Converte os bytes descriptografados para string.
Fecha objetos abertos.
Fecha objetos abertos.
Retorna o texto decifrado!
Função Pronta
Então já sabemos como cifrar e decifrar que tal montarmos uma função para facilitar o processo?
Function Get-Crypto($Texto,$Senha,$Acao){
switch ($Acao){
"Decrypt" {
write-host "Decifrando $texto com a senha: $senha"
$IV = (0x50,0x08,0xF1,0xDD,0xDE,0x3C,0xF2,0x18,0x44, 0x74, 0x19, 0x2C, 0x53, 0x49, 0xAB, 0xBC)
$Chave = [Text.Encoding]::ASCII.GetBytes($Senha)
$BytesTextoCriptografado = [Convert]::FromBase64String($Texto)
$Rijndael = new-Object System.Security.Cryptography.RijndaelManaged
$Rijndael.KeySize = 256;
$ms = new-Object IO.MemoryStream
$c = new-Object Security.Cryptography.CryptoStream $ms,$Rijndael.CreateDecryptor($Chave,$IV),"Write"
$c.write($BytesTextoCriptografado, 0,$BytesTextoCriptografado.Length)
$c.FlushFinalBlock();
$TextoLimpo = [Text.Encoding]::UTF8.GetString($ms.ToArray())
$c.Close()
$ms.Close()
$TextoLimpo
}
"Encrypt" {
write-host "Cifrando $Texto com a senha: $Senha"
$IV = (0x50,0x08,0xF1,0xDD,0xDE,0x3C,0xF2,0x18,0x44, 0x74, 0x19, 0x2C, 0x53, 0x49, 0xAB, 0xBC)
$Chave = [Text.Encoding]::ASCII.GetBytes($Senha)
$BytesTexto = [Text.Encoding]::UTF8.GetBytes($Texto)
$Rijndael = new-Object System.Security.Cryptography.RijndaelManaged
$Rijndael.KeySize = 256
$ms = new-Object IO.MemoryStream
$c = new-Object Security.Cryptography.CryptoStream $ms,$Rijndael.CreateEncryptor($Chave,$IV),"Write"
$sw = new-Object IO.StreamWriter $c
$sw.write($BytesTexto,0,$BytesTexto.Length)
$sw.Close()
$c.Close()
$ms.Close()
$Rijndael.Clear()
[byte[]]$result = $ms.ToArray()
$encstring = [Convert]::ToBase64String($result)
$encstring
}
}
}
um exemplo de utilização dessa função:
Get-Crypto -Texto "Mensagem secreta!!!!" -Senha "ChaveDeCriptografiaCom32Letras.." -Acao "Encrypt"
Get-Crypto -Texto "1yxT0dGwtzFUbJy8veh/NsriGJMg0rAHQnTSFHfoHrI=" -Senha "ChaveDeCriptografiaCom32Letras.." -Acao "Decrypt"
Referencias
Esse artigo foi feito com conhecimento adquiro da necessidade de efetuar a criptografia de dados via script, originalmente esse codigo foi feito em C# pelo meu amigo Lucas Pfeiffer do blog
http://muitomaisque.net/
e eu fiz a conversão para Powershell.
Você pode ler mais sobre
Rijndael
no link na msdns
http://technet.microsoft.com/pt-br/library/dd347656.aspx
Artigo originalmente publicado por:
Matheus Kamphorst | Blog:
http://howtoserver.com
Criptografia chave
,
HowToServer
,
Matheus Kamphorst
,
PowerShell