RIPEMD with Bouncy Castle Cryptography Library

June 24th, 2009

If someone asks you to make simple tool that creates a RIPEMD-160 message digest and output it in Base64 encoding what will you do?

This is how I started:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import org.bouncycastle.jce.provider.*;
import org.bouncycastle.util.encoders.Base64;
/**
 * Calculates RIPEMD-160 for an input message and output it in Base64 encoding
 * @author robert sicoie
 *
 */
public class RipeMD {
 
	private static void usage() {
		System.err.println(
"RipeMD <message>\n" +
"Calculates RIPEMD-160 for a given message and outputs it in Base64 encoding");
	}
 
	/**
	 * @param args message The message we want to calculate RIMEMD-160 for.
	 */
	public static void main(String[] args) {
		if (args.length < 1) {
			usage();
			System.exit(1);
		}
		String inputMessage = args[0];
		// Get the message digest generator
		JDKMessageDigest ripeDigest = new JDKMessageDigest.RIPEMD160();
		byte [] input = inputMessage.getBytes();
		byte [] output = ripeDigest.digest(input);
		String outputMessage = new String(Base64.encode(output));
		System.out.print(outputMessage);
	}
}

Bouncy Castle library makes it really easy!

Protocolul SOCKS

June 24th, 2009

Protocolul SOCKS este un protocol Internet care permite rutarea pachetelor de rețea între aplicații client server printr-un server proxy. SOCKS operează la nivelul 5 – Sesiune – al modelului OSI.

Server Proxy

Un server proxy este un server prin care se trimit cereri de la aplicații client care caută resurse pe alte servere. Aplicația client se conectează la un server proxy cerându-i niște servicii cum ar fi un fișier, o conexiune, o pagină web sau orice resursă disponibilă pe un alt server. Serverul proxy analizeză cererea conform regulilor lui de filtrare (poate filtra traficul pe baza adresei IP sau a protocolului de comunicare folosit). Dacă cererea este validată de către filtru, proxy-ul va pune la dispoziția aplicației client resursa cerută conectându-se la server și cerând informația în locul aplicației client. Uneori serverul proxy poate deservi cererea clientului fără a se mai conecta la serverul specificat. In acest caz el salvează într-o memorie tampon răspunsurile de la server pentru a le deservi mai tarziu la o eventuală nouă cerere client.

Un server proxy are două scopuri importante:

  • păstrează anonimatul mașinilor client.
  • Crește viteza de acces la resurse prin salvarea lor în memoria tampon.

Istoric

Protocolul a fost dezvoltat de David Koblas, un inginer de sistem de la MIPS Computer Systems si l-a făcut public în anului 1992.

Comparație cu proxy HTTP

SOCKS folosește un protocol de negociere pentru a informa despre conexiunea pe care clientul încearcă să o stabilească și poate fi folosit cu orice fel de conexiune prin socket TCP sau UDP.

Un proxy HTTP pe de altă parte analizează antetele HTTP trimise prin el pentru a deduce adresa serverului și din această cauză poate fi folosit numai pentru trafic HTTP.

Exemplul de mai jos descrie protocolul HTTP:

Bogdan vrea să descarce o pagină web de la Maria, care rulează un server web. Bogdan nu poate accesa direct serverul Mariei din cauza unui firewall care a fost pus în rețeaua lui. Ca să comunice cu serverul Mariei, Bogdan se conectează la serverul lui proxy HTTP. Navigatorul lui de internet comunică cu proxy-ul exact ca și cum ar fi serverul destinație: trimite antete HTTP standard. Proxy-HTTP citește cererea și se uită la antetul Host. Apoi se conectează la serverul specificat în antet și îi transmite datele serverului.

Vom vedea în continuare detaliile protocolului SOCKS.

SOCKS

Pachete TCP

Când o aplicație client bazată pe pachete TCP dorește să stabilească o conexiune cu o resursă accesibilă doar prin firewall, ea trebuie să deschidă o conexiune TCP pe serverul proxy. Serviciul SOCKS ascultă de obicei pe portul 1080. Dacă conexiune a reușește, clientul va cere negocierea metodei de autentificare folosită, se autentifică prin metoda aleasă, și trimite cererea pentru server. Proxy-ul SOCKS evaluează această cerere și stabilește conexiunea cu serverul sau refuză să o facă.

NOTĂ Valorile decimale din descrierea formatelor pachetelor reprezintă lungimea câmpului respectiv în octeți. Acolo unde un octet trebuie să ia o valoare anume, sintaxa X’hh’ este folosită și indica un singur octet în acel câmp.

Cereri

Clientul se conectează la proxy și trimite un identificator de versiune și mesajul de selecție a metodei folosite:

VER NMETHODS METHODS

Câmpul VER e setat la 05 pentru versiune a 5 a protocolului. Câmpul NMETHODS conține numărul de octeți care apar în câmpul METHODS.

Proxy-ul alege una din metodele date în METHODS și trimite un mesaj clientului:

