המידע הזה מיועד למפתחים שהאפליקציות שלהם מכילות תבניות של הצפנה קריפטוגרפית לא בטוחה. כלומר, מידע מוצפן (ciphertext) שנוצר באמצעות מפתח סודי salt או וקטור אתחול (IV) שמחושב באופן סטטי. ניתן למצוא את המיקומים של ההצפנה הקריפטוגרפית הלא בטוחה בהתראת Play Console לאפליקציה שלכם.
אין לתקן התראות על "תבניות של הצפנה קריפטוגרפית לא בטוחה"
עליכם לחפש באפליקציה שלכם מפתחות שמחושבים באופן סטטי, וקטורים של אתחול ו/או נתוני salt שנעשה בהם שימוש בפעולות הצפנה קריפטוגרפית, ולוודא שהערכים האלו נוצרו באופן בטוח. לדוגמה, הקוד הבא משתמש במפתח סודי שחושב באופן סטטי ווקטור אתחול שניתן לחשב באופן סטטי: // התראת המסוף מתייחסת לשיטה זו
public byte[] encryptionUtil(String key, String iv, byte[] plainText) {
Cipher cipher = Cipher.getInstance(“AES/GCM/NoPadding”);
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), “AES”);
GCMParameterSpec paramSpec = new GCMParameterSpec(256, iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec);
return cipher.doFinal(plainText);
}
// וקטור האתחול והמפתח שאינו בטוח נמצאים כאן וצריך לשנותם
byte[] cipherText = encryptionUtil(“abcdef...”, “010203040506”, plainText);
ערכים שמחושבים באופן סטטי
ערך שמחושב באופן סטטי הוא ערך שזהה בכל הרצה של האפליקציה. ניתן לשלוף ערכים קריפטוגרפיים שמחושבים באופן סטטי מהאפליקציה ולהשתמש בהם כדי לתקוף את הנתונים המוצפנים באפליקציה שלכם. גם אם תשנו מפתחות, וקטורים של אתחול או נתוני salt בדרכים מורכבות לפני השימוש, הם עדיין לא יהיו בטוחים אם השינויים האלו זהים בכל הרצה של התוכנית.
שיטות מומלצות ל-Android
אנחנו ממליצים להשתמש באבטחת Jetpack לקריפטוגרפיה סימטרית. אם האפליקציה מצפינה מפתחות API, פרטים אישיים מזהים (PII) או מידע אישי רגיש אחר, ניתן להשתמש במאפיין EncryptedSharedPreferences כדי לאחסן באופן מאובטח את הנתונים האלו מבלי לדאוג ליישום של מפתחות סודיים, וקטורים של אתחול ונתוני salt. אפשר למצוא דוגמאות ושיטות מומלצות נוספות בדף זה. כדי לשדר נתונים למערכות אחרות, כדאי למפתחים להשתמש ב-TLS (אבטחת שכבת התעבורה) או ב-SSL לצורך אבטחת נתונים בשידור.
באבטחת Jetpack נעשה שימוש בפרויקט הקוד הפתוח Tink של Google לצורך טיפול בהצפנה סימטרית מאומתת. בתרחישים מתקדמים לדוגמה שעוסקים בפעולות קריפטוגרפיות ברמה נמוכה יותר, אנחנו ממליצים להשתמש ישירות ב-Tink.
אם השיטות המומלצות שצוינו עד עכשיו לא מתאימות לתרחישים לדוגמה שלכם, ועליכם לנהל באופן מפורש מפתחות, וקטורים של אתחול ונתוני salt, אנחנו ממליצים לעמוד בסטנדרטים הבאים:
- מפתחות סודיים: מפתחות סודיים סימטריים חייבים להיות סודיים ולא צפויים. להצפנה של נתונים מקומיים, מפתחים צריכים ליצור מפתחות סודיים באמצעות רנדומיזציה מאובטחת מבחינה קריפטוגרפית (או מנתונים שנוצרו על ידי משתמשים, כשמשתמשים ב-PBEKeySpecs) ולאחסן את המפתחות הסודיים באמצעות AndroidKeystore.
- וקטורים של אתחול: וקטורים של אתחול חייבים להיות ייחודיים ולא צפויים בהודעות מרובות, אבל לא חייבים להיות סודיים. על המפתחים ליצור וקטורים של אתחול באמצעות רנדומיזציה מאובטחת מבחינה קריפטוגרפית. על המפתחים לאחסן או לשדר את הווקטורים של האתחול יחד עם המידע המוצפן המשויך אליהם.
- נתוני salt: נתוני salt חייבים להיות ייחודיים ולא צפויים בגיבובים (hash) מרובים, אבל לא חייבים להיות סודיים. על המפתחים ליצור נתוני salt באמצעות רנדומיזציה מאובטחת מבחינה קריפטוגרפית. על המפתחים לאחסן או לשדר את נתוני ה-salt יחד עם הגיבובים המשויכים אליהם.
השלבים הבאים
- מעדכנים את האפליקציה לפי השלבים המודגשים למעלה.
- נכנסים לחשבון Play Console ומעלים את הגרסה המעודכנת של האפליקציה.