Slide 1

Slide 1 text

เก็บรหัสผานยังไงดี 2017 YWC Programmer Meetup

Slide 2

Slide 2 text

คั่นเวลา ● ขอรหัสผานหนอย ● 6 ตัว อักษรอังกฤษ ตัวเลข ● เดี๋ยวจะทําอะไรใหดู ● ไมตองใสรหัสจริงมานะ ● https://madoka.whs.in.th/pwcrack.html ○ HTTPS ดวย!!

Slide 3

Slide 3 text

Who? ● Manatsawin Hanmongkolchai (@awkwin) ● ถาไมไดกดรับเฟรนก็สงขอความมาถามไดไมกัด ● แตถาเขียนโคด insecure นี่กัด

Slide 4

Slide 4 text

Why? ● ทํา Freelance มาหลาย project ● ทุก project ที่ตองไปยุง code เดิมมีชองโหวพื้นๆ หมด ○ SQL Injection ○ Insecure Password Hashing ● ถาใหพูดทุกประเด็นคงไดเปนชั่วโมง

Slide 5

Slide 5 text

ขออาง ● "ใชคนเดียว ไมเปนไรหรอก" ● "เดี๋ยวคอยแกก็ได"

Slide 6

Slide 6 text

There are two primary causes for the unintentional creation of insecure web applications, regardless of the language being used: 1. A lack of knowledge about security 2. Bad development habits — ParagonIE

Slide 7

Slide 7 text

เก็บรหัสผานยังไงดี? ● สมัยผมหัดเขียนเว็บเคาใช MD5 $hashed = md5($_POST['password']);

Slide 8

Slide 8 text

อยาใช MD5 ● SHA1 จาย 5 แสนเหรียญ collision ได ● แต MD5 รันไวสักวันสองวันก็ collision ได

Slide 9

Slide 9 text

เก็บรหัสผานยังไงดี? ● แลวเคาก็วา SHA1 $hashed = sha1($_POST['password']);

Slide 10

Slide 10 text

อยาใช SHA1 ● มี harddisk เหลือ ทําตาราง SHA1 (Rainbow Table) ไวก็ crack SHA1 ไดในพริบตา

Slide 11

Slide 11 text

เก็บรหัสผานยังไงดี? ● แลวเคาก็วาใส salt สิ จะไดปลอดภัย $salt = uniqid(); $hashed = sha1($_POST['password'] . $salt);

Slide 12

Slide 12 text

ยินดีตอนรับสูยุคของ Cloud computing ● เมื่อกี้ขอรหัสผาน ใสกันหรือยัง ● ถาพรอมแลว ลุย!

Slide 13

Slide 13 text

ยินดีตอนรับสูยุคของ Cloud computing ● Google Cloud เชา K80 ชั่วโมงละ 30 บาทเทานั้น!!! ● งัด MD5 ได 4 พันลานครั้งตอวินาที ● งัด SHA256 ได 642.1 ลานครั้งตอวินาที ○ = รหัส 8 ตัว เสร็จใน 2 นาที ● เชาไดถึง 8 ใบตอเครื่อง !!

Slide 14

Slide 14 text

แลวเอาไงดี???? ● ใช Algorithm "ชา" (>100ms) มีการดจอก็งัดไมทันหรอก ○ Argon2 ○ bcrypt ○ scrypt ○ PBKDF2 (iPhone ใชอยู)

Slide 15

Slide 15 text

PHP ● PHP 5.5+ มี password hash function มาใหแลว ชวยใชหนอยเถอะ ● $hash = password_hash($_POST['password'] PASSWORD_DEFAULT); ● แลว Salt? มันจัดการใหหมดแลวไมตองไปยุง ● (ตอนนี้) ใช algorithm bcrypt

Slide 16

Slide 16 text

PHP ● เวลาเช็ครหัสผานทําแบบนี้ ● if(!password_verify($_POST['password'], $db_password)){ die('Wrong!'); } if(password_needs_rehash($db_password, PASSWORD_DEFAULT)){ $db_password = password_hash($_POST['password'] PASSWORD_DEFAULT); } ● password_verify จะเทียบรหัสผานโดยไมโดน timing attack ● password_needs_rehash จะเช็ควารหัสใช algorithm ลาสุดหรือเปลา ถาไมใชก็ upgrade ได (ในกรณีที่ในอนาคต PHP เปลี่ยน default algorithm)

Slide 17

Slide 17 text

PHP ● ถาไมมี PHP5.5? ● https://github.com/ircmaxell/password_compat ● API เดียวกับเมื่อกี้ จบปง

Slide 18

Slide 18 text

PHP ● ถาไมมี PHP5.3.7??? ● ไมยอมอัพเกรดขนาดนั้นก็สมควรโดน hack

Slide 19

Slide 19 text

ใช Framework เถอะ ● งงมั้ย? ● Security งายนิดเดียว แคใช Framework ○ Django (Python) ลง Argon2/Bcrypt เพิ่มได (อานใน Docs) หรือ default จะใช PBKDF2 ○ อยาเขียนสิ่งที่ framework มันมีใหอยูแลว

Slide 20

Slide 20 text

Paragonie Blog ● เขียนสนุก เขาใจงาย สําหรับคนเขียน PHP ● https://paragonie.com/blog/category/security-engineering

Slide 21

Slide 21 text

จบ ถามไดไมกัด