วันนี้ขอหยิบเรื่อง Keystore มาเล่าสู่กันฟังเล่นๆเสียหน่อย เพราะ Keystore นั้นเป็นหนึ่งในพื้นฐานที่นักพัฒนาควรจะรู้จักไว้นะ

ถ้านึกคำว่า Keystore ไม่ออก ก็ให้นึกถึงตอนที่เขียนแอปแอนดรอยด์เสร็จแล้ว แล้วอยากจะเอาขึ้น Google Play สิ่งที่ต้องทำก็คือเอาโปรเจคที่ทำเสร็จแล้ว มา Build ให้กลายเป็นไฟล์ APK นั่นเอง ซึ่งในขั้นตอนนี้นี่แหละที่ Keystore จะเข้ามามีบทบาท เพราะว่ามันต้องใช้ทุกครั้งในการทำไฟล์ APK นั่นเอง

Keystore มีไว้เพื่ออะไร?

ทุกๆครั้งที่โปรเจคของผู้ที่หลงเข้ามาอ่าน Build ให้กลายเป็นไฟล์ APK นั้น ไฟล์ Keystore จะถูกฝัง (Signed) ลงไปด้วย ถ้าจะพูดแบบง่ายๆให้เข้าใจว่า Keystore คือไฟล์ที่จะบอกให้รู้ว่าใครคือเจ้าของไฟล์ APK ตัวนั้นๆครับ และ Google Play Store ก็จะเช็คว่าใครเป็นเจ้าของไฟล์ ก็จะดูจาก Keystore ที่อยู่ข้างใน

ซึ่งบน Google Play Store จะแยกแยะแอปที่มีเป็นล้านแอปอยู่บนนั้นด้วย Package Name และ Keystore ที่อยู่ในแอปตัวนั้นๆครับ ถึงแม้ว่า Package Name จะตั้งได้ตามใจชอบ แต่ผู้ที่หลงเข้ามาอ่านไม่สามารถสร้าง Keystore ที่เหมือนกับของคนอื่นได้เลย และนักพัฒนาแต่ละคนก็จะมี Keystore ของตัวเองเก็บไว้เช่นกัน

ให้เข้าใจง่ายๆว่าแอปเปรียบเสมือนบ้าน, Package Name เป็นเลขที่บ้าน, Keystore เป็นกุญแจของบ้านหลังนั้นๆ และ Google Play Store ก็คือเมืองๆหนึ่งที่เต็มไปด้วยบ้านหลายๆหลังนั่นเอง

แอปหลายตัวสามารถใช้ Keystore ตัวเดียวกันได้ (กุญแจหนึ่งดอกสามารถใช้กับบ้านหลายๆหลัง)

ดังนั้นจึงไม่ต้องกลัวว่าจะมีใครมาหลอกหรือแอบอ้างว่าเป็นเจ้าของบ้าน เพราะคนที่จะเป็นเจ้าของนั้นจะต้องมีกุญแจบ้าน ถ้าไม่มีก็แปลว่ามั่วนิ่มจ้าาาาา

อย่าทำ Keystore หาย!!

จริงๆก็น่าจะรู้กันอยู่แล้วล่ะ เพราะว่า Keystore คือกุญแจที่ใช้ไขประตูเข้าบ้านแต่ละหลัง ถ้าทำหายมาก็จบเห่

Keystore ใดๆก็ตามที่ใช้ในการ Build APK ส่งขึ้น Google Play Store ห้ามทำหายเด็ดขาด!! ถ้าไม่อยากซวยก็จงอย่าทำหาย

เพราะถ้าอยากจะอัปเดตให้เป็นเวอร์ชันใหม่ ก็จะทำไม่ได้เลย เนื่องจาก APK ที่ส่งขึ้น Google Play Store จะต้องใช้ Keystore ตัวเดิมทุกครั้ง ดังนั้นถ้าทำ Keystore หาย จะไปสร้างอันใหม่มาใช้ไม่ได้นะ ทำได้ก็แค่เปลี่ยน Package Name ใหม่ ใช้ Keystore ตัวใหม่ แล้วส่งขึ้นไปในนามของแอปตัวใหม่เท่านั้น (แล้วก็จะเจอปัญหาทำยังไงให้ผู้ใช้งานแอปตัวเก่าย้ายให้มาใช้ตัวใหม่)

สร้าง Keystore ยังไง?