VER METHOD

Dacă metoda selectată este FF nici una din metodele listate de client nu este acceptată, iar clientul trebuie să închidă conexiunea.

Valorile definite pentru câmpul METHOD sunt:

  • X’00′ NO AUTHENTICATION REQUIRED

  • X’01′ GSSAPI

  • X’02′ USERNAME/PASSWORD

  • de la X’03′ la X’7F’ IANA ASSIGNED

  • de la X’80′ la X’FE’ RESERVED FOR PRIVATE METHODS

  • X’FF’ NO ACCEPTABLE METHODS

Apoi urmează o subnegociere între client și server specifică metodei alese.

Odată ce subnegocierea specifică metodei s-a încheiat, clientul trimite proxy-ului detaliile cererii. Dacă metoda negociată include încapsulare pentru verificarea integrității sau confidențialitate, atunci aceste cereri trebuie încapsulate în detaliile metodei de autentificare.

Cererea SOCKS arată astfel:

VER CMD RSV ATYP DST.ADDR DST.PORT

Unde

  • VER este versiunea protocolului SOCKS: 5

  • CMD poate fi

    • CONNECT X’01′

    • BIND X’02′

    • UDP ASSOCIATE X’03′

  • RSV RESERVED

  • ATYP tipul adresei

    • adresă IP V4: X’01′

    • DOMAINNAME: X’03′

    • adresă IP V6: X’04′

  • DST.ADDR adresa destinației

  • DST.PORT portul destinației în format de rețea.

Serverul SOCKS va analiza cererea din punct de vedere al adreselor sursă și destinație și va returna unul sau mai multe mesaje în funcție de tipul cererii.

Răspunsuri

Cererea SOCKS este trimisă de către client imediat după ce a stabilit conexiunea cu proxy-ul și s-au terminat negocierile pentru autentificare. Proxy-ul evaluează cererea și dă un răspuns asemănător:

VER REP RSV ATYP BND.ADDR BND.PORT

Unde:

  • VER X’05′ versiunea protocolului

  • REP câmpul răspuns:

    • X’00′ succeeded

    • X’01′ general SOCKS server failure

    • X’02′ connection not allowed by ruleset

    • X’03′ Network unreachable

    • X’04′ Host unreachable

    • X’05′ Connection refused

    • X’06′ TTL expired

    • X’07′ Command not supported

    • X’08′ Address type not supported

    • de la X’09′ la X’FF’ neasignat

  • RSV Rezervat

  • ATYP tipul adresei

    • IP V4: X’01′

    • DOMAINNAME: X’03′

    • IP V6: X’04′

  • BND.ADDR

  • BND.PORT

Dacă metoda negociată include încapsulare pentru verificarea integrității sau confidențialitate, atunci aceste răspunsuri trebuie încapsulate în detaliile metodei de autentificare.

CONNECT

Dacă comanda cerută de client a fost CONNECT, BND.PORT va conține numărul portului asignat proxy-ului pentru conexiunea cu serverul, iar BND.ADDRva conține adresa IP asociată. BND.ADDR returnat este adesea diferit de adresa IP pe care clientul a folosit-o pentru a accesa proxy-ul SOCKS.

 

BIND

Cererea BIND este folosită în protocoale la care clientul trebuie sa accepte conexiuni de la server. FTP este un astfel de exemplu, folosind o conexiune client-la-server pentru comenzi dar poate folosi și o conexiune server-la-client pentru a transmite date.

 

Protocolul SOCKS cere ca partea de client a unei aplicații să facă cererea BIND numai pentru a crea o conexiune secundară după ce o conexiune primară a fost deja facută cu CONNECT. Serverul SOCKS va folosi DST.ADDR și DST.PORT pentru a evalua cererea BIND.

 

Serverul SOCKS trimite două răspunsuri clientului în timpul unei operații BIND.Primul este trimis după ce serverul crează și face bind pentru un nou socket. Câmpul BND.PORT va conține numărul portului pe care serverul SOCKS l-a asignat pentru o conexiune așteptată, iar BND.ADDR va conține adresa IP asociată. Cel de-al doilea răspuns este trimis clientului numai după ce conexiunea așteptată are succes sau a eșuat. BND.PORT și BND.ADDR vor conține adresa și portul serverului destinație.

Exemplu de utilizare

Tunel SSH

Unul dintre cele mai la îndemână servere proxy SOCKS este OpenSSH[4]. Dacă aveți un cont pe un calculator ce are OpenSSH instalat nu mai trebuie decât să deschideți o conexiune ssh pentru portforwarding. Să zicem că aveți numele de utilizator ‘ion’ pe serverul exemplu.ro Pe un calculator cu Linux instalat tot ce trebuie să faceți este să rulați comanda:

ssh -D 1080 -fCN ion@exemplu.ro

O să vă ceară parola pentru utilizatorul ion. Această comandă va porni un proces a carui stare o puteți. Puteți verifica faptul că procesul încă rulează cu comanda:

