บทคัดย่อ · หัวข้อ...

Post on 14-Aug-2020

7 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

หวขอ การศกษาและพฒนาระบบตรวจจบผประสงครายจาก การขโมยขอมลรหสผานและนำรหสผานมาเขาสระบบ ชอนกศกษา สนต เลศสำราญ รหสนกศกษา 5317810012 หลกสตร วทยาศาสตรมหาบณฑต สาขาความมนคงทางระบบสารสนเทศปการศกษา 2557 อาจารยทปรกษา ผศ.ดร.วรพล ลลาเกยรตสกล

บทคดยอ

สารนพนธนไดนำเสนอเพอพฒนาระบบตรวจจบผประสงครายจากการขโมย

ขอมลรหสผานและนำรหสผานนนยอนกลบมาเขาสระบบโดยใชชอผใชงานและรหสผาน

ของผใชงานจรงในระบบ โดยเมอผประสงครายไดขอมลรหสผานไปไมวาดวยวธใด และ

นำ honeywords (รหสผานปลอม) เขาสระบบ ระบบจะแจงเตอนใหผดแลระบบใหรวา

รหสผานไดถกขโมยออกไปจากระบบแลว

ผลการดำเนนงานในครงนสงผลใหลดความเสยงของการถกขโมยขอมลรหส

ผานเพอนำรหสผานมาเขาสระบบ และแจงเตอนผดแลระบบใหทำการแกไขไดทนเวลา

I

กตตกรรมประกาศ

สารนพนธนไดพฒนาจนสำเรจดวยด เพราะความกรณา ความชวยเหลอ และกำลงใจจากหลายคน ขาพเจาขอขอบพระคณมา ณ ทน

ขอขอบพระคณ ผศ.ดร.วรพล ลลาเกยรตสกล อาจารยทปรกษาโครงงานทกรณาเสยสละเวลาใหคำแนะนำและคอยตรวจสอบโครงงานอยสมำเสมอ และยงคอยหาตวอยางทด ๆ มาใหอกมากมาย

ขอขอบพระคณอาจารยทกๆ ทานทชวยประสทธประสาทวชาแกขาพเจาตงแตขาพเจาเขามาศกษาในทแหงน ขอบคณกำลงใจจากอาจารยทกทานททำใหขาพเจาพฒนาโครงงานนใหสำเรจไปไดดวยด

ขอขอบพระคณพๆ เพอนๆ และทกคนทชวยสอนเวลาทโปรแกรมมปญหาและเปนกำลงใจในยามทเราทอ

สนต เลศสำราญ

II

สารบญ

หนา

บทคดยอ…………………………………………………….............…………………...........…...I

กตตกรรมประกาศ……………....…………………........................…………………...........…..II

สารบญ……………………………………………………………………....……...........….…….III

สารบญรป………………...…………………….....……….…………………………..................V

บทท 1 บทนำ……………………………………..…………………….………..........…..….…..1

1.1 ปญหาและแรงจงใจ……………………………………….……...........………….....1

1.2 แนวทางการแกไขปญหา……………………………………………...…….............1

1.3 วตถประสงคของการศกษา……………....……….............……….……................1

1.4 ภาพรวมของระบบทจดทำ…………...…………………..…..........………….........1

1.5 ขอบเขตการศกษา…………...………………...........…..…..........…………..........2

1.6 โครงสรางของสารนพนธ…………...…………………..….............………….........2

บทท 2 พนฐานและทฤษฎทเกยวของ………………………………………..………………......4

2.1 เกรนนำ…………………………………………………………….....…..........……4

2.2 รปแบบการโจมต…………………………………………...………………….....….4

2.3 Honeychecker……………………………………………………………………….5

2.4 การทำงานของ Honeywords..............................................................................6

2.5 ขนตอนการเขาสระบบ........................................................................................8

2.6 ขนตอนการเปลยนรหสผาน...............................................................................11

2.7 นยามของความมนคงปลอดภย………………………………............……...........12

2.8 ทฤษฎความนาจะเปน……………………......……………....................…...........15

บทท 3 วธการดำเนนงาน……………………………......................................................…...16

III

สารบญ (ตอ)

หนา

3.1 Honeywords Generation…………………………………………..……………..18

3.2 นโยบายการกำหนดรหสผาน………………………………….....…..…..............22

3.3 การสรางตวอยางงาน………………….....…………………………………….….23

บทท 4 ผลการดำเนนงาน…………………………………………………….......….................26

4.1 ผลการศกษาวธการดำเนนงานในสวนการสราง honeywords (Gen)……..........26

4.2 ผลการทดสอบระบบตวอยางงาน…………………………….……………….......28

4.3 ผลการทดสอบความนาจะเปนในการเดารหสผาน……….….……………….......33

บทท 5 สรปผลการดำเนนงาน……………………………………........………...........………..43

เอกสารอางอง……………………....……………………………….........................................44

ภาคผนวก ก………………………………………………………………………................….ก-1

ภาคผนวก ข………………………………………………………………………….................ข-1

ภาคผนวก ค…………………………………………....……………….………....…...............ค-1

ภาคผนวก ง…………………………………...…………………...................………..............ง-1

ภาคผนวก จ………………………………...………………………................……................จ-1

IV

สารบญรป

หนา

รปท 1.1 แสดงภาพรวมของระบบทจดทำ……………………………………….........………....2

รปท 2.1 แสดงขนตอนการเขาสระบบ………………………………………….........………......9

รปท 2.2 แสดงขนตอนการเขาสระบบ (ตอ)…………………...……………….........………....10

รปท 2.3 แสดงขนตอนการเปลยนรหสผาน…………………………………….........………....11

รปท 2.4 ขนตอนการทำงานของฟงกชน Gen(k;pi)……..…………………….........………....13

รปท 2.5 ผประสงครายไดรายการของรหสผานไป………….………………….........………....14

รปท 3.1 ภาพรวมของระบบ………………….........…………………………….........………...16

รปท 3.2 ขนตอนการทำงานของฟงกชน Gen…….…………………………….........………...18

รปท 3.3 ขนตอนการทำงานของฟงกชน Gen (ตอ)……………………………………..……...19

รปท 4.1 สวนแสดงผลสำหรบสมครสมาชก…………………………………………….............28

รปท 4.2 ฐานขอมลเมอมการสมครสมาชกสำเรจ………………………………….…...............29

รปท 4.3 แสดงประสทธภาพของระบบทใช honeyword ของการสมครสมาชก………….........29

รปท 4.4 แสดงประสทธภาพของระบบทไมใช honeyword ของการสมครสมาชก…....…........30

รปท 4.5 สวนแสดงผลสำหรบการตงรหสผานใหม.…...………………………….................…30

รปท 4.6 แสดงประสทธภาพของระบบทใช honeyword ของการตงรหสผานใหม....…............31

รปท 4.7 แสดงประสทธภาพของระบบทไมใช honeyword ของการตงรหสผานใหม…....…....31

รปท 4.8 สวนแสดงผลสำหรบเขาสระบบ……………...………………………….................…31

รปท 4.9 แสดงประสทธภาพของระบบทใช honeyword ของการเขาสระบบ…………….........32

รปท 4.10 แสดงประสทธภาพของระบบทไมใช honeyword ของการเขาสระบบ..............…...32

รปท 4.11 แสดงผลลพธของการนำแฮชมาสมหาคาจรง…...……....…...................................33

รปท 4.12 แสดงตารางฐานขอมลเมอผประสงครายใช honeyword เขาสระบบ...……….........33

V

สารบญรป (ตอ)

หนา

รปท 4.13 เกบสถตการเดาวาคาแฮชใดคอรหสผานทถกตอง………......................................34

รปท 4.14 เกบสถตการเดาวารหสผานใดคอรหสผานทถกตอง chaffing-by-tail-tweaking......37

รปท 4.15 เกบสถตการเดาวารหสผานใดคอรหสผานทถกตอง chaffing-by-tweaking-digits...38

รปท 4.16 เกบสถตเดารหสผานใดคอรหสผานทถกตอง chaffing-with-a-password-model....39

VI

VII

บทท 1

บทนำ

1.1 ปญหา และแรงจงใจ

ในปจจบนเราไดเหนขาวและเหตการณทเกยวกบการขโมยขอมลในฐานขอมลของผใหบรการ ซงทำใหผประสงครายลวงรขอมลสวนตวของผใชงาน เชน ชอผใชงาน, คาแฮชของรหสผาน, รหสบตรเครดต เปนตน และสงผลใหผประสงครายทำการสมคารหสผานใหตรงกบคาแฮชทไดมา ทำใหสามารถเขาระบบดวยตวตนของผใชงานคนนนๆได จากเหตการณดงกลาวนนเราจงควรเหนถงความสำคญและวธการแกปญหาเพอเปนการแจงเตอนวามการขโมยขอมลในฐานขอมลของผใหบรการและใชเขาสระบบ เพอใหผบรการสามารถทจะปองกนและแกปญหาไดทนเวลา

1.2 แนวทางการแกปญหา

มผคดคนวธการแกปญหาดงกลาวดวยวธทเรยกวา “Honeywords” สารนพนธนจงเปนการศกษากระบวนการทำงานการตรวจสอบวา มผประสงครายไดขโมยขอมลไปแลว และมความพยายามเขาสระบบดวยขอมลทไดไป แตจะไมสามารถเขาสระบบได เนองดวยรหสผานดงกลาวไมใชรหสผานของผใชงานจรง เปนเพยงแครหสผานทถกสรางขนมาสำหรบตรวจสอบวามผลวงรโดยวธการไมเหมาะสมและพยายามเขาสระบบ

1.3 วตถประสงคของการศกษา

1.3.1 ศกษากระบวนการสรางรหสผานปลอม (Honeywords) 1.3.2 ศกษากระบวนการนำรหสผานปลอม (Honeywords) มาใชตรวจสอบวามผประสงครายพยายามเขามาในระบบได 1.3.3 ประยกตและสรางระบบ Honeywords บนเวบแอปพลเคชน

1.4 ภาพรวมของระบบทจดทำ

โดยในสารนพนธฉบบนจะเปนการพฒนา Honeywords โดยนำไปรวมกบระบบ CIBB basic forum with Codeigniter and Twitter Bootstrap ตามเอกสารอางอง [7] โดยสวนของ Computer System คอ CIBB ดงรปท 1.1

1

รปท 1.1 ภาพรวมของระบบทจดทำ

1.5 ขอบเขตการศกษา

1.5.1 ศกษากระบวนการสรางรหสผานปลอม (Honeywords) 1.5.2 ศกษากระบวนการนำรหสผานปลอม (Honeywords) มาใชตรวจสอบวามผประสงครายพยายามเขามาในระบบ 1.5.3 ประยกตแนวทางการศกษาดงกลาวกบเวบแอปพลเคชน โดยสราง library สำหรบ Codeigniter สำหรบกระบวนการสรางรหสผานปลอม (Honeywords) 1.5.4 ประยกตกบการเขาสระบบของ CIBB ซงเปนเวบแอปพลเคชนทพฒนาดวย Codeigniter 1.5.5. ทดสอบผลดวยการสมมตวารหสผานทผด (Honeywords) ดงกลาวไดถกขโมยไปและนำมาใชเพอเขาสระบบ โดยตองตรวจสอบไดจรงและมการแจงเตอนใหผดแลระบบทราบผานทางอเมล และรหสผานปลอม (Honeywords) ดงกลาวจะไมตรงกบรหสผานจรงและไมสามารถเขาสระบบได

1.6 โครงสรางของสารนพนธ บทท 2 จะมงเนนเพอศกษาวธการโจมตเพอขโมยขอมลรหสผาน วธการทำงานของ Honeywords ในขนตอนการเขาสระบบ การเปลยนรหสผาน ขนตอนการสรางรหสผาน เพอนำมาประยกตใชกบระบบอนๆ บทท 3 ในสารนพนธนจะนำมาประยกตกบ CIBB ซงเปนเวบแอปพลเคชน เพอใหไดระบบทมความมนคงปลอดภยมากขนและสามารถตรวจจบผประสงครายจากการขโมยขอมลรหสผานไดจรง และทำการวดประสทธภาพของการใชงานของระบบระหวางการใชระบบปกตและระบบทใช honeyword นนมความแตกตางกนมากนอยเพยงใด บทท 4 ทำการทดสอบระบบวาสามารถตรวจจบผประสงครายจากการขโมยขอมลรหสผานเพอนำรหสผานมาเขาสระบบ และประสทธภาพของระบบเมอมการปรบมาใชงาน

2

Honeywords เมอเทยบกบระบบปกต และทดสอบความนาจะเปนในการเดารหสผานทถกตองโดยการสรางแบบทดสอบเพอเกบสถตผลการเดารหสผาน บทท 5 สรปผลการทดลองทงหมด กลาวถงขอดและขอเสยของ Honeywords และการพฒนาตอยอด

3

บทท 2

พนฐานและทฤษฎทเกยวของ

2.1 เกรนนำ

กำหนดใหระบบคอมพวเตอรมชอผใชงานจำนวน n คน โดยมชอผใชงาน u1,u2,…,un

ดงนน ui จะแทนชอผใชงานสำหรบลำดบท ith โดยระบบคอมพวเตอรนจะอนญาตใหผใชงานเขาสระบบดวยชอผใชงานและรหสผาน ทงนมความหมายถง เวบไซต, สมารท โฟน, และโปรแกรมตางๆ ดวย กำหนดให pi แทนรหสผานของผใชงาน ui โดยผใชงาน ui จะใชรหสผาน pi เพอเขาสระบบ โดยวธการในปจจบน ระบบจะใชฟงกชนแฮชกบรหสผาน และเกบคาแฮชทไดในระบบแทนรหสผานจรง ซงเกบไวในไฟล F ประกอบดวยขอมลรายการชอผใชงานและรหสผานทผานฟงกชนแฮชดวยรปแบบดงสมการท 2.1

(ui,H(pi)) (2.1)

สำหรบ i = 1,2,…,n

สำหรบระบบปฏบตการลนกซ ไฟล F คอ /etc/passwd หรอ /etc/shadow และสำหรบเวบแอปพลเคชนจะหมายถงฐานขอมลทเกบรหสผาน หากผประสงครายทสามารถเขาถงไฟล F บนระบบไดนน อาจจะสามารถคำนวณหารหสผาน pi จากคาแฮช H(pi) ได โดยทวไปเมอผใชงานจะเขาสระบบ จะใชชอผใชงานและรหสผานทผานฟงกชนแฮชเพอไปตรวจสอบกบไฟล F เมอตรงกนระบบจะอนญาตใหผใชงานเขาสระบบได

2.2 รปแบบของการโจมตเพอขโมยขอมลรหสผาน

รปแบบการโจมตทมงเนนเกยวกบรหสผานนนมหลากหลาย โดยไดยกตวอยางทมการพบไดบอยดงน 2.2.1 ขโมย ลวงร หรอเขาถงไฟล F ทเกบคาแฮชรหสผานทผานฟงกชนแฮช 2.2.2 รหสผานทใชงานถกคาดเดาไดงาย เนองจากผใชงานมการตงรหสผานทออนแอเกนไป ยกตวอยางเชน 123456 2.2.3 ผใชงานเขยนรหสผานตดไวบนจอคอมพวเตอร และผประสงครายสามารถทจะมองเหนและนำไปใชได 2.2.4 มการใชงานรหสผานเดยวกนในหลายระบบ หากระบบใดถกเขาถงไดดวยผประสงคราย บนระบบอนจะมความเสยงดวย

