Sie sind auf Seite 1von 24

UNIVERSIDADE ANHANGUERA UNIDERP

CENTRO DE EDUCAO A DISTNCIA


CURSO DE TCNOLOGIA EM ANLISE E DESENVOLVIMENTO DE
SISTEMAS

DESENVOLVIMENTO DE SOFTWARE SEGURO

Nome

RA

1 - Antnio Arantes Carvalho


2 - Dione Schmidt
3 - Erico Nobrega Ceclio
4 - Fbio Rodrigues Vian
5 Marco Antonio Diniz dos Santos Reis
6 - Rodrigo Vieira Correard

RA:
RA:
RA:
RA:
RA:
RA:

6787399445
7512583119
7566611984
6954466415
1299767305
7718627339

Atividade

Prtica

Supervisionada

(ATPS) entregue como requisito para


concluso

da

Desenvolvimento

disciplina
de

Software

Seguro, sob orientao do professortutor a distncia Walter Gima

POLO PINDAMONHANGABA
2015

SUMRIO
1

UNIVERSIDADE ANHANGUERA-UNIDERP

DESAFIO 2
OBJETIVO............................................................................................................2
ETAPA 1 - PASSO 1..............................................................................................3
ETAPA 1 - PASSO 2..............................................................................................4
ETAPA 1 - PASSO 3..............................................................................................5
ETAPA 2 - PASSO 1..............................................................................................6
ETAPA 2 - PASSO 2..............................................................................................6
ETAPA 2 - PASSO 3..............................................................................................7
ETAPA 3 - PASSO 1..............................................................................................8
ETAPA 3 - PASSO 2..............................................................................................9
ETAPA 4 - PASSO 1............................................................................................11
ETAPA 4 - PASSO 2............................................................................................11
ETAPA 4 - PASSO 3............................................................................................11
REFERNCIAS BIBLIOGRFICAS................................................................12

DESAFIO
Uma empresa de desenvolvimento de software sofreu diversos ataques em seus
sistemas de informaes, esses ataques causaram vrios prejuzos materiais, comprometendo
sua credibilidade no mercado de softwares. Para corrigir as falhas de segurana dos sistemas,
essa empresa contratou uma equipe de consultores para auxili-la.
Voc e sua equipe foram contratados para identificar e corrigir possveis falhas de segurana
nos sistemas da empresa e implantar os conceitos de desenvolvimento de software seguro
desde as primeiras fases de criao de seus Sistemas de Informaes.

UNIVERSIDADE ANHANGUERA-UNIDERP

RELATRIO 01 DESENVOLVENDO SOFTWARE SEGURO


1.1 Passo 1 (A necessidade de investir em segurana no desenvolvimento de sistemas) 4
1.2 Passo 2 (Princpios de Segurana) 5
RELATRIO 02 EVITANDO ESTOURO DE BUFFER 6
2.1 Breve Histria 6
2.2 Buffer Overflow 7
2.3 Stack Buffer Overflow 7
2.4 Heap Buffer Overflow 7
2.5 Off-by-One erros 8
2.6 Return-to-libc attack 8
2.7 Exemplo de estouro de buffer 9
2.8 Evitando o estouro de buffer 10
2.8.1 Escrever cdigo seguro 10
2.8.2 Invalidar a execuo de cdigo na pilha 10
2.8.3 Ferramentas do Compilador 11
2.8.4 Verificaes na altura da execuo 11
2.8.5 Runtime dinmica 12
RELATRIO 03 UTILIZANDO CRIPTOGRAFIA 12
3.1 Base64 - Conceito 12
3.2 MD5 - Conceito 13
3.3 SHA1 - Conceito 13
3.4 Base64 Na linguagem PHP 14
3.5 MD5 Na linguagem PHP 14
3.6 SHA1 Na Linguagem PHP 14
3.7 Base64 Na Linguagem Java 15
3.8 SHA1 Na Linguagem Java 15
3.9 MD5 Na Linguagem Java 15
3.10 Base64 Na Linguagem ASP 16
3.11 MD5 Na Linguagem ASP 19
3.12 SHA1 Na Linguagem ASP 19
3

UNIVERSIDADE ANHANGUERA-UNIDERP

3.12 Concluso Comparao entre os mtodos 20


BIBLIOGRAFIA 21
RELATRIO 01 DESENVOLVENDO SOFTWARE SEGURO
1.1 Passo 1 (A necessidade de investir em segurana no desenvolvimento de sistemas)

A falta de segurana em projetos de software uma das principais preocupaes das