ขั้นตอนการสร้าง Keystore ให้ตามไปอ่านกันได้ที่บทความ วิธีการสร้าง Keystore บน Android Studio โดยไฟล์ Keystore ที่สร้างขึ้นมานั้นจะเป็นนามสกุล .jks (เมื่อก่อนจะเป็น .keystore ซึ่งก็ใช้ได้ทั้งคู่น่ะแหละ)

วิธีการสร้าง Keystore บน Android Studio
บทความนี้ก็จะเป็นวิธีการสร้าง Keystore ใน Android Studio เพื่อใช้ในการ Export โปรเจคแอนดรอยด์ของผู้ที่หลงเข้ามาอ่านให้กลายเป็นไฟล์ APK ซึ่งเป็นหนึ่งในขั้นตอนที่จะต้องทำ App Bundle หรือ APK เพื่ออัปโหลดขึ้น Google Play Store

รู้จักกับ Debug และ Signed Keystore

ผู้ที่หลงเข้ามาอ่านคงรู้กันแล้วว่าการจะสร้าง APK จะต้องใช้ Keystore ทุกครั้ง

ใช่ครับ ทุกครั้งจริงๆนะ ถึงแม้ว่าจะกดปุ่ม Run จากใน Android Studio ก็ตาม เพราะมันก็ต้องสร้างเป็นไฟล์ APK เพื่อติดตั้งลงในอุปกรณ์แอนดรอยด์เพื่อที่จะได้ทดสอบการทำงาน

เอ แล้วมันไปเอา Keystore จากไหนมาใช้ล่ะ?

สำหรับไฟล์ APK ที่ได้จากการกดปุ่ม Run เพื่อทดสอบแอปเจ้าของบล็อกจะขอเรียกว่า Debug APK นะครับ

ในการสร้าง Debug APK ทุกๆครั้ง Android Studio จะใช้ Keystore ที่เรียกว่า Debug Keystore ซึ่งเป็น Keystore ที่ถูกสร้างขึ้นด้วย Android Studio เอง เป็น Keystore สำหรับใช้ตอน Debug APK เท่านั้น ไม่สามารถนำไปใช้งานจริงๆได้ (ไม่สามารถส่ง Debug APK ขึ้น Google Play Store ได้ แต่ยังเอาไปติดตั้งในเครื่องโดยตรงได้อยู่)

Debug Keystore จะถูกสร้างขึ้นมาแล้วเก็บไว้ที่

# สำหรับ macOS และ Linux
~/.android/debug.keystore 

# สำหรับ Windows
C:\Users\<username>\.android\debug.keystore

โดย Android Studio จะสร้าง Debug Keystore ขึ้นมาในครั้งแรก หลังจากนั้นก็จะใช้ Keystore ตัวนั้นทุกครั้งในการสร้าง Debug APK และถ้าไปเผลอลบทิ้งหรืออะไรก็ตามที่ทำให้ Debug Keystore หายไป ก็จะถูกสร้างใหม่ผ่าน Android Studio ทุกครั้ง โดยจะถูกกำหนดค่าเริ่มต้นไว้ดังนี้

Keystore Name     : "debug.keystore" 
Keystore Password : "android" 
Key Alias         : "androiddebugkey" 
Key Password      : "android"
CN                : "CN=Android Debug,O=Android,C=US"

แต่ Debug Keystore ที่ถูกสร้างขึ้นในแต่ละครั้ง จะไม่มีทางเหมือนกัน (เพราะ Keystore ไม่สามารถสร้างซ้ำให้เหมือนเดิมได้)

ดังนั้น Debug Keystore จากคนละเครื่อง หรือหลังจาก Format เครื่อง จะเป็นคนละตัวกันนะจ๊ะ (อยากให้เหมือนกันก็ก๊อปมาแปะละกัน)

ส่วน Keystore ที่เกิดจากการที่นักพัฒนาสร้างขึ้นมาเอง จะเรียก Keystore นั้นว่า Signed Keystore ส่วนการสร้าง APK โดยใช้ Signed Keystore ก็จะเรียกว่า Signed APK ซึ่งจะเป็น APK ที่สามารถส่งขึ้น Google Play Store ได้ (และอย่าเผลอทำ Keystore ตัวนั้นหายล่ะ)

ดังนั้น Debug Keystore กับ Signed Keystore ต่างกันนะจ๊ะ

การใช้งาน Keystore นอกเหนือจากการสร้าง APK