4

2.2.5 ผประสงครายขโมยรหสผานจากผใชงาน โดยอาจเปดดโทรศพทมอถอ, เครองคอมพวเตอรพกพา, มลแวร หรอดวยวธการ Phishing 2.2.6 ระบบขอเปลยนรหสผานมขอบกพรอง ดวยเหตใดกแลวแตททำใหผประสงครายลวงรหรอสามารถเปลยนรหสผานตามทตองการได

ในสารนพนธนเราจะเนนทการโจมตในหวขอ 2.2.1 เทานน โดยเมอผประสงครายไดขอมลในไฟล F ซงอาจมทงชอผใชงาน, คาแฮชรหสผานทผานฟงกชนแฮช หรอขอมลอนๆ และทำการ brute force เพอหารหสผานทตรงกบคาแฮชในไฟล F และนำรหสผานทไดมาอางสทธเพอเขาสระบบอยางถกตองภายใตชอผใชงานนน สมมตใหผประสงครายสามารถลวงรรหสผานในไฟล F ไดจำนวนมาก หากผประสงครายนำรหสผานนนเขาสระบบแตเปนรหสผานทเปน honeywords ผประสงครายจะถกตรวจจบไดในครงแรกทเขาสระบบ แตหากผประสงครายมความสามารถทจะปรบแตงกระบวนการเขาสระบบ หรอกระบวนการเปลยนรหสผาน ระบบนจะตกอยในอนตรายทนท อยางไรกตามเราไดเสนอแนวคดสำหรบหวขอ 2.2.1 เทานน แตเนอหาบางสวนอาจมประโยชนเพอใชในการปองกนการโจมตอนๆ เชน วธการ take-a-tail ซงจะกลาวในบทท 3

2.3 Honeychecker

เราใหระบบคอมพวเตอรซงทำหนาทเปนสวนเสรมและชวยเหลอ honeywords ใหมความปลอดภยมากขน เรยกวา honeychecker เนองจากเราสมมตใหระบบคอมพวเตอรทมชองโหวถกขโมยไฟล F ซงใชเกบขอมลเกยวกบผใชงาน, รหสผานทผานฟงกชนแฮช และขอมลอนๆไปแลว ดงนนระบบคอมพวเตอรนจงไมมสวนใดปลอดภย Honeychecker จงถกแยกไปอยในระบบคอมพวเตอรทถกทำใหมนคงปลอดภยมากขน (harden) โดยระบบจะถกเชอมผานเครอขายดวยเสนทางเฉพาะ มการเขารหสลบและมการยนยนตวตน นอกจากน honeychecker จะมหนาทในการตรวจสอบในกรณมการพยายามเขาสระบบทผดปกตดวย Honeychecker มความสามารถในการแจงเตอนเมอมความผดปกตเกดขนและจะสงขอความเตอนไปยงผดแลระบบอยางเงยบๆ อาจจะแจงกลบไปทระบบคอมพวเตอรทมการเขาสระบบหรอไมกไดแลวแตนโยบาย บางทเราอาจเรยก honeychecker วา “login monitor” Honeychecker จะเกบขอมลในฐานขอมล โดยจะเกบคาตำแหนงของรหสผาน c(i) ของทกๆผใชงาน ui โดยมชนดเปนตวเลขอยระหวาง 1 ถง k เมอ k คอจำนวนของรหสผานทงหมดทสรางขน เชน k เทากบ 20 คอมจำนวนรหสผานตอผใชงาน 20 ตว

5

Honeychecker มคำสง 2 แบบ คอ 1) Set(i,j) สำหรบตงคารหสผาน c(i) โดยมคาเปนตำแหนงคอ j 2) Check(i,j) ใชตรวจสอบตำแหนงของรหสผาน c(i) เทากบคาตำแหนง j หรอไม และสงขอมลกลบไปใหระบบคอมพวเตอรทตองการเขาสระบบวารหสผานถกตองเพอใหสามารถเขาสระบบได หรอแจงเตอนผดแลระบบเมอตำแหนงของรหสผาน c(i) ไมเทากบคาตำแหนง j

หลกการออกแบบของ honeychecker นน ระบบคอมพวเตอรและ honeychecker เมอนำมารวมกนจะใชพนฐานของการรกษาความปลอดภยแบบกระจาย โดยมจดมงหมายเพอใชลดความเสยง แมวาผประสงครายจะทำอนตรายในบางระบบหรอบางโปรแกรม และยงชวยกระจายการใชทรพยากรของระบบดวย ตวอยางเชน เราอาจแยกผดแลระบบระหวางระบบคอมพวเตอรกบ honeychecker หรอใชระบบปฏบตการทตางกน เพอสรางความสบสนและยากทจะทำอนตรายระบบโดยรวม เราออกแบบเพอไมใหผประสงครายสวมรอยเปนผใชงานระบบ โดยใชเพยงการเกบคาตำแหนงของรหสผาน c(i) สำหรบทกๆผใชงาน ui ความจรงแลวอาจมกรณทแยสด เนองจากถาผประสงครายไดไฟล F และไมหลงกลหากวธการออกแบบการสราง honeywords นนทำไดไมด จะทำใหผประสงครายสามารถทจะลวงรรหสผานทแทจรงไดโดยงาย นอกจากน ยงตองคำนงถงการปกปองรหสผานในระบบทกระจายตว จะตองมการเขารหสลบระหวางระบบคอมพวเตอรกบ honeychecker และตองสามารถรวมกบระบบทเกบรหสผานได, ใช overhead นอยทงการคำนวณและการสอสารระหวางกน สงสำคญคอ honeychecker จะตองอยในระบบทนาเชอถอ (Trusted System) หรอมการทำใหมความมนคงปลอดภยมากขน (harden) และควรทจะใชนโยบายทไมตองมการโตตอบกบระบบคอมพวเตอรทมการเขาสระบบ ถามการตงคาใหแจงเตอนใหกบผดแลระบบหรอกระตนโปรแกรมปองกนอน

2.4 การทำงานของ Honeywords

ในหวขอนจะเปนการอธบายพนฐานการทำงานของ honeywords วามการเกบรหสผานและตำแหนงของรหสผานอยางไร สำหรบผใชงาน ui จะมแถวขอมล Wi โดยมคำทตางกน (อาจจะเรยกมนวา “potential password” หรอ “sweetwords”) ดงสมการท 2.2

Wi = (wi,1,wi,2,…,wi,k) (2.2)

เมอ k คอ จำนวนรหสผาน เพอความงายในการอธบาย เราแนะนำคา k = 20

6

อยางไรกตามเราสามารถกำหนดคา k ไดจากลกษณะของผใชงาน เชน k = 200 สำหรบผดแลระบบ คา k ทตำและสงอาจมความเหมาะสมตางกนตามพฤตกรรมและความสำคญของผใชงาน แนนอนวาหนงใน sweetwords (wi,j) จะเทากบรหสผานจรง pi ของผใชงาน ui เราให c(i) แทนคาตำแหนงรหสผานของผใชงาน ui ทถกตองในแถวขอมลของรหสผาน Wi ดงสมการท 2.3

Wi,c(i) = pi (2.3)

เราจะเรยกรหสผานทแทจรงวา “sugarword” เราจะเรยกรหสผานอนๆ (k-1) วา “honeywords” หรอ “incorrect password”

ดงนนแถวขอมลของรหสผาน Wi ของ sweetwords จะประกอบดวยหนง sugarword (รหสผานทแทจรง) และ (k-1) honeywords (รหสผานทไมจรง) เราสามารถเพมเตม “touch nut” คอ รหสผานทมความแขงแรงมากเปนพเศษ และเปนคาแฮชไมสามารถทจะถกผประสงคราย brute force เพอลวงรคำทแทจรงได ใชสญลกษณแทนวา ⁇ โดย honeywords หรอรหสผานทแทจรงอาจจะเปน toucht nut กได ไฟล F คอไฟลทใชเกบรหสผานจะถกเปลยน โดยมการเพมขนของการเกบรหสผาน ดงสมการท 2.4

(ui,Hi) (2.4)

โดยทจะทำการแฮชจากทก jth sweetwords ตอผใชงาน ดงสมการท 2.5

vi,j = H(wi,j) (2.5)

และคาแฮชทไดจะถกเกบเปนแถวของขอมล ดงสมการท 2.6

Hi = (vi,1,vi,2,…,vi,k) (2.6)

ขนาดของไฟล F จะใหญขนตามตวแปร k โดยประมาณ แตกไมไดมปญหาแตอยางใดเพราะระบบโดยทวไปกมการเกบรหสผานเกาประมาณ 10 รหสผาน ทถกใชไปแลว เพอไมใหนำกลบมาใชใหม ซงแลวแตนโยบายในการเกบรหสผานของแตละบรษท โดยหากตองการลดความเสยงของการตงรหสผานทเหมอนเดมกอาจทำการเพมจำนวนรหสผานเกาลงไปในระบบ ผใชงานจะไมสามารถตงรหสผานใหมใหเหมอนกบรายการของรหสผานเกานน

7

จากทมการเปลยนขนตอนการเกบรหสผานนน ผใชงานไมจำเปนตองรขอมลเพมเตม จำเพยงแตรหสผานของตวเองเหมอนเดม ไมจำเปนตองร honeywords เพราะผใชงานจะไมรวามระบบ honeywords เนองจากระบบดงกลาวทำงานอยเบองหลง ฟงกชน Gen(k) แสดงถงขนตอนในการสรางแถวขอมลของรหสผาน Wi โดยมความยาว k สำหรบผใชงาน ui และคาตำแหนง c(i) แทนรหสผานทถกตอง pi ทอยในแถวขอมลของรหสผาน Wi ดงสมการท 2.7

(Wi,c(i)) = Gen(k) (2.7)

ฟงกชน Gen คอฟงกชนสำหรบการสราง honeywords โดยตองรวมกบปฏกรยาของผใชงาน ไมเชนนนผใชงานจะไมสามารถสรางหรอรรหสผานได โดยเราจะเพมบางตวแปร เชน pi ลงไปในฟงกชน Gen ดงนนจะไดฟงกชน Gen(k;pi) โดย pi คอรหสผานทผใชงานตงขนทในกลมคำ Wi ดงสมการท 2.8

pi = Wi,c(i) (2.8)

ใหตวแปร c คอตารางทจะใหเกบตำแหนงของรหสผานทถกตอง ซงถกเกบรกษาอยางปลอดภยใน honeychecker นอกจากนเราสามารถใชคา salt กบรหสผานทผใชงานตงขนได โดยอาจนำไปรวมอยกบการคำนวณแฮช อยางไรกตามมนสามารถทำใหรหสผานมความแขงแรงมากขนและลดความเสยงการเดารหสผานจากผประสงครายไดด

2.5 ขนตอนการเขาสระบบ

กระบวนการเขาสระบบนน ตองใชการตดสนใจวารหสผานทรบเขามา g เทากบรหสผานของผใชงานทอยในระบบหรอไม ถาหากรหสผาน g ไมเทากบรหสผานของผใชงานทอยในระบบแลว กระบวนการเขาสระบบตองตรวจสอบวารหสผาน g เปน honeywords หรอไม ถาผใชงานเขาสระบบดวยรหสผานของผใชทถกตอง กระบวนการเขาสระบบจะเปนไปตามขนตอนปกตหรอหากเปนผประสงครายนำรหสผานทเปน honeywords เพอใชเขาสระบบโดยกระบวนการจะเปนตามนโยบาย ซงการตงนโยบายจะขนอยกบบรษทหรอองคกรนนตงขน ดงรปท 2.1

8

รปท 2.1 ขนตอนการเขาสระบบ

ถาผประสงครายเขาสระบบดวย honeywords ของผใชงาน เชน อาจมการ brute forcing คาแฮชของรหสผานจากไฟล F สำเรจ ตองมการดำเนนการทเหมาะสมโดยแลวแตนโยบายดงน 1) แจงเตอนผดแลระบบ 2) ใหเขาสระบบตอไปแบบปกต 3) ใหเขาสระบบแตอยใน honeypot 4) ทำการตดตามตนทางทมการเขาสระบบ 5) เปด log เพอตดตามการกระทำของผใชงาน 6) ปดระบบผใชงานนนจนกวาจะมการขอรหสผานใหม โดยอาจตองทำเรองขอรหสผานใหมจากผดแลระบบ 7) ปดระบบคอมพวเตอรและใหผใชงานสรางรหสผานใหมทงหมด อยางไรกตามกระบวนการเขาสระบบเพอตดสนใจวารหสผานทใชเขาสระบบ g เทากบรหสผานทถกตอง pi นน ถาคาแฮช H(g) ของรหสผาน g ไมอยในไฟล F ทจดเกบคาแฮชของผใชงาน ui แลวรหสผาน g จะไมใชทงรหสผานทถกตองและ honeywords ของผใชงานนน ดงนนระบบจะไมยอมใหมการเขาสระบบ กระบวนการตดสนใจวารหสผาน g เปนรหสผานของผใชงานหรอเปนเพยงหนงใน honeywords ของผใชงานนน กระบวนการเขาสระบบสามารถจะรตำแหนงของรหสผาน คอ j จากสมการท 2.9

9

H(g) = vi,j (2.9)

แตกระบวนการเขาสระบบไมรวารหสผานทอยในตำแหนง j จะเทากบตำแหนงของรหสผานทถกตอง c(i) หรอไม ตองไปตรวจสอบกบตาราง c ทเกบอยใน honeychecker ในหวขอ 2.3

ระบบคอมพวเตอรจะสงขอมลหา honeychecker เพอสงรหสผานตำแหนง j ไปตรวจสอบกบตาราง c ดวย สมการท 2.10

Check(i,j) (2.10)

หมายความวา “บางคนทตองการเขาสระบบดวยผใชงาน ui และระบ sweetwords (wi,j) โดยคา j คอตำแหนงของรหสผานทผใชงานสงเขามาในระบบ โดยถารหสผานในตำแหนง j เทากบตำแหนงของรหสผานทถกตอง c(i) กจะทำตามนโยบายตอไป ถาหากไมใชจะทำการเตอนผดแลระบบ นอกจากนเรายงสามารถใชฟงกชน Check สงขอมลให honeychecker แมวารหสผาน g จะไมอยใน sweetwords (Wi) โดยเราสามารถสงขอมลโดยระบตำแหนงของรหสผาน j เทากบ 0 เพอแจงใหระบบทราบวามการโจมตดวยการเดารหสผานเกดขน และเรายงสามารถเพมเตมขอมลทจะใหฟงกชน Check สงไปให honeycheck เพอสำหรบเกบขอมล IP address ของผใชงานทมการพยายามเขาสระบบ เพอใชสำหรบตดตามผใชงานทประสงครายไดดงรปท 2.2

รปท 2.2 ขนตอนการเขาสระบบ (ตอ)

10

ในหลายระบบจะมการระงบผใชงานนน หากพยายามทจะเขาสระบบแลวเกดการผดพลาดมากเกนไป วธการนกเปนวธทดแตมขอเสยตรงทอาจถกโจมตดวยการสมรหสผานทผดเขาสระบบเรอยๆ จนทำใหผใชงานนนไมสามารถเขาสระบบได แตหากใชวธการ honeywords เราไมจำเปนตองระงบผใชงานเมอมการเดารหสผานทไมถกตองเขาสระบบ ตอใหผประสงครายไดรายการของรหสผาน Wi ไปทงหมด จากทฤษฎความนาจะเปนรหสผานทถกตองทจะปรากฎใน 5 ตวแรก ดวยการสมการเรยงลำดบในแถวขอมลของรหสผาน Wi และมจำนวนของรหสผาน 20 ตวนน มความนาจะเปนเพยง 75% ทจะเกดขน ยงถารหสผานมการสมไปอยในตำแหนงแรกสดของรายการรหสผาน โอกาสทจะเกดขนมเพยง 5% เทานนซงนอยมาก การทผประสงครายจะเดารหสผานหรอมการนำรหสผานทลวงรจากรายการของรหสผาน Wi มาเขาสระบบ จะมโอกาสสงทรหสผานทสงเขามานนจะเปน honeywords ซงระบบจะตรวจจบได

