- เกลือคือสตริงสุ่มที่ถูกเพิ่มลงในรหัสผ่านก่อนแฮชเพื่อให้ได้ค่าแฮชที่ไม่ซ้ำกันต่อผู้ใช้แต่ละคน
- ลินุกซ์ มันจัดเก็บแฮช ซอลต์ และอัลกอริทึมใน /etc/shadow เพื่อเพิ่มความปลอดภัยต่อการโจมตีแบบพจนานุกรมและตารางเรนโบว์
- แนวทางปฏิบัติที่ดีต้องใช้เกลือที่ยาว สุ่ม และไม่ซ้ำกัน รวมถึงอัลกอริทึมแฮชที่แข็งแกร่งและ ฐานข้อมูล ได้รับการปกป้องอย่างดี
- การใส่รหัสผ่านแบบซอลต์ควรจะรวมไว้ในนโยบายความปลอดภัยที่กว้างขึ้น ซึ่งรวมถึงรหัสผ่านที่แข็งแกร่ง MFA และตัวจัดการรหัสผ่าน

หากคุณทำงานกับระบบ GNU/Linux หรือกังวลเกี่ยวกับความปลอดภัยของบัญชีของคุณ คุณอาจเคยได้ยินเกี่ยวกับ " เกลือ" (salt) ในการเข้ารหัสรหัสผ่านมาบ้างแล้วนี่เป็นหนึ่งในแนวคิดที่ถูกกล่าวถึงบ่อย แต่หลายคนมักเข้าใจเพียงบางส่วนเท่านั้น ฟังดูเหมือนเป็นเรื่องทางเทคนิค แต่ในความเป็นจริงแล้ว มันคือสิ่งที่ทำให้ระบบแตกต่างจากระบบที่ถูกเจาะได้ง่ายและระบบที่ทนทานต่อการโจมตีมากขึ้น
กล่าวโดยสรุป เกลือ (salt) เป็นส่วนประกอบสำคัญที่ทำให้แฮชรหัสผ่านคาดเดาได้ยากโดยจะเพิ่มข้อมูลสุ่มเข้าไปก่อนที่จะใช้อัลกอริทึมการแฮช เพื่อให้แม้ว่าผู้ใช้สองคนจะมีรหัสผ่านเดียวกัน ผลลัพธ์ที่เก็บไว้ในฐานข้อมูลก็จะแตกต่างกัน จากนั้น การใช้งานเฉพาะใน Linux ความสัมพันธ์กับ /etc/shadow เครื่องมือต่างๆ เช่น mkpasswd และแนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัยในปัจจุบัน ล้วนเป็นอีกเรื่องหนึ่งที่เราจะมาสำรวจกันในรายละเอียด
เกลือในแฮชรหัสผ่านคืออะไรกันแน่?