organizaes. por meio das vulnerabilidades presentes em projetos de software que ocorre a
quebra de sigilo e roubo de informaes. Devido a esse fator, as organizaes esto buscando
adotar medidas cada vez mais rigorosas de proteo alinhadas s normas e metodologias de
segurana

(BRAZ,

2009).

As ameaas segurana das informaes dos negcios, de propriedade intelectual e a


privacidade das informaes pessoais esto aumentando. Assim, a necessidade de conter tais
ameaas, presentes a cada dia, faz com que o gerenciamento da segurana de informaes
ganhe mais importncia nas empresas. De acordo com um estudo realizado pela McAfee
(MCAFEE, 2009), o roubo de dados e violaes de crimes cibernticos pode ter custado para
as empresas, em 2008 mais que U$ 1 trilho em razo da perda de propriedade intelectual e
com gastos com reparao dos prejuzos. Se esses dados pudessem ser previstos certamente
poderiam ter sido evitados atravs da implementao de alguns modelos de segurana como:
ISO27001, ISO27002, SSE-CMM, entre outros; como indicado por (WAGNER, 2011).
Diante dessa demanda por Sistemas Informatizados, grande parte das empresas recorre
contratao de Software Houses para desenvolvimento de seus sistemas, sendo estes crticos,
ou que esto intimamente ligados a outros sistemas crticos operao da organizao. Muitas
vezes, existe a necessidade pela exposio externa dos dados para parceiros e clientes atravs
da Internet. Cresce tambm a importncia com a necessidade da segurana da informao,
visando proteger a informao contra os vrios tipos de agentes ameaadores, e com isto
procura - seminimizar os riscos ao negcio e garantir que a informao se mantenha ntegra,
para maximizar o retorno sobre os investimentos. Cruz, 2007 defende que necessrio se
preocupar com a segurana desde o desenvolvimento de softwares, com o objetivo de garantir
integridade e confiabilidade das informaes. A cada dia est sendo mais necessrio o
desenvolvimento de sistemas com menor probabilidade a falhas e com um nvel maior de
segurana.
4

UNIVERSIDADE ANHANGUERA-UNIDERP

1.2 Passo 2 (Princpios de Segurana)


Uma soluo de segurana adequada deve satisfazer os seguintes princpios:
Confidencialidade: Proteger informaes contra sua revelao para algum no autorizado
(interna ou externamente) e leitura e/ou cpia no autorizado. A informao deve ser
protegida independentemente da mdia que a contenha (mdia impressa ou digital). Deve-se
cuidar no apenas da proteo da informao como um todo, mas tambm de partes da
informao que podem ser utilizadas para interferir sobre o todo. No caso da rede, isto
significa que os dados, enquanto em trnsito, no sero vistos, alterados ou extrados da rede
por pessoas no autorizadas.
Integridade: A integridade consiste em proteger a informao contra modificao sem a
permisso explcita do proprietrio daquela informao. A modificao inclui aes como
escrita, alterao de contedo, alterao de status, remoo e criao de informaes. Deve-se
considerar a proteo da informao nas suas mais variadas formas, como por exemplo,
armazenada em discos ou fitas de backup. Integridade significa garantir que se o dado est l,
ento no foi corrompido, encontra-se ntegro. Isto significa que aos dados originais nada foi
acrescentado, retirado ou modificado. A integridade assegurada evitando-se alterao no
detectada de mensagens e o forjamento no detectado de mensagem (aliado violao de
autenticidade).
Disponibilidade: Consiste na proteo dos servios prestados pelo sistema de forma que eles
no sejam degradados ou se tornem indisponveis sem autorizao, assegurando ao usurio o
acesso aos dados sempre que deles precisar. Isto pode ser chamado tambm de continuidade
dos servios. Diz respeito eficcia do sistema, ao correto funcionamento da rede para que
quando a informao for necessria ela poder ser acessada.
Autenticidade: O controle de autenticidade est associado com identificao correta de um
usurio ou computador. O servio de autenticao em um sistema deve assegurar ao receptor
que a mensagem realmente procedente da origem informada em seu contedo. A verificao
de autenticidade necessria aps todo processo de identificao, seja de um usurio para um
sistema, de um sistema para o usurio ou de um sistema para outro sistema. Ela a medida de
5

UNIVERSIDADE ANHANGUERA-UNIDERP

proteo de um servio/informao contra a personificao por intrusos.