2.6 ขนตอนการเปลยนรหสผาน

รปท 2.3 ขนตอนการเปลยนรหสผาน

จากรปท 2.3 เมอผใชงาน ui ตองการเปลยนรหสผาน หรอตงรหสผานเมอเขาใชงานครงแรกระบบจะมกระบวนการดงน 1) ใชกระบวนการของฟงกชน Gen(k;pi) เพอสรางรหสผานและเกบลงในแถวขอมล Wi เปนจำนวน k ตว 2) คา c(i) เปนตำแหนงของรหสผใชงานทถกตอง คอ รหสผาน pi ในแถวขอมลรหสผาน Wi 4) Hi เปนคาแฮชของแถวขอมลรหสผาน Wi

11

3) สงขอมลให honeychecker ใหรจกคาตำแหนง c(i) ใหม ดวยฟงกชน Set(i,j) โดย j เทากบ c(i) 4) ปรบขอมลผใชงานในไฟล F เปน (ui,Hi)

Honeychecker จะไมรรหสผาน หรอ honeywords ทตงใหมน โดยจะรแคตำแหนงของรหสผานทถกตอง c(i) ของคาแฮช vi,c(i) ของผใชงาน ui ซงเปนรหสผานใหมทอยในรายการคาแฮช Hi ในไฟล F ระบบคอมพวเตอรจะสงขอมลตำแหนงของรหสผานใหมให honeychecker ดวยฟงกชนตามสมการท 2.11

Set(i,j) (2.11)

หมายความวา “ผใชงาน ui ไดทำการเปลยนรหสผานหรอตงรหสผานใหมครงแรกโดยสงคา c(i) คอ j ไปให honeychecker เขยนลงในตาราง c เพอจะไดสามารถตรวจสอบตำแหนงของรหสผานทถกตองเมอมผใชงานเขาสระบบ จากฟงกชน Check(i,j)”

2.7 นยามของความมนคงปลอดภยของการสราง honeywords

นยามของความมนคงปลอดภยของวธการสราง honeywords หรอฟงกชน Gen(k;pi) ไดใชทฤษฎ adversarial game ซงใชในการทดสอบความสามารถของผประสงคราย เพอความงายในการอธบาย ใหพจารณาจากฟงกชน Gen(k;pi) เมอผใชงานสงรหสผาน pi เขาสระบบ โดยจะดำเนนการดงตอไปน

12

รปท 2.4 ขนตอนการทำงานของฟงกชน Gen(k;pi)

จากรปท 2.4 ฟงกชน Gen(k;pi) จะเรมโดยใชขอมลรหสผาน pi ทผใชงานสงเขามาในระบบ โดยองคประกอบของรหสผานจะขนกบนโยบายและผใชงาน ผลลพธของ Gen(k;pi) คอ แถวขอมลของรหสผาน Wi และตำแหนงของรหสผาน c(i) ซงไดจากการหาตำแหนงของรหสผาน pi ในแถวขอมลของรหสผาน Wi

13

รปท 2.5 ผประสงครายไดรายการของรหสผานไป

จากรปท 2.5 ผประสงครายทไดแถวขอมลของรหสผาน Wi ไป และอาจมบางคาสมทเปน คาแฮชทยากตอการ brute force (touch nut,⁇) ซงเปน hard honeywords และผประสงครายตองเลอกวาจะผาน หรอทำการ brute force รหสผานทไดมาและเดาวารหสผานทถกตองคอรหสผานใดจากรหสผานจำนวน k ตว จากตวอยาง คา k คอ 6 ยงจำนวนรหสผานในแถวขอมลของรหสผาน Wi ตอผใชงานหนงคน มจำนวนมากเทาใดโอกาสในการเดารหสผานไดถกตองตงแตครงแรกยงมนอยลง

ผลลพธทไดเปนได 3 แบบ คอ 1) ผประสงครายชนะ สามารถทจะ brute force รหสผาน และเดารหสผานไดถกตองในครงแรก 2) ผประสงครายถกจบ ถาเขาเดารหสผานแตรหสผานนนคอ honeywords 3) ผประสงครายยอมแพ คอ เขาไมดำเนนการตอ อาจเกดจากสมนำ touch nut เพอนำไป brute force แลวไมสามารถหาคาได หรอไมสามารถ brute force คาใดๆไดเลย

14

2.8 ทฤษฎความนาจะเปน

สามารถคำนวณคาความนาจะเปนได ดงสมการท 2.12

P(E) = n(E) / n(S) (2.12)

ให E เปนเหตการใดๆ ทเปนสวนหนงของแซมเปลสเปส S P(E) คอ ความนาจะเปนของเหตการณ

สมมตใหมรหสผาน k เทากบ 20 ตว และผประสงครายไดรรายการของรหสผาน Wi และสามารถ brute force sweetwords ทงหมด 20 ตว โดยมโอกาสเลอกไดรหสผานทถกตอง 1 ตว จากทงหมด 20 ตว ดวยการเรยงแบบสม คอ 1 ใน 20 จะคดเปนรอยละ 5 ทจะสามารถเลอกรหสผานไดถกตองในครงแรก หรอสมมตจำนวนของรหสผาน k นอยลง เชน กำหนดจำนวนของรหสผาน k เทา 4 กยงมโอกาสเพยงรอยละ 25 ทจะเดารหสผานไดถกตองในครงแรก หรอมโอกาสรอยละ 75 ทจะถกจบได ซงเพยงพอทจะยอมรบได แตถงแมวาจะเปนวธทสามารถตรวจสอบผประสงครายได แตกมความเสยงทผประสงครายจะทำการลบไฟลรหสผานของระบบทงได

15

บทท 3

วธการดำเนนงาน

จากการศกษาขางตน ไดออกแบบภาพรวมระบบโดยแบงเปน 2 สวนหลกคอ Computer System ในโครงงานนจะใช CIBB ซงเปนเวบแอปพลเคชนกระดานสนทนานำมาประยกตใชกบ Honeywords โดยแกสวนโครงสรางของการเขาสระบบ และในสวน Honeychecker จะใชสำหรบเชครหสผานและเกบตำแหนงของรหสผานในระบบ โดยระบบทงสองมการเขารหสลบเชอมตอกนดงรปท 3.1

รปท 3.1 ภาพรวมของระบบ

- ฟงกชน Set(i,j) จะอยใน Computer System (S1) เปนคำสงทใชเมอมการตงรหสผานครงแรกหรอเปลยนรหสผานใหม โดยจะสงขอมลไปยง Honeychecker (S2) เพอให honneychecker ไดรวารหสผานทถกตองอยทตำแหนง j และเปนรหสผานของผใชงาน ui

- ฟงกชน Check(i,j) อยใน Computer System (S1) เปนคำสงทใชเมอมการเขาสระบบ โดยจะสงขอมลไปยง Honeychecker (S2) เพอตรวจสอบวาตำแหนงของรหสผานทไดจากแถวขอมลของรหสผาน Wi ซงแทนดวยตำแหนงของรหสผาน c(i) มคาเทากบ j ทอยในฐานขอมลของ honeychecker (Table c) หรอไม ถา ตำแหนงของรหสผาน c(i) เทากบ การหาคาตำแหนงของรหสผานทผใชสงเขามา j จะหมายความวารหสผานถกตอง ผใชงานจะเขาสระบบได แตถาไมเทากนจะแจงเตอนไปยงผดแลระบบวามผประสงครายไดทำการใช honeywords ทอยในแถวขอมลของรหสผาน Wi พยายามเขาสระบบดวยชอผใชงาน ui แตถารหสผานทผใชงานสงมา ไมตรงกบรหสผานในแถวขอมลรหสผาน Wi เลย จะสงขอมล j = 0 หมายความวาอาจมการโจมตดวยการเดารหสผานเขามาในระบบ

16

- Gen(k;pi) อยใน Computer System (S1) เปนฟงกชนทใชทำหนาทสรางแถวขอมลรหสผาน Wi โดย pi คอรหสผานทผใชงาน ui สงเขามาในระบบ

- Honeychecker อยใน S2 มหนาทในการเกบตำแหนงของรหสผาน j จากฟงกชน Set(i,j) ซงเปนตำแหนงรหสผานทถกตองในแถวขอมลรหสผาน Wi และมหนาทตรวจสอบขอมลทสงมาจากฟงกชน Check(i,j)

นอกจากนฟงกชนเบองหลงสวนตดตอผใชงานในขนตอนการเขาสระบบตองมการปรบแตงใหม โดยในสารนพนธนจะปรบเปลยน CIBB basic forum with Codeigniter and Twitter Bootstrap ซงเปนกระดานสนทนาทถกสรางดวย Codeigniter ใหรองรบกบการทำงานของระบบ Honeywords

ขนตอนการดำเนนงานมดงน

1. ศกษาคนควาเกยวกบทฤษฎและการทำงานของ honeywords แลวแบงสวนการศกษาและการนำมาประยกตใชงานจรง

2. ศกษาสวน Honeywords Generation และเรมเขยนฟงกชนการทำงานของ Honeywords Generation

3. ศกษาสวน นโยบายการตงรหสผาน และนำมาประยกตใชสำหรบการทำ Input validation ในการรบรหสผานจากผใชงานและปรบแตงกระบวนการเขาสระบบ

4. ศกษาสวนของฟงกชน Honeychecker ซงใชสำหรบเกบขอมลตำแหนงของรหสผานทถกตองเพอใชในการตรวจสอบ และเรมเขยนฟงกชนการทำงานของ Honeychecker

5. ศกษาสวนของฟงกชน Set(i,j) ซงใชสำหรบรบขอมลรหสผานทผใชสงเขามาในระบบเพอนำไปสราง honeywords และเรมเขยนฟงกชนการทำงานของ Set

6. ศกษาสวนของฟงกชน Check(i,j) ซงใชสำหรบตรวจสอบรหสผานทผใชงานสงเขามาในระบบวาเปน honeyword หรอ รหสผานจง และเรมเขยนฟงกชนการทำงานของ Check

7. ทำการเชอมระบบตางๆ และเรมทดสอบการทำงานของระบบโดยรวม 8. เขยนรายการปญหาทพบและยกตวอยางการปญหาการทำงานหรอสมมตเหตการณการ

โจมต 9. สรปผลการทำงานของระบบวาสามารถใชตรวจจบผประสงครายในการเขาสระบบโดยใช

honeyword ได และวดประสทธภาพการทำงานของระบบวามความแตกตางกบระบบปกตอยางไร

17

3.1 Honeywords Generation ( Gen )

รปท 3.2 ขนตอนการทำงานของฟงกชน Gen

จากรปท 3.2 ฟงกชน Gen(k:pi) เปนฟงกชนทสำคญมาก เนองจาก honeywords ตองมความแตกตางกบรหสผานทถกตอง แตควรมความคลายกนอยดวย เพอไมใหผประสงครายแยกแยะออกไดวารหสผานไหนเปนรหสผานทถกตอง

ขนตอนการสรางฟงกชน Gen(k;pi) เพอใหไดแถวขอมลของรหสผาน Wi แบงออกไดเปน 2 แบบ ดงน

- Legacy-UI เมอมการตงรหสผานครงแรกหรอเปลยนรหสผานใหม สวนตดตอผใชไมไดถกเปลยนแปลง โดยไดเสนอ 2 วธการ คอ chaffing-by-tweaking กบ chaffing-with-a-password-model

- Modified-UI เมอมการตงรหสผานครงแรกหรอเปลยนรหสผานใหม สวนตดตอผใชมการเปลยนแปลง วธการนอาจเรยกวา “take-a-tail” โดยสวนตดตอผใชจะเปลยนทกครงเมอมการสรางรหสผานใหม โดยสมตวเลข 3 หลก เพมเขาไปในสวนทายของรหสผานทผใชงานสงเขามา

จากนนทำการทดสอบการเดาสม เพอหาวามความเปนไปไดทจะเดารหสผานไดถกในครงแรกหรอไม ดวยการใชฟงกชน random ในภาษาไพทอน และจดทำแบบทดสอบเพอทดสอบกบกลมบคคลจรง

18

3.1.1 Legacy-UI password changes

กระบวนการเปลยนรหสผานโดยทวไป คอ ผใชงานจะใสชอผใช, รหสผาน และบางทอาจมการใหใสรหสผานเพอยนยนอกครง สวนตดตอผใชจะไมแสดงใหผใชรเลยวามการใชงาน honeywords หรอมการตอบโตกบผใช เพอไมใหสงอทธพลตอการเลอกใชรหสผานของผใชงาน ซงเปนขอดของวธน

รปท 3.3 ขนตอนการทำงานของฟงกชน Gen (ตอ)

จากรปท 3.3 เปนขนตอนการทำงาน เมอผใชงานสงรหสผานเขามาใหรหสผานนนแทนดวย pi และระบบจะสรางเซตของ k - 1 honeywords โดยมรปแบบทคลายกบรหสผานทผใชสงเขามาในระบบ ซงผประสงครายจะมความยากในการแยกแยะรหสผานทแทจรงออกจาก sweetwords ของผใชงาน ui คำวา Chaffing ในทน คอ เมอรหสผาน pi ทผใชงานสงเขามาในระบบจะเขาสกระบวนการสราง honeywords ดวยฟงกชน Gen โดยจะทำการสรางเซตของ k - 1 honeywords และลกษณะของ honeywords นน จะขนกบรหสผาน pi ทผใชงานสงเขามาในระบบ จากนนนำรายการของรหสผานทไดจากฟงกชน Gen ไปเกบไวในแถวขอมลของรหสผาน Wi และเรยงลำดบแบบสม และหาคาตำแหนงของรหสผานทถกตอง c(i) ซงจะเทากบตำแหนงของรหสผาน pi ในแถวขอมลรหสผาน Wi ความสำเรจของ Chaffing จะขนอยกบคณภาพของกระบวนการสราง วธการนจะใชไมไดผลหากผประสงคราย แยกความแตกตางของรหสผานทถกตองกบ honeywords ออกจากกนไดงาย สำหรบ Legacy-UI เราม 2 วธทจะสราง honeywords ใหมความใกลเคยงกบรหสผานทถกตองดงน

19

3.1.1.1 Chaffing by tweaking คอ การแทนทตวอกษรในรหสผาน

1) Chaffing-by-tail-tweaking ขนแรกจะเลอกตำแหนงของรหสผานทไดรบมา ให t แทนตำแหนง เชน (t = 2, t = 3) วธการน เมอเลอกคา t แลวจะทำการแทนทตวอกษรของรหสผานตงแตตวอกษรสดทายนบมา t ตวอกษร โดยการแทนทนนจะแทนตามชนดของตวอกษร เชน ตวเลข,พยญชนะ,ตวอกษรพเศษ เปนตน เมอเราใหรหสผาน คอ “BG+7y45” แลว Wi ทจะไดจากการกำหนด t = 3 และ k = 4 จะเปนไดดงน คอ BG+7q03, BG+7m55, BG+7y45, BG+7o92 2) Chaffing-by-tweaking-digits วธการนตองพงนโยบายของการตงรหสผานดวย เพราะมขอจำกดวาตองมตวเลขอยในรหสผานทถกตอง pi และหากมตวเลขทนอยกวา t คา t จะตองเปลยนได เมอเรากำหนด t = 2 จะไดผลลพธดงน คอ 42*flavors, 57*flavors, 18*flavors

