English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

სტუმარი
1 / ?
უკან გაკვეთილებზე

რა ხდის შენახვის ფორმატს აღდგენადს

აღდგენადობის მიხედვით დალაგებული ოთხი შენახვის ფორმატი:

ფორმატიაღდგენადია?მაგალითიაღდგენის მეთოდი
ღია ტექსტიდიახpassword: hunter2ფაილის წაკითხვა
Base64დიახcGFzc3dvcmQ=base64 --decode
შექცევადი შიფრი (AES)დიახENC[AES256:...]გაშიფვრა გასაღებით
ერთმხრივი ჰეში (bcrypt)არა$2b$12$...ვერ შებრუნდება; საჭიროა brute-force

Plaintext, base64 და შექცევადი შიფრი: ყველა აღდგენადია. ერთი სერთიფიკატის მონაცემთა ბაზის გაჟონვა აძლევს თავდამსხმელს ყველა პაროლს ნათელ ტექსტში, ყველა მომხმარებლისთვის ერთდროულად. ერთი გარღვევა; სრული გამოვლენა.

The Mailman 2.x მაგალითი

Mailman 2.x (GNU საფოსტო სიების მმართველი): ინახავდა აბონენტების პაროლებს ნათელ ტექსტში. ყოველთვიური პაროლის შეხსენების ელფოსტა: უგზავნიდა ყველა აბონენტს მათ პაროლს ნათელ ტექსტში. ორი ცალკეული დეფექტი, ორივე MOAD-0006:

1. შენახვა: ნათელი ტექსტი სიის მონაცემთა ბაზაში. სერვერის კომპრომეტირება ავლენს ყველა აბონენტის პაროლს.

2. გადაცემა: ყოველთვიური ელფოსტა აგზავნის პაროლს ნათელ ტექსტში SMTP-ით აბონენტის ელფოსტის სერვერზე. ელფოსტა მოგზაურობს ნათელ ტექსტში მრავალი SMTP ჰოპის გავლით.

Mailman-ის გუნდმა შეიმუშავა ორივე ქცევა. აღდგენა იყო ფუნქცია: აბონენტებს შეეძლოთ დავიწყებული პაროლების მიღება. Glass Safe-ის სახელი სწორედ აქედან მოდის: სეიფი ინახავს რწმუნებებს ხილულ ფორმაში. ვინც სეიფს მიაღწევს, ერთდროულად ყველა შიგთავსს წაიკითხავს.

უკვე მოპარული პრინციპი

აღდგენად ფორმაში შენახული რწმუნება უკვე მოპარული რწმუნებაა. თავდამსხმელი ჯერ არ მოსულა. დარღვევა ჯერ არ მომხდარა. მაგრამ არქიტექტურა გარანტიას იძლევა: როდესაც დარღვევა მოხდება, ყველა რწმუნება ერთდროულად გადავა. არცერთი დარღვევა არ ხდება იზოლირებულად; აღდგენად შენახვაში არსებული ყველა რწმუნება ერთსა და იმავე ოპერაციაში გადაეცემა თავდამსხმელს.

MOAD-0006 vs MOAD-0004

MOAD-0004 (ჩაწერილი საიდუმლო): რწმუნებები შემთხვევით ჩაიწერა ლოგებში. ლოგში ჩაწერა არ იყო განზრახვა; ეს იყო გვერდითი ეფექტი header-ის ლოგირების ჩართვისას გამართვის მიზნით.

MOAD-0006 (Glass Safe): რწმუნებები შენახულია აღდგენად ფორმაში დიზაინის მიხედვით. აღდგენა იყო განზრახვა. პაროლის შეხსენების ფუნქცია მოითხოვდა პაროლის შენახვას. პაროლის ჩვენების ფუნქცია მოითხოვდა მის შენახვას. არქიტექტურული ვალდებულება აღდგენის მიმართ შექმნა დეფექტი.

ერთსტრიქონიანი განსხვავება: MOAD-0004 რწმუნებებს შემთხვევით ათავსებს ლოგებში; MOAD-0006 მიზანმიმართულად ინახავს რწმუნებებს აღდგენად ფორმაში. გამოსწორებები მოქმედებს სხვადასხვა ფენებზე.

სტრუქტურული vs შემთხვევითი

MOAD-0006 და MOAD-0004-ს შორის არქიტექტურული განსხვავება განსაზღვრავს გამოსწორების სტრატეგიას. შემთხვევითი ჩანაწერი ლოგში: გამოსწორდება სერიალიზაციის ფენა. აღდგენისთვის შექმნილი საცავი: გადამუშავდება ფუნქცია, რომელიც მოითხოვს აღდგენას.

რატომ არის Glass Safe სტრუქტურულად განსხვავებული MOAD-0004-ისგან? ერთი წინადადება აღწერს თითოეულ ხარვეზს. რას ნიშნავს ეს გამოსწორებისთვის?