No-Repdio: a garantia de que um agente no consiga negar um ato ou documento de sua
autoria. Essa garantia condio necessria para a validade jurdica de documentos e
transaes digitais. No-Repdio s garantido quando houver Autenticidade e Integridade.
RELATRIO 02 EVITANDO ESTOURO DE BUFFER
2.1 Breve Histria
A documentao mais antiga de Buffer Overflow data de 1988. Foi uma das muitas
vulnerabilidades exploradas pelo Morris worm para se propagar pela internet. O programaalvo foi um servio Unix, chamado finger. Em 1995, Thomas Lopatic redescobriu sozinho o
buffer overflow e publicou seusachados na lista de e-mails da Bugtraq. Um ano depois, Elias
Levy (tambm conhecido como Aleph One), publicou na revista Phrack, o artigo Smashing
the Stack for Fun and Profit (Arrasando a Pilha por Diverso e Lucro), uma introduo
passo-a-passo para realizar um stack-based buffer overflow.
Desde ento, pelo menos 2 worms exploraram buffer overflows para comprometer um
nmero grande de sistemas. Em 2001, o Code Red Worm explorou um buffer overflow no ISS
(Internet Information Services) 5.0 da Microsoft e em 2003, o worm SQL Slammer colocou
em risco mquinas rodando Microsoft SQL Server 2000.
2.2 Buffer Overflow
O buffer overflow a forma de ataque baseado na explorao do mal uso de funes que
manipulam arrays. Esta vulnerabilidade pode estar presente em linguagens que no verificam
automaticamente se os limites de memria alocada para uma varivel foram respeitados
durante a execuo do programa.
Podem resultar em execuo errnea de um programa, acesso indevido s reas de memria,
terminao do programa ou uma possvel falha de segurana em um sistema.
A seguir sero apresentados alguns exemplos de estouro de buffer.
2.3 Stack Buffer Overflow
Ocorre quando certa quantidade de dados copiados para a estrutura maior que o buffer
6

UNIVERSIDADE ANHANGUERA-UNIDERP

declarado sobrescrevendo dados ali existentes. Isso acontece devido a no verificao atravs
de funes que validam o tamanho da informao antes de adicion-la. Sendo assim, a melhor
forma de evitar esse problema seria sempre validar todas as entradas do programa, proteger
cdigo utilizando o encapsulamento, por exemplo, onde as variveis destinadas a determinada
funo seja utilizada somente por ela.
Bibliotecas de tipos de dados abstratos bemescritas e testadas que centralizam e checam
automaticamente o gerenciamento de buffer, incluindo checar os limites, podem reduzir a
ocorrncia e impacto de estouros de buffer.
2.4 Heap Buffer Overflow
Um heap overflow um tipo de buffer overflow que ocorre na heap. Overflows na heap so
explorados de maneira diferente de overflows na pilha (stack overflow). Os dados na heap so
alocados dinamicamente pela aplicao, em tempo de execuo, e tipicamente, contm dados
do programa. A explorao feita corrompendo estes dados de uma maneira especfica para
causar sobrescrita em estruturas internas da aplicao, como listas de ponteiros.
Em regra, a tcnica de heap overflow sobrescreve links da memria de alocao dinmica e
substitui por um ponteiro de funo de chamada de um programa.
O sistema operacional Microsoft Windows implementa protees contra heap overflow
desde Windows XP SP2. Ele tambm pode atenuar essas ameaas atravs da utilizao de
Data Execution Prevention (DEP).
2.5 Off-by-One erros
Um erro off-by-one, tambm conhecido como um OBOB (off-by-one bug), um erro de
lgica que envolve uma condio de contorno. Muitas vezes ocorre, quando um ciclo repete
tempo demais ou muito pouco. Este problema pode surgir quando um programador comete
erros, tais como a utilizao de " menor ou igual a" onde " menor do que" deve ter sido
usado em uma comparao ou falha em ter em conta que uma sequncia comea em zero uma
vez que isto tambm pode ocorrer em um contexto matemtico.
Um erro comum off-by-one que resulta em um bug relacionado com a segurana causada
por mau uso da biblioteca padro C strncat. Um equvoco comum com strncat que o
encerramento nulo garantido que no vaiescrever para alm do comprimento mximo. Na
realidade, ele vai escrever um nulo e um byte encerra alm do comprimento mximo
7

UNIVERSIDADE ANHANGUERA-UNIDERP

especificado.
Uma abordagem que muitas vezes ajuda a evitar esses problemas a utilizao de variantes
destas funes que calcula o quanto de gravao com base no comprimento total do buffer,
em vez de o nmero mximo de caracteres para escrever. Essas funes
incluem strlcat e strlcpy, e so muitas vezes consideradas "mais seguras", porque eles tornam
mais fceis evitar que acidentalmente se escreva, passando do fim do buffer.

2.6 Return-to-libc attack