3.1.1.2 Chaffing-with-a-password-model

เปนวธการสมเลอก honeywords จากกลมคำตางๆจาก 1,000 หรอ 1,000,000 รปแบบ โดยเมอใชฟงกชน Gen จะได honeywords ดงน

kebrton1 a71ger 1erapc aiwkme523 9,50PEeJRV.0?RIOtc&L-:IJ”b+Wol<*[!NWT/pb xyqi3tbato #NDYRODD_!! pizzhemix01 sveniresly mobopy a3915 venlorhan dfdhusZ2 ‘Sb123 WORFmgthness

การสรางแบบจำลองไวยากรณของ chaffing-with-a-password-model แบบอน ยงมอกวธทนาสนใจ คอ การนำแบบแผนของรหสผานทถกตอง นำมาแยกกลมคำออก

20

จากกนตามชนด เชน คำ, ตวเลข หรอกลมของตวอกษรพเศษดงเชน mice3blind โดยเราสามารถจำแนกคำออกไดเปน W4|D1|W5 หมายถงม 4 ตวอกษร, 1 ตวเลข และ 5 ตวอกษร จากนนทำการแทนทโดยการสมคำใหตรงกบรปแบบดงกลาว เชน W4 = gold, D1 = 5, W5 = rings จะไดผลลพธคอ gold5rings โดยคำทนำมาแทนนนมาจากพจนานกรม

3.1.1.3  Chaffing with “tough nuts”

ความตองการอกอยางของ honeywords คอ การยากทจะหาคำทแทจรงจากคาแฮช โดย tough nuts อาจไมไดมาจากการนำกลมคำทมความยาวมากๆและไมมความหมายมาผานฟงกชนแฮชเทานน แตอาจเปนการสมคาใหมความยาวเทากบคาแฮช เชน 128 bits, 256 bits เปนตน ในทนเราแทนดวย ⁇ โดยนำคาทไดไปรวมอยในแถวขอมลของรหสผาน Wi ไดดงน gt79, tom@yahoo, ⁇, g*7rn45, rabid/30frogs!, ⁇

3.1.2 Modified-UI password changes

จากวธการ “take-a-tail’ ทเปน Legacy-UI เราสามารถปรบเปลยนสวนตดตอผใชเลกนอย โดยใหระบบสมเพมสวนทายของรหสผานทผใชตองการ จากเดม

Enter a new password :

เปลยนเปน

Propose a password : ******** Append ‘413’ to make your new password. Enter your new password : ***********

ดงนนหากผใชงานตงรหสผานเปน “RedEye2” รหสผานใหมจะเปน “RedEye2413” โดยขน ตอนของการสมเพมสวนทายจะเกดขนในสวนของกระบวนการเปลยนรหสผาน ณ ขณะนน

3.1.3 Hybrid generation methods

เปนการรวมกนของ chaffing-with-a-password-model กบ chaffing-with-tweaking-model โดยมวธดงน

21

1) ใช chaffing-with-a-password-model กบรหสผานทรบมาจากผใชงานและสรางเซตทมขนาดมากกวาหรอเทากบ 2 โดยอาจมการใช tough nuts ดวย ใหผลลพธทไดแทนดวย WW 2) ใช chaffing-by-tweaking-digits โดยกระจายใหในแตละคำใน WW โดยตวเลขทใชมขนาดมากกวาหรอเทากบ 2 จะไดเซต WW ทมขนาด k = a x b 3) สมสลบคาใน WW และกำหนด c(i) ซงเปนตำแหนงของรหสผานทถกตอง

3.1.4 Storage optimization

ในบางวธเชน Chaffing-by-tweaking-digits และ Hybrid generation methods นน สามารถทจะลดการเกบจำนวนคาแฮชลงได เนองจากวธการ honeywords นจะทำใหการเกบคาแฮชเพมขน เชน หากม honeywords 19 คำ ตองเกบคาแฮชในไฟลทเกบรหสผานเพมอก 19 คา ดงนนเปนการดทจะลดจำนวนการเกบรหสผานลงเพอไมใหไฟลรหสผานมขนาดใหญมากเกนไปดวยวธการดงตอไปน ยกตวอยางกรณมตวเลข 2 ตวตดกนอยในสวนทาย เราจะไดจำนวนคาทเปนไปได 100 คา ดงนน คา k = 100, Wi = T(pi) = {wi,1,…,wi,k} โดยเรยงลำดบแบบ lexicographic [6] จากนนสมคา wi,r จาก T(pi) และเกบคา H(wi,r) ในระบบ

3.2 นโยบายการกำหนดรหสผาน 1) การกำหนดรปแบบของการตงรหสผาน (Password Syntax) เปนการตงกฎในการกำหนดรหสผาน โดยผใชงานจะตองตงรหสผานทมความยาวมากกวาหรอเทากบ 8 ตวอกษรและตองประกอบดวยตวเลข ตวอกษรและอกขระพเศษ 2) การกำหนดรหสผานจาก Dictionary words แตรหสผานอาจไมจำเปนตองเปนคำในพจนานกรมเทานน 3) การกำหนดรหสผานทเคยมการใชงานมาแลวในชอผใชงานนน โดยไมควรนำรหสผานทเคยใชแลวมาใชอกในผใชงานคนเดยวกนอยางนอยระบบควรเกบรหสผานทเคยตงไวแลว 10 รหสผานเพอใชอางอง 4) Most common passwords เพมรายการของรหสผานทงายตอการเดาอยางนอย 500 รหสทใชแพรหลาย เพอใหผใชงานหลกเลยงการตงรหสผานแบบน 5) Popular passwords เปรยบเทยบผใชคนอนวามการใชรหสผานทเหมอนกนหรอไม โดยนำมาเขยนเปนรายการ หากเปนรหสผานทมหลายผใชงานใชซำกน ควรทจะหลกเลยงไมใหมการตงรหสผานแบบเดยวกน

22

3.3 การสรางตวอยางงาน 3.3.1 ตดตงระบบ CIBB basic forum with Codeigniter and Twitter Bootstrap สามารถดาวนโหลดและตดตงไดตามเอกสารอางองท 7 ใชสำหรบสรางตวอยางงานในสวนของระบบ

3.3.2 ตดตง Codeigniter Rest Server.

สามารถดาวนโหลดและตดตงไดตามเอกสารอางองท 8 ใชสำหรบสรางตวอยางงานในสวนของ honeychecker โดยระบบจะสงขอมลโดยใชงานเซอรวส RESTful หรอเวบเซอรวส HTTP เพอตรวจสอบวาตำแหนงของรหสผานถกตองตรงกน

3.3.3 สราง library ของ Codeigniter สำหรบระบบตวอยางเพอใชกบ CIBB

ดตวอยางของโปรแกรมไดท ภาคผนวก ง โดย library นจะประกอบดวย

1) ฟงกชน Gen ใชสำหรบสรางรหสผานทคลายคลงกบรหสผานของผใชเพอสราง กลมของรหสผาน (Wi,j) สำหรบเกบลงในฐานขอมล 2) ฟงกชน Check ใชสำหรบสงขอมลตำแหนงไปยง honeychecker เพอตรวจสอบวารหสผานทใชเขาสระบบมความถกตองหรอไม 3) ฟงกชน Set ใชสำหรบสงขอมลตำแหนงเมอมการสรางหรอเปลยนรหสผาน 4) ฟงกชนทจำเปนอนๆ เชน ฟงกชนในการหาตำแหนงของตวเลขทอยในรหสผาน , การแฮชกลมของรหสผาน Wi,j โดยในตวอยางนจะใช sha256

3.3.4 สราง Table c สำหรบเกบขอมลตำแหนงรหสผาน และ honeychecker

สำหรบ Table c นนตวอยางงานนจะใช Maria DB โดยมโครงสรางตามทฤษฎ คอ ID ของผใช และ ตำแหนงของรหสผาน สวน honeychecker สามารถดตวอยางของโปรแกรมไดท ภาคผนวก จ โดยจะเปนสวนของโปรแกรมสำหรบสรางเวบเซอรวสดวย Codeigniter Rest Server. [8]

3.3.5 สรางระบบตวอยาง

1) ปรบแตงขนตอนการสมครผใชใหมบน CIBB โดยขนตอนการสมครสมาชกนน เมอระบบรบขอมลของชอผใชและรหสผานจากผใชแลวจะทำการตรวจสอบวารหสผานมตวเลขอยหรอไม และนำรหสผานมาผานฟงกชน Gen เพอใหได Wi,j จากนนหาตำแหนงของ

23

รหสผานทถกตอง กอนนำมาทำการแฮชและเกบลงฐานขอมล และสงตำแหนงทถกตองพรอมทง ID ของผใชงานไปยงฐานขอมลใน honeychecker ดวยฟงกชน Set(i,j) (ดตวอยางโปรแกรมไดท ภาคผนวก ฉ) 2) ปรบแตงขนตอนการเขาสระบบบน CIBB ซงเปนเวบแอปพลเคชนกระดานสนทนา โดยขนตอนการเขาสระบบนน เมอไดรบขอมลของชอผใชและรหสผานจากผใชแลว จะนำรหสผานมาทำการแฮชแบบ sha256 แลวนำไปเชคกบ Wi,j ทเกบแฮชของรหสผานไว โดยหาตำแหนงของ Array แลวสงไปตรวจสอบทเวบเซอรวส HTTP ของ honeychecker หากตำแหนงถกตองจะตอบกลบเปน True แปลวารหสผานถกตอง แตหากเปน False แปลวาตำแหนงทสงมาไมถกตองหรอคอ มผประสงครายไดรหสผานทเปน honeyword ไปแลวนำมาเขาสระบบ (ดตวอยางโปรแกรมไดท ภาคผนวก ฉ)

3.3.7 สรางแบบทดสอบสำหรบเกบสถตการเดารหสผานโดยมหวขอดงตอไปน

1) แบบทดสอบเพอเกบสถตการเดาวาคาแฮชใดคอรหสผานทถกตอง โดยจะสรางรายการของคาแฮชและกำหนดวาคาแฮชใดคอรหสผานทถกตองและสมใหกลมคนเลอกคาแฮชในรายการนน และทำการเกบผลดงกลาวสรปเปนสถต 2) แบบทดสอบเพอเกบสถตของการเดารหสผานจากกลมคำโดยสรางรายการของกลมคำโดยใชวธ Chaffing-by-tail-tweaking และใหกลมคนเลอกคำใดคำหนงจากรายการ และทำการเกบผลดงกลาวสรปเปนสถต 3) แบบทดสอบเพอเกบสถตของการเดารหสผานจากกลมคำโดยสรางรายการของกลมคำโดยใชวธ Chaffing-by-tweaking-digits และใหกลมคนเลอกคำใดคำหนงจากรายการ และทำการเกบผลดงกลาวสรปเปนสถต 4) แบบทดสอบเพอเกบสถตของการเดารหสผานจากกลมคำโดยสรางรายการของกลมคำโดยใชวธ Chaffing-with-a-password-model และใหกลมคนเลอกคำใดคำหนงจากรายการ และทำการเกบผลดงกลาวสรปเปนสถต

3.3.6 ทดสอบระบบ

1) ทดสอบการสมครผใชใหม ระบบจะตองสามารถสราง honeywords จากรหสผานทผใชงานสงเขามาไดโดยรหสผานนนจะตองแตกตางจากรหสผานจรง และม touch nut รวมอยดวย 2) ทดสอบการเขาสระบบ เมอมผใชงานเขาสระบบและเมอมผประสงครายทลวงร honeyword และนำกลบมาเขาสระบบ 3) ทดสอบประสทธภาพของระบบและเปรยบเทยบกบระบบปกตในการสมครสมาชก และการเขาสระบบ

24

4) ทดสอบโดยการสมมตใหผประสงครายไดรหสผานไปแลวนำรหสผานเขาสระบบ 5) ทดสอบความนาจะเปนในการเดารหสผานไดถกตองในครงแรก โดยการสรางแบบสอบถามเพอเกบสถตในการเดารหสผานและใหกลมบคคลทวไปทำแบบสอบถาม

25

บทท 4

ผลการดำเนนงาน

4.1 ผลการศกษาวธการดำเนนงานในสวนการสราง honeywords (Gen)

4.1.1 Legacy-UI password changes

เปนวธการทสวนการตดตอผใชงานไมตองมการตอบโตกบผใชงาน มลกษณะของสวนตดตอผใชทเหมอนเดม ทำใหผใชงานหรอผประสงครายนนไมทราบวาม honeywords อยเบองหลงในการเขาใชระบบหรอในการตงรหสผาน จงทำให honeywords ไมมอทธพลตอการตดสนใจในการตงรหสผานของผใชงาน เนองจากหากมการแกไขสวนตดตอผใช เชน มการใหระบบตงรหสผานใหตอทายกบรหสผานของผใชงานทสงเขามาในระบบ จะทำใหผใชงานนนตงรหสผานทงายกวาปกต หรอลงทายดวยตวเลขเพอใหสอดคลองกบรหสทระบบสรางขนมาใหผใชงานเหน

4.1.1.1 Chaffing-by-tweaking

เปนวธการใชการแทนทตวอกษรโดยจะทำใหรหสผานทระบบไดสรางขนมความคลายคลงกบรหสผานทผใชงานกำหนดซงจะทำใหผประสงครายแยกแยะรหสผานทถกตองไดยากขน แบงออกเปน 2 วธดงตอไปน 1) Chaffing-by-tail-tweaking เปนการแทนทตวอกษรดานทายของรหสผาน โดยหากกำหนดใหรหสผาน คอ 57*flavors เมอผานฟงกชน Gen จะได 57*flavrbn, 57*flavctz ซงวธนดเหมอนเปนวธทดแตจะเหนวา honeywords เปนคำทแปลกจากรหสผานและผประสงครายสามารถแยกแยะไดงายมาก 2) Chaffing-by-tweaking-digits เปนการแทนทตวอกษรทเปนตวเลขดวยตวเลขทระบบสมขน นำไปแทนทลงในรหสผานทผใชงานกำหนด โดยวธนมขอเสยทจำเปนจะตองใหการกำหนดนโยบายของรหสผานและแกไขสวนของการตงรหสผานของผใชใหรองรบวาตองมตวเลขอยในรหสผานดวย

4.1.1.2 Chaffing-with-a-password-model

จากการศกษาพบวาวธนเปนวธทสามารถสรางรหสผานไดกวางขวาง มความแตกตางกน และมความแขงแรง แตหากกลมคำตางๆ จาก 1,000 หรอ 1,000,000 รป

26

แบบนน สามารถหาไดงายหรอผประสงครายกมรายการกลมคำแบบเดยวกนกจะสามารถทำใหลวงรถงขอมลรหสผาน (Wi) กอนผานฟงกชนแฮชไดโดยงาย วธแกปญหาของ chaffing-with-a-password-model ไดม Ari Juels and Ronald L. Rivest, Honeywords [1] เขยนฟงกชนไวแลว (ดรายละเอยดไดทภาคผนวก ก) โดยฟงกชนดงกลาวจะมการคำนวนตำแหนงตวอกษรของคำในกลมคำอนนำมาแทนทโดยสามารถตงคาเปอรเซนของการแทนทได