ในวิทยาการเข้ารหัสลับ คำว่า " salt"หมายถึงสตริงตัวอักษรแบบสุ่มที่ถูกเพิ่มเข้าไปในรหัสผ่านของผู้ใช้ก่อนที่จะใช้ฟังก์ชันแฮช โดยมีเป้าหมายเพื่อให้ค่าแฮชที่ได้นั้นไม่ซ้ำกัน แม้ว่ารหัสผ่านต้นฉบับจะเหมือนกันสำหรับผู้ใช้หลายคนก็ตาม
เมื่อผู้ใช้สร้างหรือเปลี่ยนรหัสผ่าน ระบบจะสร้างค่า salt แบบสุ่ม นำมา รวมกับรหัสผ่าน (ก่อน หลัง หรือในรูปแบบเฉพาะ ขึ้นอยู่กับระบบนั้นๆ) และใช้ขั้นตอนวิธีแฮช เช่นSHA-256หรือSHA-512 กับค่าที่ได้ ฐานข้อมูลจะไม่เก็บรหัสผ่าน แต่จะเก็บค่าแฮชของ (รหัสผ่าน + salt)และในระบบส่วนใหญ่ ค่า salt จะถูกเก็บไว้พร้อมกับค่าแฮชด้วย
เทคนิคนี้ทำให้เทคนิคการโจมตีหลายอย่างที่อาศัยค่าแฮชที่คำนวณไว้ล่วงหน้าเช่น ตารางเรนโบว์ ไร้ประโยชน์ และทำให้การโจมตีแบบใช้พจนานุกรมและการโจมตีแบบเดาสุ่มขนาดใหญ่ทำได้ยากขึ้นอย่างมาก ผู้โจมตีไม่สามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่าผู้ใช้หลายคนใช้รหัสผ่านเดียวกันได้อีกต่อไป เพราะผู้ใช้แต่ละคนจะมีค่าแฮชที่แตกต่างกัน
สิ่งสำคัญคือต้องเข้าใจว่า "เกลือ" (salt) ไม่ใช่ความลับในตัวเอง: มันไม่ใช่ทั้งรหัสผ่านหรือกุญแจส่วนตัวหน้าที่ของมันคือการเพิ่มความสุ่มและเอกลักษณ์ให้กับกระบวนการแฮช ความปลอดภัยยังคงขึ้นอยู่กับการใช้รหัสผ่านที่แข็งแกร่งและอัลกอริธึมการแฮชที่เหมาะสมโดยเฉพาะอย่างยิ่งอัลกอริธึมที่ออกแบบมาสำหรับรหัสผ่านโดยเฉพาะ (เช่น bcrypt, scrypt, Argon2) แม้ว่าระบบ Linux คลาสสิกหลายระบบจะใช้ SHA-256 หรือ SHA-512 เวอร์ชันต่างๆ ก็ตาม
วิธีการทำงานของการใส่รหัสผ่านแบบทีละขั้นตอน

กระบวนการเพิ่มเกลือสามารถสรุปได้เป็นขั้นตอนง่ายๆ หลายขั้นตอน แต่มีผลกระทบอย่างมากต่อความปลอดภัย :
ประการแรก เมื่อผู้ใช้ลงทะเบียนหรือเปลี่ยนรหัสผ่าน ระบบจะสร้างค่า "salt" แบบสุ่มที่ไม่ซ้ำกันสำหรับข้อมูลประจำตัวนั้น ค่า "salt" นี้มักมีความยาวเพียงพอ (เช่น 16 ไบต์ขึ้นไป) และได้มาจากตัวสร้างเลขสุ่มที่มีความปลอดภัยทางด้านการเข้ารหัส
ขั้นตอนต่อไป รหัสผ่านที่ผู้ใช้เลือกจะถูกรวมเข้ากับค่าเกลือ (salt) เพื่อสร้างสตริงตัวกลางการรวมกันนี้อาจเป็นเพียงการนำค่าเกลือและรหัสผ่านมาต่อกัน หรืออาจมีรูปแบบที่ซับซ้อนกว่าที่กำหนดโดยวิธีการแฮช สิ่งสำคัญคือผู้ใช้แต่ละคนจะได้การรวมกันที่แตกต่างกัน
ถัดไป จะใช้อัลกอริธึมการแฮชแบบทางเดียว กับชุดค่าผสมนั้น ผลลัพธ์ที่ได้คือสตริงที่ดูเหมือนสุ่ม ซึ่งก็คือค่าแฮช ที่มีความยาวคงที่ และจะถูกจัดเก็บไว้ในฐานข้อมูลพร้อมกับค่าเกลือ (salt) ในระบบสมัยใหม่ อัลกอริธึมที่สร้างผลลัพธ์ที่ยาวและซับซ้อนเป็น ที่ต้องการ ซึ่งจะเพิ่มพื้นที่การค้นหาและทำให้การโจมตีแบบเดาสุ่ม (brute-force attack) มีค่าใช้จ่ายสูงขึ้น
สุดท้าย เมื่อผู้ใช้ล็อกอิน ระบบจะดึงรหัสผ่านที่ป้อนเข้ามาอีกครั้ง ดึงค่า salt ที่เกี่ยวข้องจากฐานข้อมูล ทำซ้ำกระบวนการรวมและแฮชแบบเดียวกันทุกประการ และเปรียบเทียบผลลัพธ์กับค่าแฮชที่จัดเก็บไว้ หากตรงกัน ระบบจะทราบว่ารหัสผ่านถูกต้องโดยไม่จำเป็นต้องเห็นข้อความต้นฉบับ
กลไกนี้หมายความว่า แม้ว่าฐานข้อมูลจะรั่วไหล ผู้โจมตีก็จะเห็นเพียงแฮชแต่ละรายการพร้อมเกลือ (salt) เฉพาะของตนเองเท่านั้น แทนที่จะเป็นชุดแฮชที่เปรียบเทียบกันได้ การหยุดยั้งการโจมตีไม่ใช่เรื่องมหัศจรรย์ แต่ก็ต้องใช้ทรัพยากรการคำนวณสูงขึ้นอย่างมาก
ข้อดีของการใช้เกลือในการแฮชรหัสผ่าน