อย่างที่บอกในตอนแรกว่า Keystore ก็เหมือนกุญแจประจำแอป ดังนั้นมันจึงสามารถใช้ยืนยันตัวตนของแอปได้ ดังนั้น Web Service ที่อยากจะผูกกับแอปแต่ละตัวไปเลย จึงใช้วิธีการเก็บค่าบางอย่างจาก Keystore ไว้ เพื่อเอาไว้เช็คว่า Request นั้นๆมาจากแอปที่ต้องการจริงๆหรือไม่

โดย Keystore ทุกตัวจะเก็บค่าที่เรียกว่า Certificate Fingerprint ไว้ (นี่แหละที่ Keystore แต่ละตัวมีความแตกต่างกัน) โดยค่าดังกล่าวสามารถแสดงผลเป็น MD5, SHA1 และ SHA256

ยกตัวอย่างเช่น Google Maps for Android ที่จะให้นักพัฒนาดึงค่า SHA1 จาก Keystore และ Package Name ของแอปไปเก็บไว้ในบน Server นั่นเอง

ดังนั้นผู้ที่หลงเข้ามาอ่านจึงสามารถประยุกต์นำ MD5, SHA1 หรือ SHA256 ไปใช้งานที่ต้องการความปลอดภัยก็ได้

ระวังอย่าให้คนอื่นรู้ Certificate Fingerprint ของ Keystore ตัวนั้นๆเด็ดขาด

และอย่าลืมว่า Certificate Fingerprint ของ Keystore แต่ละตัวไม่มีทางเหมือนกัน ดังนั้นเวลาใช้งานก็อย่าลืมเก็บทั้งของ Debug Keystore (สำหรับทดสอบในระหว่างพัฒนา) และ Signed Keystore (สำหรับใช้งานจริง)

บริการจัดการ Keystore บน Google Play

ล่าสุดทาง Google Play เพิ่มบริการช่วยจัดการ Keystore เข้ามาให้เพื่อช่วยแก้ปัญหานักพัฒนาชอบลืมและทำ Keystore หาย สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ Google Play เพิ่มบริการจัดการกุญแจรับรองแอปให้นักพัฒนา แต่ถ้าใช้บริการแล้วเลิกไม่ได้

Google Play เพิ่มบริการจัดการกุญแจรับรองแอปให้นักพัฒนา แต่ถ้าใช้บริการแล้วเลิกไม่ได้
ระบบรักษาความปลอดภัยของแอนดรอยด์อาศัยการเซ็นรับรองความถูกต้องของตัวแอปด้วยกุญแจของตัวนักพัฒนา ความลำบากอย่างหนึ่งคือหากนักพัฒนาไม่ได้เชี่ยวช

สรุป

Keystore เป็นสิ่งหนึ่งที่สำคัญมากสำหรับนักพัฒนาที่ควรรู้จักและเข้าใจมัน เพราะ Keystore ถูกใช้ในการ Signed APK ทุกครั้งก่อนที่จะส่งขึ้น Google Play Store รวมไปถึง Web Service บางเจ้าก็ใช้ในการยืนยัน Request

โดย Debug และ Signed Keystore แตกต่างกันดังนี้

Debug Keystore

  • เกิดมาเพื่อสร้าง Debug APK สำหรับทดสอบเท่านั้น
  • Android Studio สร้างให้เอง
  • ไม่สามารถเอา Debug APK ส่งขึ้น Google Play Store ได้
  • สามารถทำหายได้ แต่ถ้ามีการนำ Certificate Fingerprint ไปใช้งาน จะต้องอัปเดทค่าจาก Keystore ตัวใหม่ด้วย

Signed Keystore

  • เกิดมาเพื่อสร้าง Signed APK ที่เอาไปใช้งานจริง
  • นักพัฒนาต้องเป็นคนสร้างเอง
  • สามารถเอา Signed APK ส่งขึ้น Google Play Store ได้
  • ห้ามทำหายเด็ดขาด

และสิ่งที่ไม่ควรลืมคือ Keystore ไม่มีวันสร้างซ้ำ (Regenerate) ให้เหมือนเดิมได้ และไม่ควรทำ Signed Keystore หายเด็ดขาด เพราะจะทำให้อัปเดตแอปที่อยู่บน Google Play Store ไม่ได้ ดังนั้นควรสำรองไฟล์เก็บไว้ซักที่ที่มั่นใจว่าปลอดภัยด้วยนะ

ก็หวังว่าผู้ที่หลงเข้ามาอ่านจะเข้าใจเกี่ยวกับ Keystore มากขึ้นนะครับ XD