4.1.1.3 Chaffing with “touch nuts” วธนมไวสำหรบใชรวมกบวธอน โดยมจดมงหมายเพอทำใหผประสงครายหยดการหาคาทแทจรงจากคาแฮช เพราะ touch nuts เปนคาทมความยาวมากกวา 40 ตวอกษรหรอบางทอาจสมคาแฮชขนมาเลย จงเปนคำทไมมความหมายมไวสำหรบสรางความสบสนใหผประสงคราย สำหรบผลการทดสอบโดยการทดสอบใชแบบทดสอบเพอเกบสถตการเดาวารหสผานทถกตองของกลมบคคล

4.1.2 Modified-UI password changes

วธนมไวเพอแกปญหาทเกดใน chaffing-by-tail-tweaking ในขอ 4.1.1 โดยวธนระบบจะสมตวเลขเพมเขาไปดานทายของรหสผานใหอตโนมตจาก 57*flavors, 57*flavrbn, 57*flavotz เปน 57*flavors413, 57*flavors761, 57*flavors812 ซงรหสผานทไดมองดแลวแยกแยะรหสผานทถกตองออกไดยากกวา และยงชวยลดปญหาการใชรหสผานซำเดมเมอมนโยบายใหเปลยนรหสผานตามเวลาทกำหนด แตขอเสยของวธนคอ ผใชงานตองจำรหสผานทระบบตงใหเพม และจากการปรบเปลยนสวนตดตอผใช อาจสงผลใหผใชงานสบสน หรอพยายามทจะเปลยนรหสผานใหไดเหมอนเดม โดยสงเปลยนรหสผานใหระบบสมคาชดหลงจนกวาจะไดเหมอนเดม

4.1.3 Hybrid generation

เปนการรวมกนของ chaffing-with-a-password-model กบ chaffing-by-tweaking-digits ซงไดฟงกชนการทำงานทด แตจากการศกษาพบวารปแบบวธนนไมยดหยนเทาทควร จากหวขอ 3.1.3 นนพบวาการกระจาย chaffing-by-tweaking-digits ลงไปในคำทไดจาก chaffing-with-a-password-model นนทำใหรปแบบของรหสผานถกกำหนดวาตวเลขจะอยดานหลงสดของรหสผานเสมอ ถงแมวาจะเปนวธทด แตถาหากดจากรปแบบแลว การนำไปใชงานเมอผใชงานตองการตงรหสผานใหมหรอเปลยนรหสผานนน ตองทำตามรปแบบดงนกอาจทำใหเปนทสงสยได ดงนนจงคดกระบวนการทมความยดหยนทผใชงานสามารถตงรหสผานทยดหยนขน เพยงแตมขอแมวาตองมตวเลขทตดกนอยางนอยสองตว แตจะอยตรงไหนของคำ

27

กได โดยวธการสราง honeywords ยงคงทำไดเชนเดมโดยกำหนดรหสผานทผใชงานตองการ คอ T576ngUi_65 โดยวธนจะทำการหาคาตวเลขทมากทสด และอยหลงสดของคำ โดยจากรหสผานทกำหนดนคอ 576 จากนนเราใชวธการ chaffing-with-a-password-model ตามปกต และตอดวยการกระจายคำจาก chaffing-by-tweaking-digits และตอดวย chaffing-with-a-password-model อกครงนงแตมจำนวนตวอกษรเทากบ ngUi_65 คอ 7 ตว จะไดรปแบบผลลพท คอ YGH965uisnku8, YGH542uisnku8, … และ UI692kkjuig_6, UI086kkjuig_6, … (ดตวอยางของโปรแกรมไดท ภาคผนวก ค)

4.2 ผลการทดสอบระบบ

4.2.1 ผลการทดสอบระบบการแสดงหนาตางการสมครผใชใหม นำ CIBB ซงเปนระบบกระดานสนทนา มาปรบแตงสวนการสมครผใชใหม แตหนาตางการสมครผใชใหมจะยงคงเหมอนเดม ซงผใชงานจะไมทราบวามระบบ honeyword อยเบองหลง ดงรปท 4.1

รปท 4.1 สวนแสดงผลสำหรบสมครสมาชก

เมอสมครสมาชกแลวระบบจะประมวลผลจากรหสผานทผใชงานสงเขามาในระบบและทำการสราง honeywords โดยจะเกบเปนคาแฮชของรหสผานแตงละรหสผานรวมกบรหสผานจรงทผใชงานสงเขามาในระบบดงรปท 4.2

28

รปท 4.2 ฐานขอมลเมอมการสมครสมาชกสำเรจ

ทำการวดประสทธภาพการทำงานระหวางระบบปกตกบระบบทใชงาน honeywords ดงรปท 4.3 และ 4.4 จะเหนวาเวลาในการประมวลผลขอมลสวน Base Classes นนมคาใกลเคยงกนเนองจากไมไดมการปรบแตงแกนกลางของ Codeigniter เลย แตเมอดเวลาของการประมวลผลในสวน Controller (User / Join) จะเหนวาระบบปกตนนมการทำงานทเรวกวาระบบทใชงาน honeyword เนองดวยระบบทใชงาน honeyword ตองมการประมวลผลในสวนของการสรางรหสผานเพมเตม สำหรบในสวนของการใชงานหนวยความจำ (Memory usage) นนแนนอนวาหากมการประมวลผลมากกวากตองยอมใชหนวยความจำมากกวา

รปท 4.3 ประสทธภาพของระบบทใช honeywords ของการสมครสมาชก

29

รปท 4.4 ประสทธภาพของระบบทไมใช honeywords ของการสมครสมาชก

4.2.2 ผลการทดสอบระบบการแสดงหนาตางการตงรหสผานใหม นำ CIBB ซงเปนระบบกระดานสนทนา มาปรบแตงสวนการตงรหสผานผใชใหม แตหนาตางการตงรหสผานผใชใหมจะยงคงเหมอนเดม ซงผใชงานจะไมทราบวามระบบ honeyword อยเบองหลง ดงรปท 4.5

รปท 4.5 สวนแสดงผลสำหรบเขาสระบบ

ทำการวดประสทธภาพการทำงานระหวางระบบปกตกบระบบทใชงาน honeywords ดงรปท 4.6 และ 4.7 จะเหนวาเวลาในการประมวลผลขอมลสวน Base Classes นนมคาใกลเคยงกนเนองจากไมไดมการปรบแตงแกนกลางของ Codeigniter เลย แตเมอดเวลาของการประมวลผลในสวน Controller (User / Join) จะเหนวาระบบปกตนนมการทำงานทเรวกวาระบบทใชงาน honeyword เนองดวยระบบทใชงาน honeyword ตองมการประมวลผลในสวนของการสรางรหสผานเพมเตม สำหรบในสวนของการใชงานหนวยความจำ (Memory usage) นนแนนอนวาหากมการประมวลผลมากกวากตองยอมใชหนวยความจำมากกวา

30

รปท 4.6 ประสทธภาพของระบบทใช honeywords ของการตงรหสผานใหม

รปท 4.7 ประสทธภาพของระบบทไมใช honeywords ของการตงรหสผานใหม

4.2.3 ผลการทดสอบการเขาสระบบ

นำ CIBB มาปรบแตงสวนการเขาสระบบ แตหนาตางการเขาสระบบจะยงคงเหมอนเดม และผใชงานจะไมทราบวามระบบ honeyword ทำงานอยเบองหลง ซงจะไมสงผลตอผใชงานและผประสงครายกจะไมทราบวามระบบ honeyword อยเลย ดงรปท 4.5

รปท 4.8 สวนแสดงผลสำหรบเขาสระบบ

31

ทำการวดประสทธภาพการทำงานระหวางระบบปกตกบระบบทใชงาน honeywords ดงรปท 4.6 และ 4.7 จะเหนวาเวลาในการประมวลผลขอมลสวน Base Classes นนมคาใกลเคยงกนเนองจากไมไดมการปรบแตงแกนกลางของ Codeigniter เลย แตเมอดเวลาของการประมวลผลในสวน Controller (User / Join) จะเหนวาระบบปกตนนมการทำงานทเรวกวาระบบทใชงาน honeyword เนองดวยระบบทใชงาน honeyword ตองมการประมวลผลในสวนของการสรางรหสผานเพมเตม สำหรบในสวนของการใชงานหนวยความจำ (Memory usage) นนแนนอนวาหากมการประมวลผลมากกวากตองยอมใชหนวยความจำมากกวา

รปท 4.9 แสดงประสทธภาพของระบบทใช honeyword ของการเขาสระบบ

รปท 4.10 แสดงประสทธภาพของระบบทไมใช honeywords ของการเขาสระบบ

4.2.4 ผลการทดสอบใหผประสงครายไดรหสผานไปแลวนำรหสผานเขาสระบบ การทดสอบไดลองนำคาแฮชทเปน honeywords คอ sha256 4fb365e2901e492fb9552523c98bfd2bfcc9d1b0b20af6c24acd38c641c33d15 มาทำการหาคารหสผานดวยเครองมอ https://crackstation.net/ ซงเปนเวบแอปพลเคชนทไดรวบรวมกลมคำวามคาแฮชคอคาใด หากเราใสคาแฮชลงในระบบและในฐานขอมลของเวบแอปพลเคชนดงกลาวมขอมลจะแสดงผลดงรปท 4.8

32

รปท 4.11 แสดงผลลพธของการนำแฮชมาสมหาคาจรง

เมอลองทำการเขาสระบบดวยรหสผานทเปน honeywords สวนผประสงครายทใช honeywords เขาสระบบนน โปรแกรมตวอยางนจะไมอนญาตใหผประสงครายเขาสระบบ โดยจะแสดงขอความขอมลชอผใชหรอรหสผานไมถกตอง และโปรแกรมตวอยางจะทำการเกบไอพของผประสงคราย ทำใหผดแลระบบทราบแลววาระบบทดแลอยนนมชองโหวทสามารถทำใหผประสงครายรถงรหสผานไดดงรปท 4.9

รปท 4.12 แสดงตารางฐานขอมลเมอผประสงครายใช honeywords เขาสระบบ

4.3 ผลการทดสอบความนาจะเปนในการเดารหสผาน

ทดสอบโดยการสรางแบบสอบถามเพอเกบสถตในการเดารหสผาน เพอเปนขอมลวาการเดารหสผานใหถกตองตงครงแรกนนมความเปนไปไดมากนอยเพยงใดโดยแบงการทดสอบออกดงน

4.3.1 ทดสอบสถตการเดาวาคาแฮชใดคอรหสผานทถกตอง โดยการสรางรายการของคาแฮชขนมา 20 คา และสมกลมคนเพอมาทำแบบทดสอบโดยการเลอกคาแฮช 1 คา จาก 20 คา ดงรปท 4.10 จากนนจะทำการเกบขอมลดงกลาวและนำมาสรปผลเปนรอยะของความนาจะเปนทกลมคนมโอกาสทจะเดารหสผานจากคาแฮชไดถกตองตงแตครงแรก โดยกลมคนทจะทำแบบทดสอบจะเปนกลมบคคลทมความรและไมมความรในระบบคอมพวเตอร เพอแสดงใหเหนวาเปนการเดาสมจรงๆ

33

รปท 4.13 แบบทดสอบเกบสถตการเดาวาคาแฮชใดคอรหสผานทถกตอง

34

ผลการสำรวจแบบทดสอบเกบสถตการเดาวาคาแฮชใดคอรหสผานทถกตอง

24/2/2557, 21:32:02 yingnui.taroo@gmail.com หญง 21 - 30 ป ไดเลอก 2733ab3bc0e4efc7fe290c1db4c5b15577dbab475aaeec7d331308e1d9cad5ed

24/2/2557, 21:35:54 w.poophun@gmail.com ชาย 21 - 30 ป ไดเลอก 8d975042ced104d6cd6c32c4ea2498d04a930927afd89367a5ed01717ff78c8c

24/2/2557, 21:36:33 kaka_v01@hotmail.com ชาย 21 - 30 ป ไดเลอก 8d975042ced104d6cd6c32c4ea2498d04a930927afd89367a5ed01717ff78c8c

24/2/2557, 21:37:28 mmload@hotmail.com ชาย 21 - 30 ป ไดเลอก 4841306bc1cd4d625b1e2f34a038fc9c2fc5f85bd53ab4c6ef69b62094a90a8e

24/2/2557, 21:37:42 pornphan.kp@gmail.com หญง 21 - 30 ป ไดเลอก 4841306bc1cd4d625b1e2f34a038fc9c2fc5f85bd53ab4c6ef69b62094a90a8e

24/2/2557, 21:50:25 N_mayka@hotmail.com หญง 11 - 20 ป ไดเลอก 5014bb72ef8ecd3a41113c596a2bc4aa8875b34f04cbb87fcc4e5c66d03596bc

24/2/2557, 21:52:30 pzii-oh@hotmail.com ชาย 21 - 30 ป ไดเลอก 634ca9597fd6299792f13cb1346e1bd4c1c38aee9378d27139e549291ecbb189

24/2/2557, 21:58:04 Thanatchaporn.t@gmail.com หญง 21 - 30 ป ไดเลอก 0847750a46670ce201b981d2c7eb8e302ed79e4d58c3d679f28cd411dea30bae

24/2/2557, 22:06:02 warattida@applicadthai.com หญง 31 ปขนไป ไดเลอก 57b01d0dca935b217e44cfdae32f999ccb0bbe2a127132885e6c8ddc584a4988

24/2/2557, 22:12:47 oaty-gd@hotmail.com ชาย 31 ปขนไป ไดเลอก dd6436575c1e460025417a12b49fc8a7d6e5ac4660d578f06c6699be61158cdb

24/2/2557, 23:38:30 oh_non_krub@hotmail.com ชาย 21 - 30 ป ไดเลอก 0847750a46670ce201b981d2c7eb8e302ed79e4d58c3d679f28cd411dea30bae

35

25/2/2557, 0:12:44 mua@gmail.com ชาย 21 - 30 ป ไดเลอก 8a89c95fbec583d8ccab219a3086f846a1507c57e1dd3fdbaf014c2be3d70bf6

25/2/2557, 0:39:40 suttipan@t-wifi.com ชาย 21 - 30 ป ไดเลอก f01c94e5d43e2512d205e39760e0eebfb505431a002761a47f16b78e81c11fde

25/2/2557, 6:32:30 darkshadow026@gmail.com ชาย 21 - 30 ป ไดเลอก fb2ed61b53645133dfc1238852d3402af9a6eb1b6aba4b9d3e1e1d5545292dc5

25/2/2557, 7:52:47 sandinyze@hotmail.com ชาย 21 - 30 ป ไดเลอก b6cf39efe0a491758ba75a8082a07cf62b5430b26591f739ef9d374fd3930dff

25/2/2557, 9:52:00 Dorae_aom@hotmail.com หญง 21 - 30 ป ไดเลอก 57b01d0dca935b217e44cfdae32f999ccb0bbe2a127132885e6c8ddc584a4988

25/2/2557, 12:49:14 criminal.pan@gmail.com ชาย 21 - 30 ป ไดเลอก dd6436575c1e460025417a12b49fc8a7d6e5ac4660d578f06c6699be61158cdb

25/2/2557, 20:49:27 ballpiyanat@gmail.com ชาย 21 - 30 ป ไดเลอก 0847750a46670ce201b981d2c7eb8e302ed79e4d58c3d679f28cd411dea30bae