um ataque segurana do computador, que usualmente inicia com um buffer overflow em
que o endereo de retorno da funo chamada na pilha substitudo pelo endereo de outra
instruo, e uma parte da pilha sobrescrita para fornecer argumentos para est funo. Isto
permite que o atacante invoque uma funo preexistente sem precisar injetar cdigo malicioso
no programa.
Uma pilha no executvel pode impedir alguns ataques de buffer overflow, no entanto, no
pode impedir um ataque return-to-libc, porque nesse ataque somente o cdigo executvel j
existente utilizado. Por outro lado, esses ataques s podem chamar funes prexistente. Stack-smashing protection pode evitar ou impedir esse tipo de ataque, j que ele
detecta a corrupo da pilha e, possivelmente, eliminar o segmento comprometido.
2.7 Exemplo de estouro de buffer
Na funo a seguir temos um exemplo de estouro de buffer.
Void function (int a, int b, int c)
{char buffer1[5];
char buffer2 [10];
}
int main() { function(1,2,3);
}
O buffer1 ocupa 8 bytes e o buffer2 12, pois a memria s pode ser endereada em mltiplos
de words (4 bytes).Um FP necessrio para aceder s variveis a, b, c, buffer1 e buffer2.
8

UNIVERSIDADE ANHANGUERA-UNIDERP

Todas estas variveis so limpas aps a execuo da funo e no ocupam espao no ficheiro
executvel do programa.
void function (char *str) {
char buffer[16];
strcpy (buffer, str);
}
int main () {
char *str = "Eu sou maior do que 16 bytes"; // tamanho da string 28 bytes function (str);
}
Este programa causa garantidamente comportamento inesperado, uma vez que uma string, str,
de 28 bytes foi copiada para uma localizao de apenas 16 bytes (funo strcpy). Os bytes
extras ultrapassam o buffer e reescrevem o espao alocado para o FP, endereo de retorno, etc.
Isto por sua vez corrompe a stack ou pilha do processo. A funo usada para copiar a string
a strcpy, que no faz a verificao dos limites. Usar a funo strncpy como substituta ajuda a
prevenir o problema.
2.8 Evitando o estouro de buffer
As solues propostas para este tipo de problemas visam, sobretudo, a preveno de ataques
de larga escala a sistemas atravs das vulnerabilidades descritos acima. Estes mtodos podem
tornar a explorao dos buffers overflows, mas nenhum pode impedir todos os ataques.
2.8.1 Escrever cdigo seguro
Os buffers overflows so resultado de se colocar mais cdigo num buffer do que aquele que
este suposto ter. As funes de C como strcpy, strcat, sprintf e vsprintf trabalham com
strings que terminam com null e no executam verificao dos limites. A funo gets l o
input do stdin (normalmente o teclado) at um carcter newline ou EOF (End Of File) for
encontrado.
Assim a melhor maneira de evitar buffers overflows no permitir sequer que eles possam
ocorrer em primeiro lugar. Os programadores devem ser educadossobre como minimizarem o
uso de funes vulnerveis.

UNIVERSIDADE ANHANGUERA-UNIDERP

2.8.2 Invalidar a execuo de cdigo na pilha


Uma vez que o cdigo malicioso um input do programa, ele est na pilha e no na regio de
cdigo. Ento, a soluo mais simples impedir que pudessem ser executadas instrues da
pilha. Qualquer cdigo que tente executar outro cdigo presente na pilha causaria uma
violao de segmento. No entanto esta soluo no fcil de executar.
2.8.3 Ferramentas do Compilador
Ao longo dos anos, os compiladores so cada vez mais agressivos nas otimizaes e nas
verificaes que efetuam. Vrios compiladores avisam sobre o uso de funes pouco seguras
como o gets e o strcpy.
Por exemplo, o cdigo:
int main () {
char *str = (char *)malloc(10);// aloca 10 bytes para str
gets (str); // l do stdin e guarda em str
}
Quando compilado com o GCC devolve:
/tmp/cc203ViF.o: In function "main":
/tmp/cc203ViF.o(.text+0x1f): the "gets" function is dangerous and should not be used.
Alm de darem avisos, os compiladores modernos alteram a maneira como um programa
compilado, permitindo verificaes de limites ir para o cdigo compilado sem alterar a fonte.
Este tipo de ferramenta requer que o programa seja recompilado, o que pode ser complicado
se o programa no for open source. Entre essas ferramentas existe o Stackshield que copia o
endereo de retorno de uma funo para um lugar seguro no incio da funo. Quando a
funo termina, compara os endereos e aborta imediatamente a execuo se estes forem
diferentes.
2.8.4 Verificaes na altura da execuo
Uma aplicao tem acesso restrito para prevenir ataques. Este mtodo assenta na segurana do
10