เหตุผลหลักในการใช้การเพิ่มเกลือ (salting) คือการเพิ่มความปลอดภัยให้กับรหัสผ่านที่จัดเก็บไว้เพื่อป้องกันการโจมตีหลากหลายรูปแบบ แต่ก็ควรที่จะอธิบายรายละเอียดถึงประโยชน์เฉพาะเจาะจงด้วย
ประการแรก การใช้เกลือ (salt) ช่วยป้องกันการโจมตีโดยใช้พจนานุกรม (dictionary attack ) หากไม่มีเกลือ ผู้โจมตีสามารถเตรียมรายการรหัสผ่านทั่วไปและค่าแฮชจำนวนมาก แล้วนำไปเปรียบเทียบกับฐานข้อมูลที่ถูกขโมยมาได้ แต่ด้วยเกลือที่ไม่ซ้ำกันสำหรับผู้ใช้แต่ละคน ค่าแฮชที่คำนวณไว้ล่วงหน้าเหล่านั้นจะไร้ประโยชน์ เพราะแต่ละชุดรหัสผ่าน + เกลือ จะสร้างค่าที่แตกต่างกัน
ประการที่สอง การใช้เกลือ (salt) ทำให้ประสิทธิภาพของตารางเรนโบว์ (rainbow table) ลดลง ซึ่งตารางเรนโบว์เป็นเพียงฐานข้อมูลแฮชของรหัสผ่านยอดนิยมที่คำนวณไว้ล่วงหน้าแล้ว ออกแบบมาเพื่อเร่งความเร็วในการกู้คืน เนื่องจากผลลัพธ์ขึ้นอยู่กับเกลือที่ใช้ ตารางเหล่านี้ซึ่งออกแบบมาสำหรับแฮชที่ไม่มีเกลือ จึงไร้ประโยชน์หรืออย่างน้อยก็ไม่มีประสิทธิภาพอย่างมาก
ข้อดีที่เห็นได้ชัดอีกประการหนึ่งคือความเป็นส่วนตัวที่ดียิ่งขึ้นในกรณีที่ข้อมูลรั่วไหลแม้ว่าผู้บุกรุกจะเข้าถึงตารางผู้ใช้พร้อมแฮชและเกลือ (salt) ได้ แต่พวกเขาก็จะไม่สามารถระบุได้อย่างรวดเร็วว่าใครใช้รหัสผ่านเดียวกัน หรือทำการโจมตีแบบกลุ่มได้อย่างง่ายดาย แต่ละบัญชีต้องการการดูแลเป็นพิเศษ ซึ่งมักทำได้ยากในระดับใหญ่
นอกจากนี้ การใช้เกลือ (salt) ยังเพิ่มความซับซ้อนให้กับการโจมตีแบบเดาแบบสุ่ม (brute-force attack ) แทนที่จะสามารถทดสอบรหัสผ่านที่สงสัยกับแฮชทั้งหมดพร้อมกันได้ ผู้โจมตีจะต้องพิจารณาเกลือของผู้ใช้แต่ละราย ซึ่งทำให้ความพยายามโดยรวมเพิ่มขึ้นเป็นทวีคูณ หากรวมกับการใช้อัลกอริทึมการแฮชที่ช้าและปรับแต่งได้ (เช่น bcrypt หรือ Argon2) ต้นทุนในการโจมตีก็จะเพิ่มขึ้นไปอีก
สุดท้ายนี้ การใช้เกลือ (salt) เป็นเทคนิคที่ปรับตัวได้ดีกับการพัฒนาทางเทคโนโลยี แม้ว่าอุปกรณ์คอมพิวเตอร์จะดีขึ้นและมีการโจมตีรูปแบบใหม่เกิดขึ้นการผสมผสานระหว่างแฮชที่แข็งแกร่งและเกลือที่ไม่ซ้ำกันจะช่วยรักษาระดับความยากที่สูงและปรับขนาดได้: สามารถเพิ่มความยาวของเกลือ เสริมความแข็งแกร่งของอัลกอริทึม เพิ่มต้นทุนการคำนวณ และอื่นๆ ได้
Linux นำการใส่รหัสผ่านแบบ Salting มาใช้อย่างไร (/etc/shadow)
ในระบบลินุกซ์และระบบ *NIX อื่นๆ รหัสผ่านของผู้ใช้ไม่ได้ถูกเก็บไว้ในไฟล์ /etc/passwd แต่จะถูกเก็บไว้ใน ไฟล์ /etc/shadowไฟล์นี้ซึ่งเข้าถึงได้เฉพาะผู้ใช้ระดับสูงสุดเท่านั้น จะเก็บค่าแฮชของรหัสผ่านพร้อมกับข้อมูลเพิ่มเติม และเป็นที่ที่เห็นการใช้ salt และอัลกอริธึมการแฮชอย่างชัดเจน
บรรทัดใน /etc/shadow มีโครงสร้างคล้ายกับ:
ผู้ใช้:$id$sal$hash:additional_fields…
เครื่องหมายดอลลาร์($)คั่นส่วนต่างๆ ส่วนแรกหลังชื่อผู้ใช้จะระบุประเภทของอัลกอริทึมที่ใช้ ตัวอย่างเช่น$1$โดยทั่วไปจะแทน MD5, $5$แทน SHA-256 และ$6$แทน SHA-512 ซึ่งเป็นอัลกอริทึมที่พบได้บ่อยที่สุดในระบบปฏิบัติการรุ่นใหม่ๆ เนื่องจากให้ความปลอดภัยมากกว่าระบบเก่าๆ ที่ใช้ DES หรือ MD5
หลังจากตัวระบุอัลกอริทึมแล้วจะตามมาด้วยค่าเกลือ (salt) และ ค่าแฮชที่ได้ทั้งหมดนี้อยู่ในฟิลด์เดียวกัน เมื่อระบบตรวจสอบรหัสผ่าน ระบบจะอ่านตัวระบุและค่าเกลือนี้ จากนั้นใช้อัลกอริทึมที่ตรงกับรหัสผ่านที่ป้อน และเปรียบเทียบค่าแฮชที่คำนวณได้กับค่าแฮชที่จัดเก็บไว้
เพื่อตรวจสอบอย่างรวดเร็วว่าผู้ใช้รายใดเข้ารหัสรหัสผ่านและใช้อัลกอริทึมใด คุณสามารถใช้คำสั่งเช่น`grep '\$' /etc/shadow` ได้ในบริบทนี้ เครื่องหมายดอลลาร์ ($) ใช้เพื่อค้นหาบรรทัดที่มีแฮชในรูปแบบสมัยใหม่ ต้องใช้เครื่องหมายแบ็กสแลช (\) เพื่อหลีกเลี่ยงการตีความผิด เนื่องจากในนิพจน์ปกติ เครื่องหมายนี้หมายถึงจุดสิ้นสุดของบรรทัด
บัญชีที่ไม่ต้องใช้รหัสผ่านหรือบัญชีที่ถูกล็อก มักจะแสดงค่าเช่น!หรือ* ในช่องนั้น แทนที่จะเป็นเครื่องหมายแฮชที่มีเครื่องหมายดอลลาร์ ซึ่งบ่งชี้ว่าไม่สามารถยืนยันตัวตนด้วยรหัสผ่านมาตรฐานได้ โครงสร้างนี้ทำให้เห็นได้อย่างชัดเจนว่าLinux ผสานการเพิ่มเกลือ (salting) เข้ากับ รูปแบบ การจัดเก็บรหัสผ่านโดยธรรมชาติ
ความแตกต่างระหว่างการแฮชรหัสผ่านและการใส่เกลือ
สิ่งสำคัญคือต้องแยกแยะความแตกต่างระหว่างสองแนวคิดที่บางครั้งมักสับสนกัน ได้แก่การแฮชและการใส่เกลือการแฮชรหัสผ่านคือกระบวนการแปลงรหัสผ่านให้เป็นค่าที่ไม่สามารถจดจำได้โดยใช้อัลกอริทึมแบบทางเดียว เซิร์ฟเวอร์ไม่จำเป็นต้องรู้รหัสผ่านดั้งเดิม เพียงแต่ตรวจสอบว่าผู้ใช้รู้รหัสผ่านที่ถูกต้องหรือไม่ เพราะจะได้ค่าแฮชเดียวกัน
ปัญหาคือ หากรหัสผ่านสองรหัสเหมือนกันค่าแฮชที่ไม่ได้ใส่เกลือ (unsalted hashe) ของรหัสเหล่านั้นก็จะเหมือนกันด้วยซึ่งทำให้ผู้โจมตีสามารถเปรียบเทียบ จัดกลุ่มผู้ใช้ตามรหัสผ่าน หรือใช้ตารางที่คำนวณไว้ล่วงหน้าได้ ยิ่งไปกว่านั้น หากอัลกอริธึมการแฮชทำงานเร็วและออกแบบมาเพื่อความสมบูรณ์ของข้อมูล (เช่น SHA-256 แบบง่ายๆ) ก็จะยิ่งเสี่ยงต่อการโจมตีแบบเดาสุ่มจำนวนมาก (massive brute-force attack) มากขึ้น
การใช้ Salting เข้ามาแก้ไขจุดอ่อนนี้โดยเฉพาะ คือการเพิ่มข้อมูลแบบสุ่มเข้าไปในรหัสผ่านก่อนที่จะทำการแฮช ผลลัพธ์ก็คือ แม้ว่าผู้ใช้สองคนจะเลือกใช้ "casa" เป็นรหัสผ่านเหมือนกัน แต่ค่าแฮชในฐานข้อมูลก็จะแตกต่างกันอย่างสิ้นเชิง เพราะตัวอย่างเช่น ค่าแฮชของคนหนึ่งจะเป็น "casa+7Ko#" ในขณะที่อีกคนจะเป็น "casa8p?M"
ดังนั้น การแฮชและการใส่เกลือจึงไม่ได้แข่งขันกัน แต่กลับเสริมซึ่งกันและกัน การแฮชให้คุณสมบัติของทิศทางเดียวและความง่ายในการตรวจสอบ ในขณะที่การใส่เกลือให้ความเป็นเอกลักษณ์และความต้านทานต่อการโจมตีจำนวนมากการใช้งานระบบจัดเก็บรหัสผ่านที่ปลอดภัยจะรวมทั้งสองเทคนิคเข้าด้วยกัน โดยในอุดมคติแล้วควรใช้อัลกอริทึมที่ออกแบบมาเพื่อจุดประสงค์นี้โดยเฉพาะ พร้อมต้นทุนที่สามารถกำหนดค่าได้
การใช้ salt ใน Linux ด้วย mkpasswd
ในสภาพแวดล้อม GNU/Linux และ ระบบที่คล้าย Unix อื่นๆ วิธีที่ใช้งานได้จริงมากในการทดลองใช้การเพิ่มเกลือให้กับรหัสผ่านคือการใช้ เครื่องมือ mkpasswdคำสั่งนี้ใช้ในการสร้างรหัสผ่านที่เข้ารหัส อย่างปลอดภัย และมักถูกรวมเข้าในกระบวนการสร้างผู้ใช้ สคริปต์การดูแลระบบ และอื่นๆ
ไวยากรณ์พื้นฐานของ `mkpasswd` อนุญาตให้คุณระบุรหัสผ่านที่จะเข้ารหัสและตัวเลือกต่างๆ เช่น ประเภทของอัลกอริทึม (ตัวอย่างเช่น `des`, `md5`, `sha-256`, `sha-512`) โดยใช้ ตัวเลือก `-m`บนระบบที่ทันสมัย แนะนำให้เลือกใช้ อย่างน้อย SHA-512หรือเลือกใช้แบบเข้ารหัสที่แข็งแกร่งกว่านั้นหากระบบปฏิบัติการรองรับ
ตัวเลือกที่น่าสนใจเป็นพิเศษในบริบทของการเพิ่มเกลือ (salting) คือ-Sซึ่งช่วยให้คุณสามารถเพิ่มเกลือให้กับรหัสผ่านก่อนที่จะเข้ารหัส หากไม่ได้ระบุด้วยตนเอง mkpasswd สามารถสร้างเกลือแบบสุ่มได้ทุกครั้งที่เรียกใช้ดังนั้นแม้จะใช้รหัสผ่านเดียวกัน ผลลัพธ์ของแฮชก็จะแตกต่างกันในแต่ละครั้ง
สามารถตรวจสอบได้ง่ายๆ: หากคุณเข้ารหัส "password123" หลายครั้งด้วย mkpasswd โดยใช้ SHA-512 และ salt แบบสุ่ม คุณจะได้ค่าแฮชที่แตกต่างกันโดยสิ้นเชิง อย่างไรก็ตาม หากคุณส่งค่า salt เดียวกันโดยใช้ -S ค่าแฮชจะเหมือนกันเสมอ เนื่องจากค่ารหัสผ่านและ salt จะไม่เปลี่ยนแปลง
ด้วยเครื่องมือนี้การเตรียมรหัสผ่านที่เข้ารหัสแบบใส่เกลือเพื่อเพิ่มลงในไฟล์การกำหนดค่า การจัดการผู้ใช้ด้วยตนเอง หรือการทดสอบพฤติกรรมการใส่เกลือจึงทำได้ง่ายมาก โดยไม่ต้องเขียนโปรแกรมใดๆ
นักเขียนผู้หลงใหลเกี่ยวกับโลกแห่งไบต์และเทคโนโลยีโดยทั่วไป ฉันชอบแบ่งปันความรู้ผ่านการเขียน และนั่นคือสิ่งที่ฉันจะทำในบล็อกนี้ เพื่อแสดงให้คุณเห็นสิ่งที่น่าสนใจที่สุดเกี่ยวกับอุปกรณ์ ซอฟต์แวร์ ฮาร์ดแวร์ แนวโน้มทางเทคโนโลยี และอื่นๆ เป้าหมายของฉันคือการช่วยคุณนำทางโลกดิจิทัลด้วยวิธีที่เรียบง่ายและสนุกสนาน