25/2/2557, 21:08:52 Nu_mayka@hotmail.com หญง 11 - 20 ป ไดเลอก 1893f26ec25fb3444a5895644d805b1984f7e51a3ba6bd2dbd7b47a0c3553dc0

26/2/2557, 22:20:25 chayanon89@gmail.com ชาย 11 - 20 ป ไดเลอก 0a8a59e3f7b64d9e4fc182b5cfb5ee0e86a7470dd3a67bb707d5a05c96fdb5f5

จากแบบทดสอบไดผทำโครงงานไดกำหนดคาแฮช sha256 ดงตอไปน 0847750a46670ce201b981d2c7eb8e302ed79e4d58c3d679f28cd411dea30bae คอรหสผานทถกตองโดยมาจากคำวา “formac” นำมาผานฟงกชนแฮช sha256 จากผลการสำรวจจากกลมบคคลพบวามการเดาถก 3 คน จาก 20 คน ซงคดเปนรอยละ 15 เมอวดวามการเดารหสผานถกไดครงแรกทมการสมเลอกของบคคล ซงเปนผลทยอมรบไดในจำนวนคาแฮช 20 คา โดยยงมรายการของคาแฮชมากขนจะสงผลใหรอยละของการเดาวาคาแฮชใดคอคาทถกในครงแรกมคาลดลง

36

4.3.2 ทดสอบสถตการเดาวารหสผานใดคอรหสผานทถกตอง โดยการสรางรายการของคำขนมาจากวธ chaffing-by-tail-tweaking ขนมา 20 คำ และสมกลมคนเพอมาทำแบบทดสอบโดยการเลอกคำ 1 คำ จาก 20 คำ ดงรปท 4.11 จากนนจะทำการเกบขอมลดงกลาวและนำมาสรปผลเปนรอยะของความนาจะเปนทกลมคนมโอกาสทจะเดารหสผานจากกลมคำไดถกตองตงแตครงแรก โดยกลมคนทจะทำแบบทดสอบจะเปนกลมบคคลทมความรและไมมความรในระบบคอมพวเตอร เพอแสดงใหเหนวาเปนการเดาสมจรงๆ

รปท 4.14 แบบทดสอบเกบสถตการเดาวารหสผานใดคอรหสผานทถกตอง ดวยการสรางจากวธ Chaffing-by-tail-tweaking

37

4.3.3 ทดสอบสถตการเดาวารหสผานใดคอรหสผานทถกตอง โดยการสรางรายการของคำขนมาจากวธ chaffing-by-tweaking-digits ขนมา 20 คำ และสมกลมคนเพอมาทำแบบทดสอบโดยการเลอกคำ 1 คำ จาก 20 คำ ดงรปท 4.12 จากนนจะทำการเกบขอมลดงกลาวและนำมาสรปผลเปนรอยะของความนาจะเปนทกลมคนมโอกาสทจะเดารหสผานจากกลมคำไดถกตองตงแตครงแรก โดยกลมคนทจะทำแบบทดสอบจะเปนกลมบคคลทมความรและไมมความรในระบบคอมพวเตอร เพอแสดงใหเหนวาเปนการเดาสมจรงๆ

รปท 4.15 แบบทดสอบเกบสถตการเดาวารหสผานใดคอรหสผานทถกตอง ดวยการสรางจากวธ Chaffing-by-tweaking-digits

38

4.3.4 ทดสอบสถตการเดาวารหสผานใดคอรหสผานทถกตอง โดยการสรางรายการของคำขนมาจากวธ chaffing-with-a-password-model ขนมา 20 คำ และสมกลมคนเพอมาทำแบบทดสอบโดยการเลอกคำ 1 คำ จาก 20 คำ ดงรปท 4.12 จากนนจะทำการเกบขอมลดงกลาวและนำมาสรปผลเปนรอยะของความนาจะเปนทกลมคนมโอกาสทจะเดารหสผานจากกลมคำไดถกตองตงแตครงแรก โดยกลมคนทจะทำแบบทดสอบจะเปนกลมบคคลทมความรและไมมความรในระบบคอมพวเตอร เพอแสดงใหเหนวาเปนการเดาสมจรงๆ

รปท 4.16 แบบทดสอบเกบสถตการเดาวารหสผานใดคอรหสผานทถกตอง ดวยการสรางจากวธ Chaffing-with-a-password-model

39

ผลการสำรวจ

26/2/2557, 10:26:50 krai_wic@yahoo.com เลอกคำตอบตงน 1) เลอกรหสผานจาก Chaffing-by-tail-tweaking คอ BG+7r05 2) เลอกรหสผานจาก Chaffing-by-tweaking-digits คอ 89*flavors 3) เลอกรหสผานจาก Chaffing-with-a-password-model คอ #NDYRODD_!! 4) เลอกคำตอบ พยายามหาทางใหได

26/2/2557, 22:22:00 chayanon89@gmail.com เลอกคำตอบดงน 1) เลอกรหสผานจาก Chaffing-by-tail-tweaking คอ BG+7i65 2) เลอกรหสผานจาก Chaffing-by-tweaking-digits คอ 58*flavors 3) เลอกรหสผานจาก Chaffing-with-a-password-model คอ mice3blind 4) เลอกคำตอบ ขามไปทำตวอนกอน

27/2/2557, 1:55:03 SamsriTirada@gmail.com เลอกคำตอบดงน 1) เลอกรหสผานจาก Chaffing-by-tail-tweaking คอ BG+7b44 2) เลอกรหสผานจาก Chaffing-by-tweaking-digits คอ 85*flavors 3) เลอกรหสผานจาก Chaffing-with-a-password-model คอ aiwkme523 4) เลอกคำตอบ ขามไปทำตวอนกอน

27/2/2557, 9:26:15 nanadear@hotmail.com เลอกคำตอบดงน 1) เลอกรหสผานจาก Chaffing-by-tail-tweaking คอ BG+7c01 2) เลอกรหสผานจาก Chaffing-by-tweaking-digits คอ 89*flavors 3) เลอกรหสผานจาก Chaffing-with-a-password-model คอ a71ger 4) เลอกคำตอบ พยายามหาทางใหได

27/2/2557, 11:20:33 yingnui.taroo@gmail.com เลอกคำตอบดงน 1) เลอกรหสผานจาก Chaffing-by-tail-tweaking คอ BG+7r05 2) เลอกรหสผานจาก Chaffing-by-tweaking-digits คอ 12*flavors 3) เลอกรหสผานจาก Chaffing-with-a-password-model คอ aiwkme523 4) เลอกคำตอบ พยายามหาทางใหได

28/2/2557, 17:06:17 zaqimuro1@gmail.com เลอกคำตอบดงน 1) เลอกรหสผานจาก Chaffing-by-tail-tweaking คอ BG+7x08 2) เลอกรหสผานจาก Chaffing-by-tweaking-digits คอ 57*flavors 3) เลอกรหสผานจาก Chaffing-with-a-password-model คอ pizzhemix01

40

4) เลอกคำตอบ พยายามหาทางใหได

28/2/2557, 17:26:00 newpee_pee@hotmail.com เลอกคำตอบดงน 1) เลอกรหสผานจาก Chaffing-by-tail-tweaking คอ BG+7t92 2) เลอกรหสผานจาก Chaffing-by-tweaking-digits คอ 12*flavors 3) เลอกรหสผานจาก Chaffing-with-a-password-model คอ aj1aob12 4) เลอกคำตอบ ลมเลก

28/2/2557, 17:26:56 suttipan@t-wifi.com เลอกคำตอบดงน 1) เลอกรหสผานจาก Chaffing-by-tail-tweaking คอ BG+7b44 2) เลอกรหสผานจาก Chaffing-by-tweaking-digits คอ 34*flavors Sb123 4) เลอกคำตอบ ลมเลก

28/2/2557, 23:20:03 n_mayka@hotmail.com เลอกคำตอบดงน 1) เลอกรหสผานจาก Chaffing-by-tail-tweaking คอ BG+7m55 2) เลอกรหสผานจาก Chaffing-by-tweaking-digits คอ 57*flavors 3) เลอกรหสผานจาก Chaffing-with-a-password-model คอ 1reapc 4) เลอกคำตอบ พยายามหาทางใหได

1/3/2557, 0:23:03 wt_barcode@hotmail.com เลอกคำตอบดงน 1) เลอกรหสผานจาก Chaffing-by-tail-tweaking คอ BG+7f88 2) เลอกรหสผานจาก Chaffing-by-tweaking-digits คอ 02*flavors 3) เลอกรหสผานจาก Chaffing-with-a-password-model คอ 6feefec70f1e2c06dbe5439251ddacf17ea72a50fddcc8236e66ce02ab446445 (Hash value unbreakable) 4) เลอกคำตอบ ลมเลก

จาการทดสอบไดกำหนดรหสผานทถกตองไวคอ BG+7k29, 37*flavors, aj1abo12 ตามลำดบ ดงนน

- วธ chaffing-by-tail-tweaking ไมมผเดาถกเลย คดเปนรอยละ 0 ในการเดารหสผานใหถกในครงแรก

- วธ chaffing-by-tweaking-digits ไมมผเดาถกเลย คดเปนรอยละ 0 ในการเดารหสผานใหถกในครงแรก

41

- วธ chaffing-with-a-password-model มผเดาถก 1 คน คดเปนรอยละ 10 ในการเดารหสผานใหถกในครงแรก

ซงเปนรอยละทนาพอใจสำหรบรหสผาน 20 คำในแตละชด

42

บทท 5

สรปผลการดำเนนงาน

การศกษาวธการสราง honeywords ดวยวธตางๆ สรปไดวา รอยละของการเดาสมรหสผานทถกตองในครงแรกนนมคานอยมาก ดงนนวธการ honeywords จงเปนวธทชวยตรวจสอบการทผประสงครายขโมยขอมลรหสผานไปและนำรหสผานนนมาเขาสระบบได และวธทดทสดของการสรางแถวขอมลของรหสผานคอ hybrid generation เนองดวยเปนการนำประโยชนของทง chaffing-with-a-password-model กบ chaffing-by-tweaking-digits ทำใหมความแตกตางของรหสผานมากยงขน แตทงนกตองพงนโยบายการตงรหสผานดวย เนองจากวธนตองมตวเลขประกอบอยในรหสผาน โดยตามวธทไดทำการศกษาสามารถนำไปพฒนาไดอยางเชน การทผใชงานใสตวเลขมาตรงกลางคำของรหสผาน หรอผใชงานใสตวเลขหลายตวตดกนในรหสผาน ระบบจะสามารถตดสนไดวาจะใชคำทมตวเลขตอกนยาวทสดไมเกน 3 ตว และเปนชดตวเลขทมคามากทสดมาใชวธ chaffing-by-tweaking-digits สวนคำกอนหนาหรอหลงกใช chaffing-with-a-password-model ตามปกต ซงวธนจะยงสรางความแตกตางและสบสนใหกบรหสผานไดมากยงขน (ดตวอยางของโปรแกรมไดท ภาคผนวก ค) สำหรบตวอยางโปรแกรมทสรางขนนนพบวาเวลาในการประมวลผลทำงานชาลงกวาปกตมากถง 8 เทา แตสวนทชาลงเปนสวนทใชในการสมครสมาชกหรอการเขาสระบบซงผใชงานไมไดใชบอยนก เพราะเมอผใชงานเขาสระบบหรอสมครสมาชกผใชงานกจะเขาไปในระบบสวนอนๆตอไป การศกษานมจดทนาสนใจสามารถนำไปพฒนาตอได เชน วธการททำใหไมตองเกบรหสผานทถกตองจรงๆลงในระบบเลย โดยการใช chaffing-by-tweaking-digits สมคาตวเลขเปนตวเลขอนแทน กอนทำการแฮชและเกบลงในฐานขอมล แตจะมปญหาตรงทประสทธภาพจะชาลงเปนอยางมากในกระบวนการเขาสระบบและสมครสมาชก เนองจากตองทำการหาคาตวเลขทอยในรหสผานจรงใหตรง ซงตองอาศยการ brute force เทานน เพราะการทำแฮชเปน one way function ไมสามารถทำยอนกลบได

43

เอกสารอางอง

[1] Ari Juels and Ronald L. Rivest, Honeywords: Making Password-Cracking Detectable, [Online]. Available : http://people.csail.mit.edu/rivest/honeywords/paper.pdf

[2] Microsoft TechNet Library, Password must meet complexity requirements, [Online]. Available : http://technet.microsoft.com/en-us/library/hh994562(v=ws.10).aspx

[3] H. Bojinov and E. Bursztein, Kamouflage: loss-resistant password management In ESORICS, pages 286-302, 2010, [Online]. Available : http://crypto.stanford.edu/~dabo/pubs/papers/passwordmgr.pdf

[4] Y. Zhang,F. Monrose and M. K. Reiter, The security of modern password expiration: and algorithmic framework and empirical analysis. In ACM CCS, pages 176-186, 2010, [Online]. Available : http://cs.unc.edu/~fabian/papers/PasswordExpire.pdf

[5] โรงเรยนสวนกหลาบวทยาลย รงสต, เอกสารประกอบการเรยน เรอง ความนาจะเปน, [Online]. Available : http://www.skr.ac.th/link/web_education/web_teacher/matt/chinawat/najapen/najapen.pdf

[6] Weisstein, Eric W., Lexicographic Order, [Online]. Available : http://mathworld.wolfram.com/LexicographicOrder.html

[7] CIBB basic forum with Codeigniter and Twitter Bootstrap, [Online]. Available : http://www.phpcmsframework.com/2014/05/cibb-basic-forum-with-codeigniter-and.html

[8] CodeIgniter Rest Server, [Online]. Available : https://github.com/chriskacerguis/codeigniter-restserver

44

ภาคผนวก ก

ตวอยางฟงกชน Gen

ก- 1

ฟงกชน Gen สำหรบวธ chaffing-with-a-password-model แบบแกไขปญหากรณผประสงครายมรายการของกลมคำเชนเดยวกน

#! /usr/local/bin/python # gen.py # password generation program (intended for generating ``honeywords'') # Ronald L. Rivest and Ari Juels # 3/18/13 # # Usage: python gen.py n f1 f2 ... fk # where n = number of passwords desired [optional; default = 19] # fi = file containing lists of passwords to be used as models, i = 1, 2, ..., k # (if no files given, short internal list used) # passwords separated by whitespace (could be one, or many, per line) # The program outputs n passwords, one per line # # Example: assuming all password files are in subdirectory "passwords" # python gen.py 20 passwords/* # # Should run OK with python 2.7 (including pypy) and python 3.3 # # This version of the program does not implement any password-composition restrictions, # such as a minimum-length on passwords; this could be easily added.

# Software licence is ``MIT License'': """ Copyright (C) 2013 Ronald L. Rivest and Ari Juels.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

ก- 2

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """

############################################################################## #### PARAMETERS CONTROLLING PASSWORD GENERATION (aside from password files)

tn = 0.08 # probability that a generated password is a ``tough nut'' # (password of length 40 of random chars) # otherwise following parameters apply

# probabilities p1, p2, p3 add up to 1 (heuristically chosen) p1 = 0.10 # chance of a "random" char at this position (see code) p2 = 0.40 # chance of a markov-order-1 char at this position (see code) p3 = 0.50 # choice of continuing copying from same word

q = 0.03 # add 3% noise words to list of passwords

# syntax parameters for a password nL = 0 # password must have at least nL letters nD = 0 # password must have at least nD digit nS = 0 # password must have at least nS special (non-letter non-digit)

ก- 3

#### END OF PARAMETERS CONTROLLING PASSWORD GENERATION ##############################################################################

import random import sys import string

# A short list of high-probability passwords that is used to initialize the # password list in case no password files are provided. high_probability_passwords = """ 123456 1234567 12345678 123asdf Admin admin administrator asdf123 backup backupexec changeme clustadm cluster compaq default dell dmz domino exchadm exchange ftp gateway guest lotus money

