MySQL hassas veri depolamak için en iyi yolu nedir?

4 Cevap php

I'm managing the MySQL database from PHP scripts. the communication between server and client is secured via SSL. I store user account data which is sensitive.

Is there a way to encrypt this data when entered into the DB? What is the best way to protect this sensitive data?

EDIT: I’m using a CRON job for updating data which relies on this password to login the user account. So I need a way to hash this password and to be able to get the original password for my CRON job tasks.

Bunu başarmak için en iyi yolu nedir?

Teşekkürler

4 Cevap

Cidden, DON'T USE MySQL's aes_encrypt() Bu bir blok şifreleme kullanarak en güvensiz yöntemdir. Bu ECB modunu kullanıyor, ve bu ciddi bir hatadır neden basit bir örnek gösteri verebilir.

Düz metin mesajı:

alt text

The same message encrypted with ECB mode (doesn't matter what cipher you use): alt text

The EXACT same message using CBC mode (again, it doesn't matter what cipher you use): alt text

even more reasons mysql'in AES_ENCRYPT, göndermek en önemlisi her sorgu kullanmak için değil, aynı zamanda kullandığınız aes anahtarı olacaktır vardır. Veritabanı tehlikeye ise saldırganın günlüğünü etkinleştirmek ve sadece AES anahtarı almak ve entire database deşifre olacaktır.

Yani should ne kullanmak? I this class olduğu zaman seviyorum. Onun String2Key fonksiyonu ve bir IV ile CBC modunu kullanarak. Sen IV olarak birincil tuşunu kullanabilirsiniz, her mesaj bir benzersiz IV olmalıdır. Onun tamam saldırganın IV bilir ve onlar sıralı ise, bir IV so long as the block cipher implementation is secure. Tekrar yaptıysanız WEP much less secure.

MySQL şifreleme fonksiyonları vardır

http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

Örneğin, şifrelenmiş biçimde veri depolamak için () AES_ENCRYPT kullanabilirsiniz.

Ancak bu işlevlerin bazı zayıflık vardır,

  1. Bu IV veya blok-zincirleme desteklemiyor. Bu şifreleri gibi hassas veriler için uygun değil yani aynı metin her zaman aynı şifreli içine şifreler.

  2. Bu tuşları döndürmek çok zor yani hiçbir anahtar bilgi yoktur.

(Eğer başarmak istediğiniz tam olarak ne hakkında biraz daha ayrıntılı bilgi vermediğiniz sürece) bunu yapmak için bazı temel yolu vardır.

  • Uzaktan erişimi devre dışı bırakın.
  • MySQL erişim günlüğü izleyin.
  • strong kullanımını ve müşteri ucundan secure şifreler gerektirir.
  • Veritabanına kaydetmeden önce ALL kullanıcı girdileri.
  • Güvenlik için php yapılandırın. (Register_globals, safe_mode vs vs)
  • Belirttiği gibi, mysql dahili şifreleme işlevlerini kullanın. http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

Eğer wanna-be korsanlarına karşı koruyan iseniz bu Tamam olmalıdır. Yine biraz daha ayrıntılı olarak belirtmek gerekir.

Ayrıca algoritmanın hızına karşı gerek güvenlik düzeyini göz önünde bulundurmanız gerekir.

Orada gerçekten yararlı bir yanıt için çok litte bilgi ama burada yaygın durumlar şunlardır:

Eğer kullanıcı giriş doğru olup olmadığını kontrol etmelisiniz şifrelerinizi saklamak, ancak özgün verileri kendisi ihtiyacım yok, bir karma (SHA1/SHA2) saklayabilirsiniz. Bunu doğru yapmak için karma için tüm uygulamaları arama.

Eğer özgün verileri geri okumak gerekiyorsa, şifreleme işlevlerini kullanabilirsiniz. Bir simetrik şifreleme için iyi bir seçim AES. Ancak burada sorun, anahtar yönetimi olur. Eğer şifreleme / şifre çözme için kullanılan anahtar nerede saklamak? Bu çok yaygın bir sorundur ve duruma bağlı olarak farklı çözümler tehre.