Tersinir biçimde saklanması Şifreleri

12 Cevap php

I have a PHP app that needs to run bash scripts, and provide a username & password (for remote systems). I need to store these credentials somewhere that is accessible by my PHP (web) app. The logical place is the database (currently MySQL, but will be agnostic). The problem with the "standard" way of hashing and storing the credentials, is that it is not reversible. I have to be able to get the credentials out as unencrypted clear text, to be able to insert the data into bash scripts.

Herkes bu konuda gitmek için güvenli bir yol için herhangi bir öneriniz var mı?

Ben belki kimlik PKI'ing, ve DB sonucu depolamak düşündüm. Sonra unencrypt için özel anahtarı (PHP yapabilirsiniz) kullanın. Web kök dışında bunu yapmak için komut dosyalarını saklayın.

Herhangi bir düşünce çok takdir.

12 Cevap

İlk olarak, devlet (umarım) belirgin, herhangi bir şekilde tüm bunu adları ve şifreleri depolamak önlemek eğer; büyük bir sorumluluk ve kimlik mağaza ihlal eğer o (nedeniyle şifre paylaşımı) aynı kullanıcılar için pek çok başka yerlere erişim sağlayabilir.

Eğer kimlik bilgileri saklamanız gerekir:

  1. (Ben bu kullanım için gereksiz olduğunu düşünüyorum gerçi) AES-256, 3DES (tarih), ya da bir ortak anahtar şifreleme - iyi bir şifreleme algoritması seçin. Bir saygın güvenilir bir kaynaktan şifreleme yazılımı kullanın - KENDİ ROLL KALKIŞMAYIN, büyük olasılıkla onu YANLIŞ KAZANACAK.
  2. Anahtarlarını oluşturmak için secure rastgele jeneratör kullanın. Zayıf rastgele şifreleme ilgili güvenlik hatalarına değil, şifreleme algoritmaları bir numaralı nedenidir.
  3. Sadece uygulamalar zamanı profilinize erişilebilir bir O / S güvenli dosyasında, senin veritabanından ayrı şifreleme / şifre çözme anahtarı (ler) saklayın. DB ihlal ise genel olarak HDD erişim gerektirir, çünkü bu şekilde, (örneğin, SQL enjeksiyon yoluyla) anahtar, otomatik savunmasız değildir. Senin O / S için bir tercihe bağlı dosya şifrelemeyi destekler varsa, onu kullanın - bu sadece yardımcı olabilir ve bu (örn. NTFS şifreleme), genellikle şeffaf.
  4. Pratik, kendilerini birincil şifre ile şifrelenmiş anahtarlarını saklamak. Bu genellikle uygulama anlamına gelir. başlangıçta girilmezse bu şifreye ihtiyacınız olacak - sizin HDD ihlal edilirse eğer anahtar dosyası ve komut hem de görülebilir olduğunu varsaymak gerekir çünkü bir komut bir parametre bunu sağlamak için hiçbir iyi yapar.
  5. Her kimlik seti için, bir salt (şifresiz) şifreli veri ile birlikte saklamak; Bu kullanıldığı için "prime" iki aynı şifre aynı şifre metin üretmek değil şifreleme, öyle ki - bu şifreleri aynı olduğunu ele veriyor beri.
  6. Kullanıcı adı (sizin durumda değil) hesap kaydı bulmak için gerekli değilse, kullanıcı adınızı ve parolanızı şifrelemek. Her iki şifrelemek varsa, örneğin, bir şifreleme çalıştırmak gibi onları şifrelemek

    userAndPass=(user+":"+pass);
    encryptInit();
    encrypt(salt);
    encrypt(userAndPass);
    cipherText=encryptFinal();

    adı daha tuzlar şifre orada kırmak kolay olan kısa şifre metinler, daha az olay olduğunu, ve böylece ve, tekil blob saklayın.

PS: Ben çok uygun kripto s / o ortamda w PHP değil programı yorum yapamam yok.

Sen iyi 2 yönlü kriptografik yöntemler içine bakmak gerekir, ve başparmak benim genel kural şudur:

If you implement your own cryptographic code you will fail.

Yani, iyi doğrulandı iyi bir uygulama bulmak ve bu kullanmaktadır.

Burada bazı iyi bilgi muhtemelen vardır:

http://phpsec.org/library/