ก- 4

notes office oracle pass password password! password1 print qwerty replicate seagate secret sql sqlexec temp temp! temp123 test test! test123 tivoli veritas virus web www KKKKKKK """

def read_password_files(filenames): """ Return a list of passwords in all the password file(s), plus a proportional (according to parameter q) number of "noise" passwords. """ pw_list = [ ] if len(filenames)>0: for filename in filenames:

ก- 5

if sys.version_info[0] == 3: lines = open(filename,"r",errors='ignore').readlines() else: lines = open(filename,"r").readlines() for line in lines: pw_list.extend( line.split() ) else: lines = high_probability_passwords.split() for line in lines: pw_list.extend( line.split() ) # add noise passwords pw_list.extend( noise_list(int(q*len(pw_list))) ) return pw_list

def noise_list(n): """ Return a list of n ``noise'' passwords, to get better coverage of lengths and character """ chars = string.ascii_letters + string.digits + string.punctuation nchars = len(chars) L = [ ] for i in range(n): w = [ ] k = random.randrange(1,18) for j in range(k): w.append(chars[random.randrange(nchars)]) w = ''.join(w) L.append(w) return L

def tough_nut(): """ Return a ``tough nut'' password """ chars = string.ascii_letters + string.digits + string.punctuation nchars = len(chars)

ก- 6

w = [ ] k = 40 for j in range(k): w.append(chars[random.randrange(nchars)]) w = ''.join(w) return w

def syntax(p): """ Return True if password p contains at least nL letters, nD digits, and nS specials (others) """ global nL, nD, nS L = 0 D = 0 S = 0 for c in p: if c in string.ascii_letters: L += 1 elif c in string.digits: D += 1 else: S += 1 if L >= nL and D >= nD and S >= nS: return True return False

def make_password(pw_list): """ make a random password like those in given password list """ if random.random() < tn: return tough_nut() # start by choosing a random password from the list # save its length as k; we'll generate a new password of length k k = len(random.choice(pw_list))

ก- 7

# create list of all passwords of length k; we'll only use those in model L = [ pw for pw in pw_list if len(pw) == k ] nL = len(L) # start answer with the first char of that random password # row = index of random password being used row = random.randrange(nL) ans = L[row][:1] # copy first char of L[row] j = 1 # j = len(ans) invariant while j < k: # build up ans char by char p = random.random() # randomly decide what to do next, based on p # here p1 = prob of action 1 # p2 = prob of action 2 # p3 = prob of action 3 # p1 + p2 + p3 = 1.00 if p<p1: action = "action_1" elif p<p1+p2: action = "action_2" else: action = "action_3" if action == "action_1": # add same char that some random word of length k has in this position row = random.randrange(nL) ans = ans + L[row][j] j = j + 1 elif action == "action_2": # take char in this position of random word with same previous char LL = [ i for i in range(nL) if L[i][j-1]==ans[-1] ] row = random.choice(LL) ans = ans + L[row][j] j = j + 1 elif action == "action_3": # stick with same row, and copy another character ans = ans + L[row][j] j = j + 1 if (nL > 0 or nD > 0 or nS > 0) and not syntax(ans):

ก- 8

return make_password(pw_list) return ans def generate_passwords( n, pw_list ): """ print n passwords and return list of them """ ans = [ ] for t in range( n ): pw = make_password(pw_list) ans.append( pw ) return and

def main(): # get number of passwords desired if len(sys.argv) > 1: n = int(sys.argv[1]) else: n = 19 # read password files filenames = sys.argv[2:] # skip "gen.py" and n pw_list = read_password_files(filenames) # generate passwords new_passwords = generate_passwords(n,pw_list) # shuffle their order random.shuffle(new_passwords) # print if desired printing_wanted = True if printing_wanted: for pw in new_passwords: print (pw) # import cProfile # cProfile.run("main()") main()

ก- 9

ภาคผนวก ข ตวอยางฟงกชน Gen (Hybrid)

ข- 1

ฟงกชน Gen สำหรบวธ Hybrid generation แบบประยกตใหรปแบบรหสผานมความหยดหยนตอผใชงาน

#! /usr/local/bin/python

# gen.py

# password generation program (intended for generating ``honeywords'')

# Santi Lertsumran

# 2/27/14

# Feature : Recieve input from user

# Add function check minimum-length >= 8

# Add function input validation minimum nDD. Example: Pkkkt11

# Add function tweaking-digits

# Change to support Hybrid method. Example: a x b ; a number of chaffing-with-a-password-model, b number of chaffing-by-tweaking-digits

#

# Usage: python gen.py password a b f1 f2 ... fk

# where password = input from user.

# a = number of passwords desired (chaffing-with-a-password-model) [optional; default = 10]

# b = number of passwords desired (chaffing-by-tweaking-digits) [optional; default = 10]

# fi = file containing lists of passwords to be used as models, i = 1, 2, ..., k

# (if no files given, short internal list used)

# passwords separated by whitespace (could be one, or many, per line)

# The program outputs a x b passwords, one per line

ข- 2

#

# Example: assuming all password files are in subdirectory "passwords"

# python gen.py password 20 20 passwords/*

###############################################################################################

# gen.py

# password generation program (intended for generating ``honeywords'')

# Ronald L. Rivest and Ari Juels

# 3/18/13

#

# Usage: python gen.py n f1 f2 ... fk

# where n = number of passwords desired [optional; default = 19]

# fi = file containing lists of passwords to be used as models, i = 1, 2, ..., k

# (if no files given, short internal list used)

# passwords separated by whitespace (could be one, or many, per line)

# The program outputs n passwords, one per line

#

# Example: assuming all password files are in subdirectory "passwords"

# python gen.py 20 passwords/*

#

# Should run OK with python 2.7 (including pypy) and python 3.3

#

# This version of the program does not implement any password-composition restrictions,

# such as a minimum-length on passwords; this could be easily added.

ข- 3

# Software licence is ``MIT License'':

"""

Copyright (C) 2013 Ronald L. Rivest and Ari Juels.

Permission is hereby granted, free of charge, to any person obtaining

a copy of this software and associated documentation files (the

"Software"), to deal in the Software without restriction, including

without limitation the rights to use, copy, modify, merge, publish,

distribute, sublicense, and/or sell copies of the Software, and to

permit persons to whom the Software is furnished to do so, subject to

the following conditions:

The above copyright notice and this permission notice shall be

included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,

EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF

MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND

NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE

LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION

OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION

ข- 4

WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

"""

##############################################################################

#### PARAMETERS CONTROLLING PASSWORD GENERATION (aside from password files)

tn = 0.08 # probability that a generated password is a ``tough nut''

# (password of length 40 of random chars)

# otherwise following parameters apply

# probabilities p1, p2, p3 add up to 1 (heuristically chosen)

p1 = 0.10 # chance of a "random" char at this position (see code)

p2 = 0.40 # chance of a markov-order-1 char at this position (see code)

p3 = 0.50 # choice of continuing copying from same word

q = 0.03 # add 3% noise words to list of passwords

# syntax parameters for a password

nL = 0 # password must have at least nL letters

nD = 0 # password must have at least nD digit

nS = 0 # password must have at least nS special (non-letter non-digit)

#### END OF PARAMETERS CONTROLLING PASSWORD GENERATION

ข- 5

##############################################################################

import random

import sys

import string

import re

# A short list of high-probability passwords that is used to initialize the

# password list in case no password files are provided.

high_probability_passwords = """

123456

1234567

12345678

123asdf

Admin

admin

administrator

asdf123

backup

backupexec

changeme

clustadm

cluster

ข- 6

compaq

default

dell

dmz

domino

exchadm

exchange

ftp

gateway

guest

lotus

money

notes

office

oracle

pass

password

password!

password1

print

qwerty

replicate

seagate

secret

ข- 7

sql

sqlexec

temp

temp!

temp123

test

test!

test123

tivoli

veritas

virus

web

www

KKKKKKK

"""

def read_password_files(filenames):

"""

Return a list of passwords in all the password file(s), plus

a proportional (according to parameter q) number of "noise" passwords.

"""

pw_list = [ ]

if len(filenames)>0:

for filename in filenames:

ข- 8

if sys.version_info[0] == 3:

lines = open(filename,"r",errors='ignore').readlines()

else:

lines = open(filename,"r").readlines()

for line in lines:

pw_list.extend( line.split() )

else:

lines = high_probability_passwords.split()

for line in lines:

pw_list.extend( line.split() )

# add noise passwords

pw_list.extend( noise_list(int(q*len(pw_list))) )

return pw_list

def noise_list(n):

"""

Return a list of n ``noise'' passwords, to get better coverage of lengths and character

"""

chars = string.ascii_letters + string.digits + string.punctuation

nchars = len(chars)

L = [ ]

for i in range(n):

w = [ ]

k = random.randrange(1,18)

ข- 9

for j in range(k):

w.append(chars[random.randrange(nchars)])

w = ''.join(w)

L.append(w)

return L

def tough_nut():

"""

Return a ``tough nut'' password

"""

chars = string.ascii_letters + string.digits + string.punctuation

nchars = len(chars)

w = [ ]

k = 40

for j in range(k):

w.append(chars[random.randrange(nchars)])

w = ''.join(w)

return w

def syntax(p):

"""

Return True if password p contains at least nL letters, nD digits, and nS specials (others)

"""

ข- 10

global nL, nD, nS

L = 0

D = 0

S = 0

for c in p:

if c in string.ascii_letters:

L += 1

elif c in string.digits:

D += 1

else:

S += 1

if L >= nL and D >= nD and S >= nS:

return True

return False

def minimum_tail(n):

"""

Return addtional mini tail password

"""

chars = string.ascii_letters + string.digits + string.punctuation

nchars = len(chars)

w = [ ]

k = n

for j in range(k):

ข- 11

w.append(chars[random.randrange(nchars)])

w = ''.join(w)

return w

def random_tail_pw(n,pw_list):

"""

make a random tail password if n != 0

"""

if n == 0:

return ''

elif n < 4:

return minimum_tail(n)

k = n

# create list of all passwords of length k; we'll only use those in model

L = [ pw for pw in pw_list if len(pw) == k ]

nL = len(L)

# start answer with the first char of that random password

# row = index of random password being used

row = random.randrange(nL)

ans = L[row][:1] # copy first char of L[row]

j = 1 # j = len(ans) invariant

while j < k: # build up ans char by char

p = random.random() # randomly decide what to do next, based on p

ข- 12

# here p1 = prob of action 1

# p2 = prob of action 2

# p3 = prob of action 3

# p1 + p2 + p3 = 1.00

if p<p1:

action = "action_1"

elif p<p1+p2:

action = "action_2"

else:

action = "action_3"

if action == "action_1":

# add same char that some random word of length k has in this position

row = random.randrange(nL)

ans = ans + L[row][j]

j = j + 1

elif action == "action_2":

# take char in this position of random word with same previous char

LL = [ i for i in range(nL) if L[i][j-1]==ans[-1] ]

row = random.choice(LL)

ans = ans + L[row][j]

j = j + 1

elif action == "action_3":

# stick with same row, and copy another character

ans = ans + L[row][j]

ข- 13

j = j + 1

return ans

def random_digits(n,b):

"""

Return a random n digits

"""

w = [ ]

if n == 3:

w = random.sample(range(999), b)

elif n == 2:

w = random.sample(range(99), b)

#chars = string.digits

#nchars = len(chars)

#w = [ ]

#k = n

#for j in range(k):

# w.append(chars[random.randrange(nchars)])

#w = ''.join(w)

print w

return w

def make_password(pw_list):

"""

ข- 14

make a random password like those in given password list