ps -ef | grep ssh | grep 1080

Pentru a face acestă operație pe Windows aveți nevoie de Putty[5]. Pentru a seta un tunel SSH pâna la exemplu.ro, mergeți la câmpul Connection->SSH->Tunnels, adăugați numărul portului pe care doriți să-l aveți local (în general 1080), selectați opțiunile Dynamic și Ipv4, iar apoi introduceți hostname-ul (exemplu.ro) sau IP-ul în câmpul Host Name din categoria Session. Salvați această sesiune și conectați-vă. Lăsați consola deschisă după conectare.

Setare navigator web (Mozilla Firefox)

Unul din scopurile pentru care ați dori să folosiți un server proxy este păstrarea anonimatului în timpul navigării pe internet. Pentru a seta un server proxy SOCKS în Mozilla Firefox, deschideți Edit->Preferences->Network->Settings. Bifați Manual proxy configuration. Setați câmpul SOCKS Host la localhost iar câmpul Port din dreptul lui 1080 (numărul portului pe care ați deschis portul)

Pentru a verifica faptul că datele transmise până la serverul proxy SOCKS sunt criptate și anonimatul dumneavoastră este asigurat putți folosi Wireshark[6] pentru a analiza cererile făcute în timpul navigării pe internet. De asemenea dacă deschideți o pagină web care vă determină IP-ul, veți observa că atunci când proxy-ul este setat va apărea adresa proxy-ului, nu a dumeavoastră.

Proxy transparent

Cu librării precum tsocks[7] puteți să utilizați aplicații de rețea precum ssh sau telnet prin proxy SOCKS. Trebuie însă să instalați și să configurați aceste librării, dar apoi utilizarea este extrem de simplă.

Securitate

Protocolul SOCKS este un protocol pentru nivelul sesiune pentru transmiterea de date prin firewall-uri IP. Securitatea acestei transmisii de date depinde de metodele de autenficare și încapsulare oferite de diverse implementări și selectate în timpul negocierii dintre clientul SOCKS și serverul SOCKS.

Referințe:

  1. IETF, RFC1928 – SOCKS Protocol Version 5, http://www.faqs.org/rfcs/rfc1928.html

  2. Wikipedia, http://en.wikipedia.org/wiki/Proxy_server
  3. Wikipedia, http://en.wikipedia.org/wiki/SOCKS
  4. OpenSSH, http://www.openssh.com
  5. Putty, http://www.chiark.greenend.org.uk/~sgtatham/putty/
  6. Wireshark, http://www.wireshark.org/
  7. TSOCKS, http://tsocks.sourceforge.net/

Ora Pământului

March 17th, 2009

Logo Ora Pământului Pe 28 Martie 2009, ultima sâmbătă a lunii, ora locală 20:30 se va sărbătorii Ora Pământului și la români. Pentru mai multe detalii consultați situl oficial pentru România.

The best beginner snowboard course

March 13th, 2009

Today I’ve found these movies. Awesome.

Drunk Japanese Guy Narrates Mario Land

March 11th, 2009

Phishing la conturile de la Raiffeisen Bank

March 4th, 2009

Zilele astea am primit două emailuri adresate clienților Raiffeisen Bank cu toate că eu nu fac parte din această categorie. Mai mult, mesajele au venit pe o adresă de email pe care nu o mai folosesc demult.

Primul email, venit ieri:

Phising email no.1

A se vedea diferența dintre link-ul din pagină și url-ul la care duce!!!

Al doilea email, venit azi era mult mai convigător:

mail2.png

Din nou, în email apare și link-ul spre „noua bază de date”, link care duce cu totul în altă parte și de data asta. Chiar în Peru! www.humtec.edu.pe pare a fi o școală din Peru.

Dacă pagina asta nu ar semăna atât de bine cu asta adevărată aș crede că a fost o joacă, dar așa se pare că e fraudă serioasă. Ba chiar așa anunță și Raiffeisen Bank.

watch the lan

November 26th, 2008

Long time no post.

This days I started to work on a new home project. I had an idea and I got very enthusiast. Soon, some results will be publicly available on Google code. But for more details go to project’s page.

Update 26.01.2009:

First working version commited :)

Stop accidentelor!

September 5th, 2008

FLOSS Camp 2008

September 3rd, 2008

thumb_flosscampWeekend-ul trecut a avut loc FLOSS Camp 2008 la Păltiniş. Aflată la prima ediţie, tabăra a avut o participare de 14 persoane. Mai multe informaţii despre eveniment găsiţi pe pagina dedicată întâlnirii

Update 6 Septembrie 2008:

Pentru poze vizitaţi:

Încearcă software liber

July 21st, 2008

incearcaGrupul pentru software liber a pornit o iniţiativă de promovare a software-ului liber prin scurte articole scrise în limba română despre diverse aplicaţii libere. Acestea se adresează tuturor utilizatorilor, indiferent de sistemul de operare folosit. Oricine simte nevoia, este invitat să scrie articole despre aplicaţii libere.