Bu kütüphaneyi Giriş: PECL gnupg bu GnuPG'yi ile etkileşim için yöntemler sağlar. Kolayca encrypt and decrypt veri, safe ortak anahtar şifreleme algoritmaları kullanarak.

Ben şifreleri saklamak değil önermek, ama bir ssh anahtarı üreten ve uzak sistemin autorized_keys dosyasında genel anahtarını saklayarak uzak sisteme ana bilgisayardan şifresiz ssh bağlantısı kullanabilirsiniz. Sonra sadece yapılandırma sırasında bağlantı kurmak gerekir. Ben mayın güvenli yapabilirsiniz daha emin akıllı beyinleri değilim rağmen kuşkusuz oldukça sorunuzu yanıtlarken, ama tersine çevrilebilir bir parolaları depolamak değil, bir güvenlik ihlali imho için kaygan bir eğim olduğunu.

Başlamak için kolay bir yolu mysql'in kodlamak () ve decode () fonksiyonları kullanmaktır. Ben altında kullanılan algoritmayı bilmiyorum, ama kullanmak için yeterince kolaydır:

INSERT INTO tbl_passwords SET encoded_pw = ENCODE('r00t', 'my-salt-string');

ve

SELECT DECODE(encoded_pw, 'my-salt-string') FROM tbl_passwords;

Eğer PKI gidip isterim eğer, emin olun güvenli koruma özel anahtarlarını olun! PKI tarafından sağlanan güçlü şifreleme anahtarlarını olarak sadece güvenlidir.

Ben hedef olduğunu düşünüyorum. İyi bir açık şifreleme kütüphanesi için GPG Bak

Hemen hemen bunu yapmanın iki yöntem var gibi görünüyor:

1) Eğer şifresi ve komut kimlik doğrulaması için kullanılan bir şifreleme algoritması veya algoritmalar kullanın önerdi gibi. Bunu gerçekleştirmek için PHP mcrypt kütüphane kullanabilirsiniz.

2) güvenlik ve açığına senin metninin düzeyinin istenen seviyeye bağlı olarak, size komut dosyası sınırları içinde her bir kullanıcının hesabını kaçırmak için kullanabileceğiniz eşsiz tanımlayıcı tahmin güvenli bir karma, anahtar, ya da diğer sert kullanabilirsiniz.

Birçok size senaryo Eğer kullanıcı adı ve şifre şifrelemek gerektirir belirtti. Ben şifreleme / şifre çözme için php mcrypt uzantısını kontrol etmenizi öneriyoruz.

Ben web app anında gömülü kimlik, bir PHP komut dosyası derleme araştırmak için gidiyorum düşünüyorum.

Ben o zaman bu kullanım için, yeni bir PHP komut dosyası oluşturmak ve derlemek, (belirli bir kullanım için) kimlik sormak istiyorum. Bu şekilde, komut only ihtiyacım ne yapacak, ve "okunabilir" olmamalıdır. Ben bu yapmak için güvenli bir yol gibi geliyor.

Roadsend kullanmayı deneyecek. http://www.roadsend.com/

Sadece MySQL kodlama ve kod çözme işlevlerini kullanmak için öneri takip etmek, manuel vague ne kadar bu işin üzerinde:

Şifreleme gücü rastgele ne kadar iyi dayanır. Bu kısa dizeleri için yeterli olacaktır.

Ama ben öneririm yerine yerleşik MySQL 5.0 AES functions kullanabilirsiniz olmasıdır; AES_ENCRYPT() ve AES_DECRYPT()

SELECT AES_ENCRYPT('secret squirrel', '12345678') AS encoded

=> ØA;J×ÍfOU»] É8

SELECT AES_DECRYPT('ØA;J×ÍfOU»] É8', '12345678') AS decoded

=> secret squirrel

Bunlar çoğu amaçlar için yeterince güçlü olmalıdır 128-bit AES kullanır. Diğer bir tuz değeri kullanarak, yorumladı ve yüksek bir entropiye sahip bir anahtar iyi bir uygulamadır.

PHP için, AES şifreleme is MCRYPT_RIJNDAEL fonksiyonları ile hayata dikkat etmek önemlidir. PHP onları kullanılabilir olduğunda bir açık olmayan uygulama için ödeme gitmeyin.

Daha fazla bilgi için PHP page discussing available ciphers bakın.