Dalam reka bentuk perisian selamat, elakkan menyimpan kata laluan dalam teks biasa. Sebaliknya, gunakan teknik pencincangan dan penyulitan untuk melindungi maklumat sensitif.
Pindahkan bukti kelayakan daripada Strings kepada tatasusunan aksara. Rentetan tidak boleh diubah, menjadikan data terdedah kepada pendedahan sebelum pembersihan. Tatasusunan aksara, sebaliknya, boleh dibersihkan serta-merta.
Sulitkan bukti kelayakan sambil mengekalkan cincangan asal untuk keselamatan. Nyahsulit bukti kelayakan hanya semasa proses pengesahan. Adalah dinasihatkan untuk mengelakkan bukti kelayakan pengekodan keras dan sebaliknya menyimpannya dengan selamat, seperti dalam fail konfigurasi yang disulitkan.
Laksanakan TLS atau SSL untuk menyulitkan data penghantaran antara pelanggan dan pelayan. Ini melindungi bukti kelayakan daripada mencuri dengar.
Gunakan teknik pengeliruan untuk menghalang pihak yang berniat jahat daripada mengakses langkah keselamatan walaupun sekiranya berlaku penyahkompilasi. Kekeliruan menyukarkan penyerang untuk mendedahkan kelemahan.
Coretan kod berikut menggambarkan kelayakan penyulitan dan penyahsulitan:
import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; public class SecureCredentials { private static final char[] PASSWORD = "YourEncryptionKey".toCharArray(); private static final byte[] SALT = { (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12, (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12 }; public static void encrypt(char[] property) throws Exception { SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD)); Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); // Encrypt and save to temporary storage String encrypted = Base64.encodeBytes(pbeCipher.doFinal(property)); // Cleanup data sources for (int i = 0; i < property.length; i++) { property[i] = 0; } property = null; System.gc(); // Return encryption result return encrypted; } public static String decrypt(String property) throws Exception { SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD)); Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); return new String(pbeCipher.doFinal(Base64.decode(property))); } // Usage example public static void main(String[] args) { try { char[] password = "MySecurePassword".toCharArray(); String encryptedPassword = encrypt(password); String decryptedPassword = decrypt(encryptedPassword); System.out.println("Original Password: " + String.valueOf(password)); System.out.println("Encrypted Password: " + encryptedPassword); System.out.println("Decrypted Password: " + decryptedPassword); } catch (Exception e) { e.printStackTrace(); } } }
Atas ialah kandungan terperinci Bagaimana untuk Menyimpan Bukti Kelayakan Pengguna dengan Selamat dalam Perisian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!