Хэшлэх функц

хэшлэх функц нь ямар нэгэн өгөгдлийг оролт болгон аваад, өгөгдлийг нууцлах болон баталгаажуулах байдлаар хэрэглэх боломжтой 32-256 битийн урттай шинэ мөр болгон буцаадаг. Нэгэнтээ хэшлээд ашиглаад явахад эх өгөгдлийг нь халдагч этгээд тайлж гарган авахад маш хэцүү.


    H(x) -> y

Хамгийн их хэрэглэгддэг хэшлэх алгоритмууд

  • crc32 - энийг ерөнхийдөө checksum байдлаар хэрэглэдэг, маш хурдтай хэшлдэг, нууцлалын хувьд тиймч найдвартай биш
  • md5 - хэшлэхдээ ер нь хурдтай маягтай, хүмүүс ихэнхидээ найдвартай нууцлалтай гэж боддогч тийм биш сүүлийн жилүүдэд их эвдэгдэж байгаа, хэрэв үнэхээр санаа зовохоор өгөгдөлтэй ажиллаж байгаа бол үүнийг хэрэглэх хэрэггүй
  • sha1 - хэшлэхэд хурдан биш ч боломжийн нууцлал үзүүлнэ, хамгийн их хэрэглэгдэх байдлаараа md5-ийн дараа орно
  • sha256 - энэ бол sha1-ийн арай том хувилбар нь, нууцлалын хувьд сайн, харин хэшлэхэд жаахан удаан

python хэлэнд hashlib хэмээх сан бий. Үүн дотор олон янзын хэшлэх алгоритмуудыг агуулсан байгаа. Өгөгдөл хэшлэхэд дараах байдлаар хэрэглэдэг.

import hashlib
mydata = "my secure password"

x = hashlib.md5(mydata).hexdigest()
print x

x = hashlib.sha256(mydata).hexdigest()
print x

гэх мэтээр хэш өгөгдлөө гаргаж авч хэрэглэнэ.

Вэб хөтөчийн cookie өгөгдлүүдийг хэрэглэгч дураараа өөрчилөн програмын үйл ажиллагааг бусниулахаас сэргийлэх зорилгоор cookie өгөгдлөө хэшлээд өгөгдөлтэй нь хамтад нь дайн хэрэглэж болно. Сервэр дээр cookie-ний өгөгдлийг хэшлээд хамт дайж явуулж байгаа хэш кодтой нь тулган хэрэглэгч cookie-г cheat хийх буюу өөрчилөхөөс сэргийлж болно. Жишээ нь:

    Set-Cookie: mydata=dorj,[dorj-hash]

H(dorj)==[dorj-hash] гэсэн үг.

import hashlib

def hash_str(s):
    return hashlib.md5(s).hexdigest()

def make_secure_value(s):
    return "%s,%s"%(s,hash_str(s))

Сервэр дээр күүки болон хэш өгөгдлөө тулгаж хэрэглэх

import hashlib

def hash_str(s):
    return hashlib.md5(s).hexdigest()

def make_secure_val(s):
    return "%s,%s" % (s, hash_str(s))

def check_secure_val(h):
    s      = h.split(",")[0]
    myhash = h.split(",")[1]
    if hash_str(s)==myhash:
        return s
    else:
        return None

Гэхдээ халдагч этгээд өгөгдөл болон хэш харгалзаа бүхий хүснэгттэй тохиолдолд энгийн хэшлэлтийг дорхноо тулгаж мэдчих магадлалтай. Тиймээс өгөгдлөө шууд хэшлэхгүйгээр програмд урьдчилаад тодорхойлсон нэмэлт нууц өгөгдөл ашиглан хэшлэх хэрэгтэй. Жишээ нь :
    SECRET="my very secret"
    H(SECRET+mydata) = [hash]

Энэ зорилгоор хэрэглэх HMAC нэртэй python сан байдаг.

import hashlib

SECRET="my very secret"
MYDATA="My Data"

hash = hashlib.md5(SECRET + MYDATA).hexdigest()
print hash

import hmac

SECRET="my very secret"
MYDATA="My Data"

hash = hmac.new(SECRET, MYDATA).hexdigest()
print hash

HMAC хэрэглэсэн күүкиг сервэр дээр тулгах

import hmac

SECRET = 'imsosecret'

def hash_str(s):
    return hmac.new(SECRET,s).hexdigest()

def make_secure_val(s):
    return "%s|%s" % (s, hash_str(s))

def check_secure_val(h):
    val = h.split('|')[0]
    if h == make_secure_val(val):
        return val

Нууц үгийг хэшлэж хадгалж байх хэрэгтэй.
Шууд хэшлэхийн оронд давс хэрэглэх хэрэгтэй. Тэгвэл халдагч этгээд урьдчилан бэлтгэсэн хүснэгтээ тулган хялбар нууц үгүүдийг гаргаж авах аюулаас сэргийлнэ. Энэ хүснэгтийг rainbow table гэж нэрлэдэг.

    salt = "davs"
    h = H(password + salt), salt

5 тэмдэгтийн урттай давс үүсгэх

import random
import string

def make_salt():
    return ''.join(random.choice(string.letters) for x in xrange(5))

print make_salt()
Давсаа ашиглан хэшлэх
import random
import string
import hashlib

def make_salt():
    return ''.join(random.choice(string.letters) for x in xrange(5))

def make_pw_hash(name, pw):
    salt = make_salt()
    return "%s,%s"%(hashlib.sha256(name+pw+salt).hexdigest(),salt)

import random
import string
import hashlib

def make_salt():
    return ''.join(random.choice(string.letters) for x in xrange(5))

def make_pw_hash(name, pw, salt=None):
    if not salt:
        salt = make_salt()
    h = hashlib.sha256(name + pw + salt).hexdigest()
    return '%s,%s' % (h, salt)

def valid_pw(name, pw, h):
    salt = h.split(",")[1]
    return make_pw_hash(name,pw,salt)==h

h = make_pw_hash('spez', 'hunter2')
print valid_pw('spez', 'hunter2', h)


Хэрэв нууц үгээ хэрэглэн сервэрт нэвтрэх үйлдэл хийвэл халдагч этгээд дундаас нь form-ийн мэдээллийг барьж авах боломжтой байдаг. Иймд үүнээс сэргийлэхийн тулд HTTPS протокол ашиглах хэрэгтэй.
    HTTPS = HTTP + SSL

Popular posts from this blog

Apache Spark + Cassandra. Hello World