რატომ მუშაობს bcrypt

ერთმხრივი ჰეშის ფუნქცია იღებს პაროლს და აწარმოებს ფიქსირებული სიგრძის დაიჯესტს. დადაიჯესტიდან თავდაპირველი პაროლი ვერ აღდგება. არა „ძნელი აღდგენა“: შეუძლებელია შებრუნება. ფუნქცია მუშაობს მხოლოდ ერთი მიმართულებით.

სამი თვისება, რომელიც აუცილებელია მონაცემთა შენახვისთვის:

1. ერთმხრივი (წინასწარი გამოსახულების წინააღმდეგობა). მოცემული hash(password), არც ერთი ალგორითმი ვერ აღადგენს password-ს უფრო სწრაფად, ვიდრე brute-force. bcrypt, scrypt და argon2 ყველა აკმაყოფილებს ამ თვისებას.

2. მარილი (Salt). შემთხვევითი მნიშვნელობა, რომელიც ემატება პაროლს ჰეშირებამდე. ერთი და იგივე პაროლი, სხვადასხვა მარილი, სხვადასხვა ჰეში. მიზანი: დაამარცხოს rainbow tables (წინასწარ გამოთვლილი ჰეშების ლექსიკონები). მარილის გარეშე: თავდამსხმელი ერთხელ ითვლის hash('password123') და ამოწმებს ერთდროულად 1 მილიონ მომხმარებელს. მარილით: თითოეულ მომხმარებელს აქვს უნიკალური ჰეში ერთი და იგივე პაროლისთვისაც კი.

3. შეგნებულად ნელი. bcrypt იღებს სამუშაო ფაქტორს. უფრო მაღალი სამუშაო ფაქტორი: მეტი იტერაცია, მეტი გამოთვლითი დრო თითოეული ჰეშის მცდელობისთვის. შესვლა: 300ms ერთი ჰეშისთვის. მისაღები. brute-force: 300ms თითო მცდელობაზე. 1 მილიარდ მცდელობაზე: 9.5 წელი თითო პაროლზე. მიუღებელი თავდამსხმელისთვის. ნელა მუშაობა: ფუნქცია, არა ხარვეზი.

import bcrypt

# შენახვა: ერთმხრივი ჰეში მარილით
def store_password(plaintext: str) -> bytes:
return bcrypt.hashpw(plaintext.encode(), bcrypt.gensalt(rounds=12))

# გადამოწმება: დააჰეშეთ კანდიდატი და შეადარეთ დაიჯესტები
def verify_password(plaintext: str, stored_hash: bytes) -> bool:
return bcrypt.checkpw(plaintext.encode(), stored_hash)

# არასოდეს ინახება: პაროლის ღია ტექსტი
# არასოდეს აღდგენილი: plaintext ჰეშიდან
# პაროლის გადაყენება, არა პაროლის შეხსენება

კომპრომისი

ერთმხრივი ჰეშირება პაროლის აღდგენას შეუძლებელს ხდის. მომხმარებელი, რომელიც დაივიწყებს პაროლს, ვერ მიიღებს მას უკან. პაროლის შეხსენების ელფოსტა ვერ იარსებებს. მომხმარებლის გამოცდილება იცვლება: „დაგავიწყდა პაროლი? გადააყენე“. ეს არ არის დეგრადაცია: ეს არის უსაფრთხოების საზღვარი. სისტემა, რომელსაც პაროლის აღდგენა არ შეუძლია, ვერ გაჟონავს პაროლს.

მონაცემთა ბაზის გარღვევა, რომელიც bcrypt ჰეშებს ავლენს: ყველა ჰეში ხილულია, პაროლები არ ჩანს. თავდამსხმელმა უნდა გააკეთოს brute-force თითოეული ჰეშისთვის ინდივიდუალურად, 300 მილიწამში ერთი მცდელობა, თითო მომხმარებლისთვის მარილი კი წინასწარ გამოთვლილ ცხრილებს ანადგურებს. გარღვევა, რომელიც plaintext პაროლებს ავლენს: სრული მყისიერი გამოვლენა.

ძლიერი დაშიფვრა საკმარისი არ არის

უსაფრთხოების აუდიტი ავლენს სერთიფიკატების შენახვის სისტემას. პაროლები ინახება AES-256-CBC დაშიფვრით სერვერის მხარეს გასაღებით. აუდიტის ანგარიში მას Glass Safe დეფექტად აღნიშნავს.

საინჟინრო გუნდი პასუხობს: 'AES-256 არის ყველაზე ძლიერი სიმეტრიული შიფრი. გასაღები ინახება აპარატურულ უსაფრთხოების მოდულში. არცერთ თავდამსხმელს არ შეუძლია ამ პაროლების გაშიფვრა.'

რატომ რჩება ეს MOAD-0006 ძლიერი დაშიფვრის მიუხედავად? რა არის სწორი გამოსწორება?