UNIVERSIDADE ANHANGUERA-UNIDERP

cdigo previamente carregado antes da aplicaoser executada. Este componente prcarregado pode fornecer verses mais seguras das funes perigosas, ou ento garantir que os
endereos no so reescritos. Um exemplo a livraria libsafe.
2.8.5 Runtime dinmica
Evitar estouro de buffer atravs da implementao de um processo dinmico de preveno de
execuo em seu sistema. Condies de estouro de buffer e os riscos so detectados durante a
execuo do programa, neste mtodo, impedindo um ataque de estouro de ocorrer. Processos
de execuo diferentes incluem "canrio" --- que adiciona a linha "canrio" para a codificao
do seu programa e copia o endereo de retorno do programa. O ltimo mtodo serve como um
backup de informaes como um meio de regenerar a funcionalidade do programa uma vez
que um ataque de estouro for resolvido.
RELATRIO 03 UTILIZANDO CRIPTOGRAFIA
A seguir sero apresentados trs mtodos de criptografia: Base64, MD5 e SHA1. Logo aps
sero apresentados exemplos desses mtodos em cada linguagem. Ao final, os motivos pelos
quais os mtodos MD5 e SHA1 so mais fortes que o Base64.
3.1 Base64 - Conceito
um mtodo para codificao de dados para transferncia na internet. utilizado
frequentemente para transmitir dados binrios por meios de transmisso que lidam apenas
com texto, como por exemplo, para enviar arquivos anexos por e-mail.
Ela uma codificao de mo dupla, e usando uma segunda funo voc pode descobrir a
string original de uma string codificada.
constitudo por 64 caracteres ([A-Za-z0-9], "/" e "+") que deram origem ao seu nome. O
carcter "=" utilizado como um sufixo especial e a especificao original (RFC 989) definiu
que o smbolo "*" pode ser utilizado para delimitar dadosconvertidos, mas no criptografados,
dentro de um stream.
Esta codificao amplamente utilizada por aplicaes em conjunto com a linguagem de
marcao XML, possibilitando o armazenamento de dados binrios em forma de texto.

11

UNIVERSIDADE ANHANGUERA-UNIDERP

3.2 MD5 - Conceito


O MD5 (Message-Digest-algorithm 5) um algoritmo de hash de 128 bits unidirecional,
descrito na (RFC 1321), e muito utilizado por softwares com protocolo ponto-a-ponto (P2P,
ou Peer-to-Peer, em ingls) na verificao de integridade de arquivos e logins.
Uma hash md5 no pode ser transformada novamente no texto que lhe deu origem. O mtodo
de verificao , ento, feito pela comparao das duas hash (uma da mensagem original
confivel e outra da mensagem recebida). O MD5 tambm usado para verificar a integridade
de um arquivo atravs, por exemplo, do programa md5sum, que cria a hash de um arquivo.
Isto se pode tornar muito til para downloads de arquivos grandes, para programas P2P que
constroem o arquivo atravs de pedaos e esto sujeitos a corrupo dos mesmos. Como
autenticao de login utilizada em vrios sistemas operacionais Unix e em muitos sites com
autenticao.
3.3 SHA1 - Conceito
A famlia de SHA (Secure Hash Algorithm) est relacionada com as funes criptogrficas. A
funo mais usada nesta famlia, a SHA-1, usada numa grande variedade de aplicaes e
protocolos de segurana, incluindo TLS, SSL, PGP, SSH, S/MIME e IPSec. SHA-1 foi
considerado o sucessor do MD5. Em algumas correntes, sugerido que o SHA-256 ou
superior seja usado para tecnologia crtica. Os algoritmos SHA foram projetados pela National
Security Agency (NSA) e publicados como um padro do governo Norte-Americano.
Existem mais quatro variantes que foram lanadascom capacidades de sada aumentadas e um
design ligeiramente diferente: SHA-224, SHA-256, SHA-384, e SHA-512 por vezes
chamadas de SHA-2.
3.4 Base64 Na linguagem PHP
$string = 'O rato roeu a roupa do rei de Roma';
$codificada = base64_encode($string);
echo "Resultado da codificao usando base64: " . $codificada;
// TyByYXRvIHJldSBhIHJvcGEgZG8gcmVpIGRlIFJvbWE=
echo "

12

UNIVERSIDADE ANHANGUERA-UNIDERP

";
$original = base64_decode($codificada);
echo "Resultado da decodificao usando base64: " . $original;
// O rato roeu a roupa do rei de Roma
// Note que $original vai ser idntica a $string
?>
3.5 MD5 Na linguagem PHP
$string = 'O rato roeu a roupa do rei de Roma';
$codificada = md5($string);
echo "Resultado da codificao usando md5: " . $codificada;
// 54cf74d1acdb4037ab956c269b63c8ac
?>

