27 May 2014

[Android Dev Tips] รู้จักกับ Keystore และ Debug/Signed Keystore



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

รู้จักกับ 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 เป็นสิ่งหนึ่งที่สำคัญมากสำหรับนักพัฒนาที่ควรรู้จักและเข้าใจมัน เพราะ 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




เหล่าพันธมิตรแอนดรอยด์

Devahoy Layer Net NuuNeoI The Cheese Factory Somkiat CC Mart Routine Artit-K Arnondora Kamonway Try to be android developer Oatrice Benz Nest Studios Kotchaphan@Medium Jirawatee@Medium Travispea@Medium