"""

if random.random() < tn:

return tough_nut()

# start by choosing a random password from the list

# save its length as k; we'll generate a new password of length k

k = len(random.choice(pw_list))

# create list of all passwords of length k; we'll only use those in model

L = [ pw for pw in pw_list if len(pw) == k ]

nL = len(L)

# start answer with the first char of that random password

# row = index of random password being used

row = random.randrange(nL)

ans = L[row][:1] # copy first char of L[row]

j = 1 # j = len(ans) invariant

while j < k: # build up ans char by char

p = random.random() # randomly decide what to do next, based on p

# here p1 = prob of action 1

# p2 = prob of action 2

# p3 = prob of action 3

# p1 + p2 + p3 = 1.00

if p<p1:

action = "action_1"

elif p<p1+p2:

ข- 15

action = "action_2"

else:

action = "action_3"

if action == "action_1":

# add same char that some random word of length k has in this position

row = random.randrange(nL)

ans = ans + L[row][j]

j = j + 1

elif action == "action_2":

# take char in this position of random word with same previous char

LL = [ i for i in range(nL) if L[i][j-1]==ans[-1] ]

row = random.choice(LL)

ans = ans + L[row][j]

j = j + 1

elif action == "action_3":

# stick with same row, and copy another character

ans = ans + L[row][j]

j = j + 1

if (nL > 0 or nD > 0 or nS > 0) and not syntax(ans):

return make_password(pw_list)

return ans

def generate_passwords( a, b, pw_list, fix_index ):

""" print n passwords and return list of them """

ข- 16

rd = random_digits(fix_index[0],b)

ans = [ ]

for t in range( a ):

pw = make_password(pw_list)

tail_pw = random_tail_pw(fix_index[1],pw_list)

if len(pw) < 40:

for i in rd:

if fix_index[0] == 3:

if i > 9 and i < 100:

rd_s = '0' + str(i)

elif i < 10:

rd_s = '00' + str(i)

else:

rd_s = str(i)

pw2 = pw + rd_s + tail_pw

ans.append( pw2 )

elif fix_index[0] == 2:

if i < 10:

rd_s = '0' + str(i)

else:

rd_s = str(i)

pw2 = pw + rd_s + tail_pw

ans.append( pw2 )

else:

ข- 17

ans.append( pw )

return ans

def find_digits(pw):

result_ori = re.findall('[0-9]+', pw)

if result_ori == []:

return 0

result = result_ori[::-1] #reverse list in array.

result = max(result, key=len) #find string is max length in array.

print result

if len(result) > 3:

diff = len(result) - 3

elif len(result) < 2:

print "Error: Number is less."

sys.exit(1)

else:

diff = 0

digits_index = pw.rfind(result)

digits_index = digits_index + diff

#digits_index = [ ]

#for i in result_ori:

ข- 18

#digits_index.append(pw.rfind(result))

print "Digits found:", result

print "Last index:", digits_index

if ((digits_index-diff)+len(result) < len(pw)): #array pw 0 to (len(pw)-1)

len_last_word = len(pw)-((digits_index-diff)+len(result))

else:

len_last_word = 0

ans = [ ]

#ans.append(max(digits_index))

ans.append(len(result)-diff)

ans.append(len_last_word)

print ans

return ans

#print "Number of digits =", numDigits

def main():

if len(sys.argv[1]) < 8:

print "Error: Password less than 8 char."

sys.exit(1)

# get a number of passwords desired

if len(sys.argv) > 2:

a = int(sys.argv[2])

ข- 19

else:

a = 10

# get b number of passwords desired

if len(sys.argv) > 3:

b = int(sys.argv[3])

else:

b = 10

fix_index = find_digits(sys.argv[1])

if fix_index == 0:

print "Error: Number not found."

sys.exit(1)

# read password files

filenames = sys.argv[4:] # skip "gen.py", "password", a and b

pw_list = read_password_files(filenames)

# generate passwords

new_passwords = generate_passwords(a,b,pw_list,fix_index)

# shuffle their order

#random.shuffle(new_passwords)

# print if desired

printing_wanted = True

if printing_wanted:

for pw in new_passwords:

print (pw)

ข- 20

# import cProfile

# cProfile.run("main()")

main()

ข- 21

ภาคผนวก ค

library สำหรบ Codeigniter ในสวนของระบบ

ค- 1

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/*

* Example.

* $params = array('type' => 'large', 'color' => 'red');

* $this->load->library('honeyword', $params);

*

*/

class Honeyword {

/*

* PARAMETERS CONTROLLING PASSWORD GENERATION (aside from password files)

*/

// probability that a generated password is a ``tough nut''

// (password of length 40 of random chars)

// otherwise following parameters apply

private $tn = 0.08;

// probabilities p1, p2, p3 add up to 1 (heuristically chosen)

private $p1 = 0.10; //# chance of a "random" char at this position (see code)

private $p2 = 0.40; //# chance of a markov-order-1 char at this position (see code)

ค- 2

private $p3 = 0.50; //# choice of continuing copying from same word

private $q = 0.03; //# add 3% noise words to list of passwords

// syntax parameters for a password

private $nL = 0; //# password must have at least nL letters

private $nD = 0; //# password must have at least nD digit

private $nS = 0; //# password must have at least nS special (non-letter non-digit)

/*

* END OF PARAMETERS CONTROLLING PASSWORD GENERATION

*/

public function __construct()

{

$CI =& get_instance();

// Loads a config file named blog_settings.php and assigns it to an index named "honeyword_config"

$CI->config->load('honeyword_config', TRUE);

$this->tough_nut_length = $CI->config->item('tough_nut_length', 'honeyword_config');

//$CI->load->helper('file');

//$CI->config->item('base_url');

ค- 3

}

private function read_password_file($filename = 'default_password.list')

{

/*

* Return a list of passwords in all the password file(s), plus

* a proportional (according to parameter q) number of "noise" passwords.

*/

if ( $pw_list = file(APPPATH . 'libraries/' . $filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) ) {

// add noise passwords

$noise_list = $this->noise_list(round($this->q * count($pw_list)));

$pw_list = array_merge($pw_list, $noise_list);

return $pw_list;

} else {

show_error("Error: Do not have file.");

}

}

private function noise_list($n)

{

/*

* Return a list of n ``noise'' passwords, to get better coverage of lengths and character

*/

ค- 4

$randomString = array();

for ($i = 0; $i < $n; $i++) {

$randomLength = mt_rand(8,18);

$randomString[$i] = $this->random_word($randomLength);

}

shuffle($randomString);

return $randomString;

}

public function find_digit($password)

{

//if (false !== preg_match('#(\\d+)\\D*$#', $password, $gregs, PREG_OFFSET_CAPTURE)) {

// return $gregs;

//}

//if(preg_match_all('/\d+/', $password, $numbers , PREG_OFFSET_CAPTURE)) {

if(preg_match_all('/\d+/', $password, $numbers)) {

$digits = (string)max($numbers[0]);

if (strlen($digits) > 3) {

$digits_2 = substr($digits, -3);

return array($digits_2, strpos($password, $digits) + (strlen($digits) - strlen($digits_2)));

} else {

ค- 5

return array(max($numbers[0]), strpos($password, (string)max($numbers[0])));

}

} else {

return false;

}

}

private function random_digits($number)

{

$randomNum = '';

for ( $i = 0; $i < strlen($number); $i++ )

{

$randomNum .= mt_rand ( 0, 9 );

}

if ($randomNum == $number) {

return $this->random_digits($number);

} else {

return $randomNum;

}

}

private function tough_nut()

{

ค- 6

return mcrypt_create_iv($this->tough_nut_length, MCRYPT_DEV_RANDOM);

}

private function syntax($password)

{

/*

* Return True if password p contains at least nL letters, nD digits, and nS specials (others)

*/

$L = 0;

$D = 0;

$S = 0;

for ($i = 0; $i < strlen($password); $i++) {

if (ctype_alpha($password[$i])) {

$L += 1;

} elseif (ctype_digit($password[$i])) {

$D += 1;

} else {

$S += 1;

}

}

if ($L >= $this->nL && $D >= $this->nD && $S >= $this->nS) {

return true;

ค- 7

}

return false;

}

private function make_password($pw_list)

{

$L = array();

$LL = array();

$ans = '';

if (mt_rand(0, 100)/100 < $this->tn) {

return $this->tough_nut();

}

// start by choosing a random password from the list

// save its length as k; we'll generate a new password of length k

$rand_keys = array_rand($pw_list);

$k = strlen($pw_list[$rand_keys]);

// create list of all passwords of length k; we'll only use those in model

foreach ($pw_list as $pw) {

if (strlen($pw) == $k) {

$L[] = $pw;

}

}

$nL = count($L);

ค- 8

// start answer with the first char of that random password

// row = index of random password being used

$current_row = mt_rand(0, $nL-1);

$ans .= $L[$current_row][0]; // copy first char of L[row]

$j = 1; // j = len(ans) invariant

while ($j < $k) {

$p = mt_rand(0, 100)/100; // randomly decide what to do next, based on p

// here p1 = prob of action 1

// p2 = prob of action 2

// p3 = prob of action 3

// p1 + p2 + p3 = 1.00

if ($p < $this->p1) {

$action = "action_1";

} elseif ($p < ($this->p1 + $this->p2)) {

$action = "action_2";

} else {

$action = "action_3";

}

if ($action == "action_1") {

// add same char that some random word of length k has in this position

$row = mt_rand(0, $nL-1);

$ans .= $L[$row][$j];

$j = $j + 1;

ค- 9

} elseif (($action == "action_2") && (strlen($ans) > 0)) {

// take char in this position of random word with same previous char

for ($i = 0; $i < $nL-1; $i++) {

if ($L[$i][$j-1] == substr($ans, -1)) {

$LL[] = $i;

}

}

if ($LL) {

$row = array_rand($LL);

$ans .= $L[$LL[$row]][$j];

$j = $j + 1;

}

} elseif ($action == "action_3") {

// stick with same row, and copy another character

$ans .= $L[$current_row][$j];

$j = $j + 1;

}

}

if (($nL > 0) && !$this->syntax($ans)) {

return $this->make_password($pw_list);

}

return $ans;

}

ค- 10

private function random_word($n) {

$randomWord = '';

$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._!=';

$charactersLength = strlen($characters);

for ($i = 0; $i < $n; $i++) {

$randomWord .= $characters[mt_rand(0, $charactersLength - 1)];

}

return $randomWord;

}

private function random_tail_pw($digit, $password, $pw_list)

{

if ((strlen($digit[0]) + $digit[1]) == strlen($password)) {

return '';

} elseif ((strlen($password) - ($digit[1] + strlen($digit[0]))) < 3) {

return $this->random_word((strlen($password) - ($digit[1] + strlen($digit[0]))));

} else {

return $this->make_password($pw_list);

}

}

public function gen($password, $a = 9)

ค- 11

{

$word_list = array();

$pw_list = $this->read_password_file();

$find_digit = $this->find_digit($password);

for ($i = 0; $i < $a; $i++) {

$pw = $this->make_password($pw_list);

if (strlen($pw) < $this->tough_nut_length) {

$tail_pw = $this->random_tail_pw($find_digit, $password, $pw_list);

$ds = $this->random_digits($find_digit[0]);

$word_list[$i] = $pw.$ds.$tail_pw;

} else {

$word_list[$i] = $pw;

}

}

return $word_list;

}

ค- 12

public function array_hash($word_lists)

{

if (is_array($word_lists) && (count($word_lists) > 0)) {

for ($i = 0; $i < count($word_lists); $i++) {

$word_lists[$i] = hash('sha256', $word_lists[$i]);

}

}

return $word_lists;

}

public function set($i, $j)

{

$CI = &get_instance();

// Load the rest client spark

$CI->load->spark('restclient/2.1.0');

// Load the library

$CI->load->library('rest');

// Set config options (only 'server' is required to work)

$config = array('server' => 'http://honeychecker.local/index.php/',

//'api_key' => 'Setec_Astronomy'

ค- 13

//'api_name' => 'X-API-KEY'

'http_user' => 'admin',

'http_pass' => '1234',

'http_auth' => 'digest'

//'ssl_verify_peer' => TRUE,

//'ssl_cainfo' => '/certs/cert.pem'

);

// Run some setup

$CI->rest->initialize($config);

// Pull in an array of tweets

$result = $CI->rest->post('honeychecker/user', array('id' => $i, 'position' => $j));

return $result->status;

}

public function check($i, $j)

{

$CI = &get_instance();

// Load the rest client spark

$CI->load->spark('restclient/2.1.0');

// Load the library

$CI->load->library('rest');

ค- 14

// Set config options (only 'server' is required to work)

$config = array('server' => 'http://honeychecker.local/index.php/',

//'api_key' => 'Setec_Astronomy'

//'api_name' => 'X-API-KEY'

'http_user' => 'admin',

'http_pass' => '1234',

'http_auth' => 'digest'

//'ssl_verify_peer' => TRUE,

//'ssl_cainfo' => '/certs/cert.pem'

);

// Run some setup

$CI->rest->initialize($config);

// Pull in an array of tweets

$result = $CI->rest->get('honeychecker/user/id/'.$i.'/position/'.$j.'/format/json');

return $result;

}

}

/* End of file honeyword.php */

ค- 15

ภาคผนวก ง

Controller สำหรบ Codeigniter ในสวนของ honeychecker อนประกอบดวย GET, POST, PUT, DELETE

ง- 1

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

// This can be removed if you use __autoload() in config.php OR use Modular Extensions

require APPPATH.'/libraries/REST_Controller.php';

class Honeychecker extends REST_Controller {

function __construct()

{

// Call the Model constructor

parent::__construct();

$this->load->model('User_model');

}

function user_get()

{

if(!$this->get('id'))

{

$this->response(NULL, 400);

}

$user = $this->User_model->get_info( $this->get('id') );

ง- 2

if($user)

{

if ($user->position === $this->get('position')) {

$this->response(true, 200);

} else {

$this->response(false, 200);

}

//$this->response($this->get('id'), 200); // 200 being the HTTP response code

}

else

{

$this->response(NULL, 404);

}

}

function user_post()

{

$result = $this->User_model->insert_info(array(

'user_id' => $this->post('id'),

'position' => $this->post('position')

));

ง- 3

if($result === FALSE)

{

$this->response(array('status' => 'failed'));

}

else

{

$this->response(array('status' => 'success'));

}

}

function user_put()

{

$result = $this->User_model->update_info($this->put('id'), $this->put('position'));

if($result === FALSE)

{

$this->response(array('status' => 'failed'));

}

else

{

$this->response(array('status' => 'success'));

}

ง- 4

}

function user_delete()

{

$result = $this->User_model->delete_info($this->get('id'));

if($result === FALSE)

{

$this->response(array('status' => 'failed'));

}

else

{

$this->response(array('status' => 'success'));

}

}

}

ง- 5

ภาคผนวก จ

Model Codeigniter ในสวนของการสมครสมาชกและการเขาสระบบ

จ- 1

<?php

class User_model extends CI_Model {

public $error = array();

public $error_count = 0;

public function __construct()

{

parent::__construct();

}

public function check_role()

{

$user_id = $this->session->userdata('cibb_user_id');

// get roles

if ($user_id) {

$row = $this->db->get_where(TBL_USERS, array('id' => $user_id))->row();

$roles = $this->db->get_where(TBL_ROLES, array('id' => $row->role_id))->row_array();

foreach ($roles as $key => $value) {

$this->session->set_userdata($key, $value);

}

}

}

จ- 2

public function check_login()

{

$row = $this->input->post('row');

//$key = $this->config->item('encryption_key');

// ++ set variable

$result_check_position = false;

// ++

$data = array('username' => $row['username']);

$query = $this->db->get_where(TBL_USERS, $data);

$plain_password = '';

if ( ($query->num_rows() == 1) ) {

$user = $query->row();

//$plain_password = $this->encrypt->decode($user->password, $key);

// ++ json decode array hash password

$word_lists = json_decode($user->password);

$this->load->library('honeyword');

$position_of_array = array_search(hash('sha256', $row['password']), $word_lists);

$result_check_position = $this->honeyword->check($user->id, $position_of_array);

จ- 3

// ++

}

// if user found

//if ( ($query->num_rows() == 1) && ($plain_password == $row['password'])) {

if (($query->num_rows() == 1) && ($result_check_position)) {

// ++

$row = $query->row();

$this->session->set_userdata('cibb_logged_in', 1);

$this->session->set_userdata('cibb_user_id' , $row->id);

$this->session->set_userdata('cibb_username' , $row->username);

$this->session->set_userdata('cibb_user_roleid' , $row->role_id);

// get roles

$roles = $this->db->get_where(TBL_ROLES, array('id' => $row->role_id))->row_array();

foreach ($roles as $key => $value) {

$this->session->set_userdata($key, $value);

}

} else {

$this->error['login'] = 'User not found';

$this->error_count = 1;

}

}

จ- 4

public function register()

{

$row = $this->input->post('row');

// check username

$is_exist_username = $this->db->get_where(TBL_USERS,

array('username' => $row['username']))->num_rows();

if ($is_exist_username > 0) {

$this->error['username'] = 'Username already in use';

}

if (strlen($row['username']) < 5) {

$this->error['username'] = 'Username minimum 5 character';

}

// ++ load honeyword

$this->load->library('honeyword');

$digit_info = $this->honeyword->find_digit($row['password']);

// ++

// check password

if ($row['password'] != $this->input->post('password2')) {

$this->error['password'] = 'Password not match';

} else if (strlen($row['password']) < 5) {

จ- 5

$this->error['password'] = 'Password minimum 5 character';

} else if ($digit_info == false) { // ++ condition for check digit in password

$this->error['password'] = 'Password minimum 1 digit';

}

// ++ gen word lists

$word_lists = $this->honeyword->gen($row['password']);

array_push($word_lists, $row['password']);

shuffle($word_lists);

$position_of_array = array_search($row['password'], $word_lists); // search position of array.

while ($position_of_array == 0) { // do not position 0

shuffle($word_lists);

$position_of_array = array_search($row['password'], $word_lists); // search position of array.

}

// ++

if (count($this->error) == 0) {

//$key = $this->config->item('encryption_key');

//$row['password'] = $this->encrypt->encode($row['password'], $key);

// ++ set password with json.

$row['password'] = json_encode($this->honeyword->array_hash($word_lists));

$this->db->trans_start();

// ++

จ- 6

$this->db->insert(TBL_USERS, $row);

// ++ set position.

$insert_id = $this->db->insert_id();

$this->db->trans_complete();

if ("success" !== $this->honeyword->set($insert_id,$position_of_array)) {

$this->db->delete(TBL_USERS, array('id' => $insert_id));

$this->error['password'] = 'Error in system.';

$this->error_count = count($this->error);

}

// ++

} else {

$this->error_count = count($this->error);

}

}

}

จ- 7

top related