3.6 SHA1 Na Linguagem PHP


$string = 'O rato roeu a roupa do rei de Roma';
$codificada = sha1($string);
echo "Resultado da codificao usando sha1: " . $codificada;
// b186b709f7cf5a1d98d413379a66e511df8d59a4
?>

3.7 Base64 Na Linguagem Java


import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;
public class TesteBase64{
13

UNIVERSIDADE ANHANGUERA-UNIDERP

public static void main(String args[]){


BASE64Encoder encoder = new BASE64Encoder();
String code = encoder.encodeBuffer("Teste Base64".getBytes());
//Vai imprimir "Teste Base64 -(codificado)- VGVzdGUgQmFzZTY0"
System.out.println("Teste Base64 -(codificado)- " + code);
BASE64Decoder decoder = new BASE64Decoder();
try{
byte[] decoded = decoder.decodeBuffer("VGVzdGUgQmFzZTY0");
//Vai imprimir "VGVzdGUgQmFzZTY0 -(decodificado)- Teste Base64"
System.out.println("VGVzdGUgQmFzZTY0 -(decodificado)- " + newString(decoded));
}catch(IOException ex){
}
}
}

3.8 SHA1 Na Linguagem Java


package main;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class HashTextTest {
public static void main(String[] args) throws NoSuchAlgorithmException {
System.out.println(sha1("test string to sha1"));
}
static String sha1(String input) throws NoSuchAlgorithmException {
MessageDigest mDigest = MessageDigest.getInstance("SHA1");
byte[] result = mDigest.digest(input.getBytes());
StringBuffer sb = new StringBuffer();
14

UNIVERSIDADE ANHANGUERA-UNIDERP

for (int i = 0; i < result.length; i++) {


sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
}
3.9 MD5 Na Linguagem Java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class CriptografiaMD5 {
private static MessageDigest md = null;
static {
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
}
}
private static char[] hexCodes(byte[] text) {
char[] hexOutput = new char[text.length * 2];
String hexString;
for (int i = 0; i < text.length; i++) {
hexString = "00" + Integer.toHexString(text[i]);
hexString.toUpperCase().getChars(hexString.length() - 2,
hexString.length(), hexOutput, i * 2);
}
return hexOutput;
}
public static String criptografar(String pwd) {
if (md != null) {
return new String(hexCodes(md.digest(pwd.getBytes())));
}
15

UNIVERSIDADE ANHANGUERA-UNIDERP

return null;
}
public static void main(String[] args){
String senha = "123456";
System.out.println(CriptografiaMD5.criptografar(senha));
senha = "132546";System.out.println(CriptografiaMD5.criptografar(senha));
}
}
3.10 Base64 Na Linguagem ASP
O cdigo abaixo esta cifrando o Nome Fabrizio Gianfratti e decifrando em ASP.

Imports System.Security.Cryptography
Imports System.IO
Imports System.Text
Public Class default2
Inherits System.Web.UI.Page
Private ChaveSecreta As String = "0987612345!@#$%&*"
Dim Texto As String = "Fabrizio Gianfratti"
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Response.Write(Cifrar(Texto, ChaveSecreta) & "
")
Response.Write(Decifrar(Cifrar(Texto, ChaveSecreta), ChaveSecreta))
End Sub
Private Function Cifrar(ByVal vstrTextToBeEncrypted As String, ByVal vstrEncryptionKey
As String) As String
Dim bytValue() As Byte
16

UNIVERSIDADE ANHANGUERA-UNIDERP

Dim bytKey() As Byte


Dim bytEncoded() As Byte
Dim bytIV() As Byte = {121, 241, 10, 1, 132, 74, 11, 39, 255, 91, 45, 78, 14, 211, 22, 62}
Dim intLength As Integer
Dim intRemaining As Integer
Dim objMemoryStream As New MemoryStream
Dim objCryptoStream As CryptoStream
Dim objRijndaelManaged As RijndaelManaged
vstrTextToBeEncrypted = TiraCaracteresNulos(vstrTextToBeEncrypted)
bytValue = Encoding.ASCII.GetBytes(vstrTextToBeEncrypted.ToCharArray)
intLength = Len(vstrEncryptionKey)
If intLength >= 32 Then
vstrEncryptionKey = Strings.Left(vstrEncryptionKey, 32)
Else
intLength = Len(vstrEncryptionKey)
intRemaining = 32 - intLength
vstrEncryptionKey = vstrEncryptionKey & Strings.StrDup(intRemaining, "X")
End If
bytKey = Encoding.ASCII.GetBytes(vstrEncryptionKey.ToCharArray)
objRijndaelManaged = New RijndaelManaged
Try
objCryptoStream = New CryptoStream(objMemoryStream,
objRijndaelManaged.CreateEncryptor(bytKey, bytIV), CryptoStreamMode.Write)
objCryptoStream.Write(bytValue, 0,bytValue.Length)
objCryptoStream.FlushFinalBlock()
bytEncoded = objMemoryStream.ToArray
objMemoryStream.Close()
17

UNIVERSIDADE ANHANGUERA-UNIDERP

objCryptoStream.Close()
Catch
End Try
Return Convert.ToBase64String(bytEncoded)
End Function
Private Function Decifrar(ByVal vstrStringToBeDecrypted As String, ByVal
vstrDecryptionKey As String) As String
Dim bytDataToBeDecrypted() As Byte
Dim bytTemp() As Byte
Dim bytIV() As Byte = {121, 241, 10, 1, 132, 74, 11, 39, 255, 91, 45, 78, 14, 211, 22, 62}
Dim objRijndaelManaged As New RijndaelManaged
Dim objMemoryStream As MemoryStream
Dim objCryptoStream As CryptoStream
Dim bytDecryptionKey() As Byte
Dim intLength As Integer
Dim intRemaining As Integer
Dim intCtr As Integer
Dim strReturnString As String = String.Empty
Dim achrCharacterArray() As Char
Dim intIndex As Integer
bytDataToBeDecrypted = Convert.FromBase64String(vstrStringToBeDecrypted)
intLength = Len(vstrDecryptionKey)
If intLength >= 32 Then
vstrDecryptionKey = Strings.Left(vstrDecryptionKey, 32)
Else
intLength = Len(vstrDecryptionKey)
18

UNIVERSIDADE ANHANGUERA-UNIDERP

intRemaining = 32 - intLength
vstrDecryptionKey = vstrDecryptionKey & Strings.StrDup(intRemaining, "X")
End If
bytDecryptionKey = Encoding.ASCII.GetBytes(vstrDecryptionKey.ToCharArray)
ReDim bytTemp(bytDataToBeDecrypted.Length)
objMemoryStream = New MemoryStream(bytDataToBeDecrypted)
Try
objCryptoStream = New CryptoStream(objMemoryStream, _
objRijndaelManaged.CreateDecryptor(bytDecryptionKey, bytIV), _
CryptoStreamMode.Read)
objCryptoStream.Read(bytTemp, 0, bytTemp.Length)
objCryptoStream.FlushFinalBlock()
objMemoryStream.Close()
objCryptoStream.Close()
Catch
End Try
Return TiraCaracteresNulos(Encoding.ASCII.GetString(bytTemp))
End Function
Private FunctionTiraCaracteresNulos(ByVal vstrStringWithNulls As String) As String
Dim intPosition As Integer
Dim strStringWithOutNulls As String
19

UNIVERSIDADE ANHANGUERA-UNIDERP

intPosition = 1
strStringWithOutNulls = vstrStringWithNulls
Do While intPosition > 0
intPosition = InStr(intPosition, vstrStringWithNulls, vbNullChar)
If intPosition > 0 Then
strStringWithOutNulls = Left$(strStringWithOutNulls, intPosition - 1) & _
Right$(strStringWithOutNulls, Len(strStringWithOutNulls) - intPosition)
End If
If intPosition > strStringWithOutNulls.Length Then
Exit Do
End If
Loop
Return strStringWithOutNulls
End Function
End Class

3.11 MD5 Na Linguagem ASP


private string GetMD5HashData(string data)
{
var md5 = MD5.Create();
byte[] hashData = md5.ComputeHash(Encoding.Default.GetBytes(data));
var returnValue = new StringBuilder();
for (int i = 0; i < hashData.Length; i++)
{
returnValue.Append(hashData[i].ToString());
}
return returnValue.ToString();
20

UNIVERSIDADE ANHANGUERA-UNIDERP

}
private bool ValidateMD5HashData(string inputData, string storedHashData)
{
string getHashInputData = GetMD5HashData(inputData);
if (string.Compare(getHashInputData, storedHashData) == 0)
{
return true;
}
else
{
return false;
}
}
3.12 SHA1 Na Linguagem ASP
private string GetSHA1HashData(string data)
{
SHA1 sha1 = SHA1.Create();
byte[] hashData = sha1.ComputeHash(Encoding.Default.GetBytes(data));
StringBuilder returnValue = new StringBuilder();
for (int i = 0; i < hashData.Length; i++)
{
returnValue.Append(hashData[i].ToString());
}
return returnValue.ToString();
}
private bool ValidateSHA1HashData(string inputData, string storedHashData)
{
string getHashInputData = GetSHA1HashData(inputData);
if (string.Compare(getHashInputData, storedHashData) == 0)
{
21

UNIVERSIDADE ANHANGUERA-UNIDERP

return true;
}
else
{
returnfalse;
}
}
3.12 Concluso Comparao entre os mtodos
Conforme pesquisa realizada, SHA1 e MD5 so mais fortes que o Base64, porque so
unidirecionais no sendo possvel decodificar os mesmos. O cdigo Base64 utilizado apenas
para mensagem da internet e ele converte a string/binrio de entrada em um dado codificado
com MIME base64, que pode ser facilmente decodificado pelo comando inverso,
base64_decode.

BIBLIOGRAFIA
BRAZ, F. Instrumentao da analise e projeto de software seguro baseada em ameaas e
padres. Tese (Doutorado em Engenharia Eltrica) Faculdade de Tecnologia, Braslia, 2009.
22

UNIVERSIDADE ANHANGUERA-UNIDERP

CRUZ, Edimar Fernando, et al. TSDD - Teste de segurana durante o desenvolvimento,


Unio Educacional Minas Gerais Uniminas Uberlndia, MG Brasil Artigo para
Especializao em Segurana da Informao, 2007.
MCAFEE. Cybercrime cost $1 trillion last year, study. 2009. Disponvel em: <
http://www.zdnet.com/article/cybercrime-cost-1-trillion-last-year-study/ >. Acesso em 15 mar.
2015.
WAGNER, Rosana. Processo de desenvolvimento de software confivel baseados em padres
de segurana. Tese (Mestre em Informtica) UFSM Universidade de Federal de Santa Maria
UFSM, Santa Maria-Rio Grande do Sul, 2011.
DEVMEDIA. Criptografia de dados 128 bits. Disponvel em: <
http://www.devmedia.com.br/criptografia-de-dados-128-bits/3112 >. Acesso em 21 mar.
2015.
EMILIO2HD. Usando base64 no Java. 2010. Disponvel em: < http://emilio2hd.com.br/
usando-base64-no-java/ >. Acesso em 20 mar. 2015.
GRIS. Buffer overflow Uma introduo Terica. 2008. Disponvel em: . Acesso em 18 mar.
2015.
INTOWEB.Criptografia com Sha-1 ou Base64. 2008. Disponvel em: <
http://intoweb.blogspot.com.br/2008/09/criptografia-com-sha-1-ou-base64.html >. Acesso em
20 mar. 2015.
LAFAPRO. O ataque por buffer overflow. 2005. Disponvel em: <
http://www.lafa.pro.br/pe/artigos/buffer_overflow-criandovirus.pdf >. Acesso em 20 mar.
2015.
SHA1 ONLINE. SHA1 Java. Disponvel em: < http://www.sha1-online.com/sha1-java/ >.
Acesso em 20 mar. 2015.

23

UNIVERSIDADE ANHANGUERA-UNIDERP

VESTCON. Princpios bsicos da segurana da informao. 2011. Disponvel em: . Acesso


em 15 mar. 2015.
VIRTUAL BASE. Como criar uma chave simples usando MD5 e SHA1. 2014. Disponvel
em: < http://blog.virtualbase.com.br/2014/03/Criptografia2.html#.VQ21bo7F_Mo >. Acesso
em 21 mar. 2015.
VIVA O LINUX. Princpios da segurana da informao. 2004. Disponvel em: . Acesso em
15 mar. 2015.
WIKIPEDIA. Return-to-libc attack. 2012. Disponvel em: . Acesso em 15 mar. 2015.
WIKIPEDIA. Off-by-one error. 2014. Disponvel em: . Acesso em 18 mar. 2015.
WIKIPEDIA. Heap overflow. 2012. Disponvel em: . Acesso em 18 mar. 2015.
WIKIPEDIA. Base64. 2012. Disponvel em: < http://pt.wikipedia.org/wiki/Base64 >. Acesso
em 20 mar. 2015.
WIKIPEDIA. MD5. 2012. Disponvel em: < http://pt.wikipedia.org/wiki/MD5 >. Acesso em
20 mar. 2015.
WIKIPEDIA. SHA1. 2012. Disponvel em: < http://pt.wikipedia.org/wiki/SHA1 >. Acesso
em 20 mar. 2015.

24

UNIVERSIDADE ANHANGUERA-UNIDERP

Das könnte Ihnen auch gefallen