मैं अपने उपयोगकर्ताओं के पासवर्ड सुरक्षित रूप से कैसे संग्रहीत कर सकता हूं?


169

सादे एमडी 5 की तुलना में यह कितना अधिक सुरक्षित है ? मैंने अभी पासवर्ड सुरक्षा में देखना शुरू किया है। मैं PHP के लिए बहुत नया हूँ।

$salt = 'csdnfgksdgojnmfnb';

$password = md5($salt.$_POST['password']);
$result = mysql_query("SELECT id FROM users
                       WHERE username = '".mysql_real_escape_string($_POST['username'])."'
                       AND password = '$password'");

if (mysql_num_rows($result) < 1) {
    /* Access denied */
    echo "The username or password you entered is incorrect.";
} 
else {
    $_SESSION['id'] = mysql_result($result, 0, 'id');
    #header("Location: ./");
    echo "Hello $_SESSION[id]!";
}

नोट php 5.4+ ने इसे बनाया है
बेंजामिन ग्रुएनबाम

ओपनवॉल के PHP पासवर्ड हैशिंग ( फ्रेमपास) को भी देखें । उपयोगकर्ता पासवर्ड पर कई आम हमलों के खिलाफ इसकी पोर्टेबल और कठोर।
jww

1
आज के इस सवाल से जूझ रहे लोगों के लिए अप्रचलित " स्ट्रिंग इंटरपोल के बजाय पीडीओ का उपयोग करें" ।
निधि मोनिका का मुकदमा

जवाबों:


270

मानक लाइब्रेरी का उपयोग करके अपनी पासवर्ड संग्रहण योजना को सुरक्षित रखने का सबसे आसान तरीका है ।

क्योंकि सुरक्षा बहुत अधिक जटिल हो जाती है और अधिकांश प्रोग्रामर की तुलना में अधिक अदृश्य पेंच संभावनाओं के साथ अकेले निपट सकते हैं, एक मानक पुस्तकालय का उपयोग करना लगभग हमेशा सबसे आसान और सबसे सुरक्षित होता है (यदि केवल नहीं) उपलब्ध विकल्प।


नया PHP पासवर्ड एपीआई (5.5.0+)

यदि आप PHP संस्करण 5.5.0 या नए का उपयोग कर रहे हैं, तो आप नए सरलीकृत पासवर्ड हैशिंग एपीआई का उपयोग कर सकते हैं

PHP के पासवर्ड API का उपयोग करके कोड का उदाहरण:

<?php
// $hash is what you would store in your database
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT, ['cost' => 12]);

// $hash would be the $hash (above) stored in your database for this user
$checked = password_verify($_POST['password'], $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}

(यदि आप अभी भी विरासत 5.3.7 या नए का उपयोग कर रहे हैं, तो आप निर्माण कार्यों में पहुँच के लिए ircmaxell / password_compat स्थापित कर सकते हैं )


नमकीन राख पर सुधार: काली मिर्च जोड़ें

यदि आप अतिरिक्त सुरक्षा चाहते हैं, तो सुरक्षा के लोग अब (2017) 'स्वचालित रूप से) नमकीन पासवर्ड हैश में ' काली मिर्च ' डालने की सलाह देते हैं।

: वहाँ एक सरल, ड्रॉप कक्षा में है कि सुरक्षित रूप से लागू इस पैटर्न, मेरा सुझाव है है Netsilik / PepperedPasswords ( GitHub )।
यह एक एमआईटी लाइसेंस के साथ आता है, इसलिए आप इसका उपयोग कर सकते हैं, हालांकि आप चाहते हैं, यहां तक ​​कि मालिकाना परियोजनाओं में भी।

उपयोग करने वाले कोड का उदाहरण Netsilik/PepperedPasswords:

<?php
use Netsilik/Lib/PepperedPasswords;

// Some long, random, binary string, encoded as hexadecimal; stored in your configuration (NOT in your Database, as that would defeat the entire purpose of the pepper).
$config['pepper'] = hex2bin('012345679ABCDEF012345679ABCDEF012345679ABCDEF012345679ABCDEF');

$hasher = new PepperedPasswords($config['pepper']);

// $hash is what you would store in your database
$hash = $hasher->hash($_POST['password']);

// $hash would be the $hash (above) stored in your database for this user
$checked = $hasher->verify($_POST['password'], $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}


OLD मानक पुस्तकालय

कृपया ध्यान दें: अब आपको इसकी आवश्यकता नहीं होनी चाहिए! यह केवल ऐतिहासिक उद्देश्यों के लिए यहां है।

एक नज़र डालें: पोर्टेबल PHP पासवर्ड हैशिंग ढाँचा : फ़ेग करें और सुनिश्चित करें कि आप CRYPT_BLOWFISHएल्गोरिथम का उपयोग करें यदि संभव हो तो।

कोड का उदाहरण का उपयोग कर phpass (v0.2):

<?php
require('PasswordHash.php');

$pwdHasher = new PasswordHash(8, FALSE);

// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );

// $hash would be the $hash (above) stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}

PHPass कुछ प्रसिद्ध परियोजनाओं में लागू किया गया है:

  • phpBB3
  • वर्डप्रेस 2.5+ के साथ-साथ bbPress
  • Drupal 7 रिलीज़, (Drupal 5 और 6 के लिए उपलब्ध मॉड्यूल)
  • अन्य

अच्छी बात यह है कि आपको विवरणों के बारे में चिंता करने की आवश्यकता नहीं है, उन विवरणों को अनुभव वाले लोगों द्वारा प्रोग्राम किया गया है और इंटरनेट पर कई लोगों द्वारा समीक्षा की गई है।

पासवर्ड भंडारण योजनाओं के बारे में अधिक जानकारी के लिए, जेफ के ब्लॉग पोस्ट को पढ़ें : आप संभवतः गलत तरीके से पासवर्ड स्टोर कर रहे हैं

जो भी हो अगर तुम 'के लिए जाना तुम क्या मैं इसे अपने आप क्या करेंगे, धन्यवाद ' दृष्टिकोण, का उपयोग नहीं करते MD5या SHA1अब । वे अच्छे हैशिंग एल्गोरिथ्म हैं, लेकिन सुरक्षा उद्देश्यों के लिए टूटे हुए माने जाते हैं ।

वर्तमान में, क्रिप्ट का उपयोग करके , CRYPT_BLOWFISH के साथ सबसे अच्छा अभ्यास है।
PHP में CRYPT_BLOWFISH Bcrypt हैश का कार्यान्वयन है। Bcrypt ब्लोफिश ब्लॉक सिफर पर आधारित है, यह एल्गोरिथ्म को धीमा करने के लिए महंगा कुंजी सेटअप का उपयोग कर रहा है।


29

यदि आप SQL बयानों को बदलने के बजाय पैरामीटर किए गए प्रश्नों का उपयोग करते हैं, तो आपके उपयोगकर्ता बहुत अधिक सुरक्षित होंगे। और नमक प्रत्येक उपयोगकर्ता के लिए अद्वितीय होना चाहिए और पासवर्ड हैश के साथ संग्रहीत किया जाना चाहिए।


1
Nettuts + पर PHP में सुरक्षा के बारे में एक अच्छा लेख है, पासवर्ड सलाटिंग का भी उल्लेख किया गया है। शायद आपको इस पर एक नज़र डालनी
Fábio Antunes

3
Nettuts + एक मॉडल के रूप में उपयोग करने के लिए एक बहुत ही बुरा लेख है - इसमें MD5 का उपयोग शामिल है जिसे नमक के साथ भी आसानी से मजबूर किया जा सकता है। इसके बजाय, बस PHPass लाइब्रेरी का उपयोग करें जो एक ट्यूटोरियल साइट पर मिल सकने वाले किसी भी कोड से कहीं अधिक बेहतर है, अर्थात यह उत्तर: stackoverflow.com/questions/1581610/…
RichVel

11

एक बेहतर तरीका यह होगा कि प्रत्येक उपयोगकर्ता के पास एक अनोखा नमक हो।

नमक होने का लाभ यह है कि यह हमलावर के लिए हर शब्दकोश शब्द के एमडी 5 हस्ताक्षर को पूर्व-उत्पन्न करना कठिन बनाता है। लेकिन अगर एक हमलावर को पता चलता है कि आपके पास एक निश्चित नमक है, तो वे तब आपके तय किए गए नमक से उपसर्ग किए गए हर शब्दकोश शब्द के MD5 हस्ताक्षर को पूर्व-उत्पन्न कर सकते हैं।

उपयोगकर्ता द्वारा अपना पासवर्ड बदलने पर हर बार बेहतर तरीका, आपका सिस्टम यादृच्छिक नमक उत्पन्न करता है और उपयोगकर्ता रिकॉर्ड के साथ उस नमक को संग्रहीत करता है। यह पासवर्ड की जांच करने के लिए थोड़ा अधिक महंगा बनाता है (चूंकि आपको एमडी 5 हस्ताक्षर उत्पन्न करने से पहले नमक को देखने की आवश्यकता है) लेकिन एमडीआर के पूर्व-उत्पन्न करने के लिए एक हमलावर के लिए यह और अधिक कठिन बना देता है।


3
आम तौर पर साल्ट को पासवर्ड हैश (जैसे crypt()फ़ंक्शन का आउटपुट ) के साथ संग्रहीत किया जाता है । और चूंकि आपको पासवर्ड हैश को फिर से प्राप्त करना है, उपयोगकर्ता विशिष्ट नमक का उपयोग करने से प्रक्रिया को अधिक महंगा नहीं बनाया जाएगा। (या क्या आपका मतलब है कि एक नया यादृच्छिक नमक उत्पन्न करना महंगा है? मैं वास्तव में ऐसा नहीं सोचता।) अन्यथा +1।
इंशाअल्लाह

सुरक्षा के प्रयोजनों के लिए, आप केवल संग्रहीत कार्यविधियों के माध्यम से तालिका तक पहुंच प्रदान करना चाहते हैं और हैश को कभी भी वापस आने से रोक सकते हैं। इसके बजाय, ग्राहक पास करता है कि उसे क्या लगता है कि वह हैश है और उसे सफलता या विफलता का झंडा मिलता है। यह संग्रहीत खरीदारी को प्रयास को लॉग करने, सत्र बनाने, आदि की अनुमति देता है
स्टीवन सुदित

@Inshallah - यदि सभी उपयोगकर्ताओं के पास समान नमक है, तो आप उपयोगकर्ता 2 के खिलाफ user1 पर उपयोग किए जाने वाले शब्दकोश हमले का पुन: उपयोग कर सकते हैं। लेकिन यदि प्रत्येक उपयोगकर्ता के पास एक अद्वितीय नमक है, तो आपको उस प्रत्येक उपयोगकर्ता के लिए एक नया शब्दकोश तैयार करना होगा, जिस पर आप हमला करना चाहते हैं।
आर सैमुअल क्लैत्को

@ आर सैमुअल - यही कारण है कि मैंने आपके जवाब को वोट दिया, क्योंकि यह इस तरह के हमलों से बचने के लिए सर्वोत्तम-अभ्यास रणनीति की सिफारिश करता है। मेरी टिप्पणी का अर्थ यह था कि आप प्रति-उपयोगकर्ता नमक की अतिरिक्त लागत के बारे में जो कुछ भी कह रहे हैं, उसके बारे में मेरी चिंता व्यक्त करें। (चूंकि "लवण आमतौर पर पासवर्ड हैश के साथ एक साथ संग्रहीत किया जाता है" प्रति उपयोगकर्ता नमक के लिए किसी भी अतिरिक्त भंडारण और सीपीयू की आवश्यकताएं इतनी सूक्ष्म हैं, कि उनका उल्लेख भी नहीं किया जा सकता ...)
इंशाल्लाह

@Inshallah - मैं उस मामले के बारे में सोच रहा था जहाँ आपने डेटाबेस की जाँच की है यदि हैशेड पासवर्ड ठीक है (तो आपके पास नमक प्राप्त करने के लिए एक db पुनर्प्राप्ति है और हैशेड पासवर्ड की जाँच करने के लिए दूसरा db एक्सेस है)। आप उस मामले के बारे में सही हैं जहां आप एकल पुनर्प्राप्ति में नमक / हैशेड पासवर्ड डाउनलोड करते हैं और फिर क्लाइंट पर तुलना करते हैं। गलतफहमी के लिए खेद है।
आर सैमुअल क्लैत्को

11

PHP 5.5 के साथ (जो मैं वर्णन करता हूं वह पहले के संस्करणों के लिए भी उपलब्ध है, नीचे देखें) मैं अपने नए, अंतर्निहित समाधान का उपयोग करने के लिए सुझाव देना चाहता हूं: password_hash()और password_verify()। यह आपको आवश्यक पासवर्ड सुरक्षा के स्तर को प्राप्त करने के लिए कई विकल्प प्रदान करता है (उदाहरण के लिए $optionsसरणी के माध्यम से "लागत" पैरामीटर निर्दिष्ट करके )

<?php
var_dump(password_hash("my-secret-password", PASSWORD_DEFAULT));

$options = array(
    'cost' => 7, // this is the number of rounds for bcrypt
    // 'salt' => 'TphfsM82o1uEKlfP9vf1f', // you could specify a salt but it is not recommended
);
var_dump(password_hash("my-secret-password", PASSWORD_BCRYPT, $options));
?>

वापस होगा

string(60) "$2y$10$w2LxXdIcqJpD6idFTNn.eeZbKesdu5y41ksL22iI8C4/6EweI7OK."
string(60) "$2y$07$TphfsM82o1uEKlfP9vf1fOKohBqGVXOJEmnUtQu7Y1UMft1R4D3d."

जैसा कि आप देख सकते हैं, स्ट्रिंग में नमक के साथ-साथ लागत भी शामिल है जो विकल्पों में निर्दिष्ट की गई थी। इसमें प्रयुक्त एल्गोरिथ्म भी शामिल है।

इसलिए, पासवर्ड की जाँच करते समय (उदाहरण के लिए जब उपयोगकर्ता लॉग इन करता है), मानार्थ password_verify()फ़ंक्शन का उपयोग करते समय यह पासवर्ड हैश से आवश्यक क्रिप्टो मापदंडों को निकाल देगा।

जब नमक को निर्दिष्ट नहीं किया जाता है, तो उत्पन्न पासवर्ड हैश हर कॉल पर अलग होगा password_hash()क्योंकि नमक अनियमित रूप से उत्पन्न होता है। इसलिए एक नए उत्पन्न के साथ पिछले हैश की तुलना करना विफल होगा, यहां तक ​​कि एक सही पासवर्ड के लिए भी।

इस तरह काम करता है सत्यापन:

var_dump(password_verify("my-secret-password", '$2y$10$BjHJbMCNWIJq7xiAeyFaHOGaO0jjNoE11e0YAer6Zu01OZHN/gk6K'));
var_dump(password_verify("wrong-password", '$2y$10$BjHJbMCNWIJq7xiAeyFaHOGaO0jjNoE11e0YAer6Zu01OZHN/gk6K'));

var_dump(password_verify("my-secret-password", '$2y$07$TphfsM82o1uEKlfP9vf1fOKohBqGVXOJEmnUtQu7Y1UMft1R4D3d.'));
var_dump(password_verify("wrong-password", '$2y$07$TphfsM82o1uEKlfP9vf1fOKohBqGVXOJEmnUtQu7Y1UMft1R4D3d.'));

मुझे उम्मीद है कि इन अंतर्निहित कार्यों को प्रदान करने से डेटा चोरी के मामले में जल्द ही बेहतर पासवर्ड सुरक्षा मिलेगी, क्योंकि यह प्रोग्रामर के उचित कार्यान्वयन में लगाई जाने वाली सोच की मात्रा को कम करता है।

एक छोटी सी लाइब्रेरी (एक PHP फ़ाइल) है जो आपको PHP 5.5 password_hashको PHP 5.3.7+ में देगी: https://github.com/ircmaxell/password_compat


2
ज्यादातर मामलों में नमक पैरामीटर को छोड़ना बेहतर होता है। फ़ंक्शन ऑपरेटिंग सिस्टम के यादृच्छिक स्रोत से नमक बनाता है, बहुत कम संभावना है कि आप अपने दम पर एक बेहतर नमक प्रदान कर सकते हैं।
मार्टिंस्टेकली

1
यही मैंने लिखा है, मैंने नहीं किया? "यदि कोई नमक निर्दिष्ट नहीं किया गया है, तो यह बेतरतीब ढंग से उत्पन्न होता है, इस कारण से यह नमक निर्दिष्ट नहीं करना बेहतर होता है"
एकर

अधिकांश उदाहरण बताते हैं कि दोनों मापदंडों को कैसे जोड़ा जाए, यहां तक ​​कि जब नमक जोड़ने की सिफारिश नहीं की जाती है, तो मुझे आश्चर्य है कि क्यों? और ईमानदार होने के लिए, मैं कोड के पीछे केवल टिप्पणी पढ़ता हूं, अगली पंक्ति पर नहीं। वैसे भी, यह बेहतर नहीं होगा जब उदाहरण दिखाता है कि फ़ंक्शन का सबसे अच्छा उपयोग कैसे करें?
मार्टिंस्टेकली

आप सही हैं, मैं सहमत हूं। मैंने अपने उत्तर को तदनुसार बदल दिया है और लाइन के बारे में टिप्पणी की है। धन्यवाद
akirk

अगर मुझे सहेजा गया पासवर्ड और दर्ज किया गया पासवर्ड समान हैं, तो मुझे कैसे जांचना चाहिए? मैं उपयोग कर रहा हूं password_hash()और password_verifyकोई बात नहीं कि पासवर्ड (सही है या नहीं) मैंने सही पासवर्ड के साथ उपयोग किया है
ब्राउनमैन रिवाइवल

0

मेरे साथ ठीक है। मिस्टर एटवुड ने इंद्रधनुषी तालिकाओं के खिलाफ एमडी 5 की ताकत के बारे में लिखा था , और मूल रूप से लंबे नमक के साथ जैसे कि आप सुंदर बैठे हैं (हालांकि कुछ यादृच्छिक विराम चिह्न / संख्याएं, यह इसमें सुधार कर सकती हैं)।

आप SHA-1 को भी देख सकते हैं, जो इन दिनों अधिक लोकप्रिय हो रहा है।


6
मिस्टर एटवुड के पोस्ट के नीचे (लाल रंग में) एक प्रैक्टिस प्रैक्टिशनर के दूसरे पोस्ट से लिंक होता है जो बताता है कि एमडी 5, एसएचए 1 और पासवर्ड को स्टोर करने के लिए अन्य फास्ट हैश का उपयोग करना बहुत गलत है।
सिप्विज

2
@ मैथ्यू शार्ले: मैं सहमत नहीं हूं कि महंगे पासवर्ड हैशिंग एल्गोरिदम द्वारा लगाया गया अतिरिक्त प्रयास झूठी सुरक्षा है। यह आसानी से अनुमान लगाने वाले पासवर्डों की ब्रूट-फोर्सिंग के खिलाफ गार्ड है। यदि आप लॉगिन प्रयासों को सीमित कर रहे हैं, तो आप एक ही चीज़ के खिलाफ रक्षा कर रहे हैं (हालांकि थोड़ा और अधिक प्रभावी)। लेकिन अगर किसी विरोधी के पास डीबी संग्रहीत हैश तक पहुंच है, तो वह इस तरह के (आसानी से अनुमान लगाने योग्य) पासवर्डों को काफी तेज़ी से (आसानी से अनुमान लगाने योग्य पर निर्भर करता है) बल देने में सक्षम होगा। SHA-256 क्रिप्ट एल्गोरिथ्म के लिए डिफ़ॉल्ट 10000 राउंड है, जिससे यह 10000 गुना अधिक कठिन हो जाएगा।
इंशाअल्लाह

3
धीमी गति से चलने वाली हैश वास्तव में बहुत तेजी से एक बड़ी संख्या में पुनरावृति द्वारा बनाई जाती है, और प्रत्येक प्रवाह के बीच में डेटा को फेरबदल करती है। लक्ष्य यह सुनिश्चित करना है कि भले ही बुरे व्यक्ति को आपके पासवर्ड हैश की एक प्रति मिल जाए, लेकिन उसे आपके हैश के खिलाफ अपने शब्दकोश का परीक्षण करने के लिए सीपीयू समय की काफी मात्रा में जलाना होगा।
कैफे

4
@ caf: मेरा मानना ​​है कि ई-कॉमर्स एल्गोरिथ्म का शेड्यूलिंग एल्गोरिदम Eksblowfish प्रमुख शेड्यूलिंग के मापदंडों का उपयोग करता है; यह पूरी तरह से सुनिश्चित नहीं है कि यह कैसे काम करता है, लेकिन कुंजी समय-निर्धारण अक्सर एक बहुत ही महंगा ऑपरेशन होता है, जो किसी भी एन्क्रिप्शन को पूरा करने से पहले एक सिफर संदर्भ ऑब्जेक्ट के दौरान किया जाता है।
इंशाअल्लाह

3
इंशाल्लाह: यह सच है - bcrypt एल्गोरिथ्म एक अलग डिज़ाइन है, जहाँ अंतर्निहित crypto primitive एक hash फ़ंक्शन के बजाय एक ब्लॉक सिफर है। मैं PHK के MD5 क्रिप्ट () जैसी हैश फ़ंक्शंस पर आधारित योजनाओं का उल्लेख कर रहा था।
कैफे

0

मै जोडना चाहता हू:

  • लंबाई से उपयोगकर्ताओं के पासवर्ड को सीमित न करें

पुराने सिस्टम के साथ संगतता के लिए अक्सर पासवर्ड की अधिकतम लंबाई के लिए एक सीमा निर्धारित की जाती है। यह एक खराब सुरक्षा नीति है: यदि आप प्रतिबंध सेट करते हैं, तो इसे केवल पासवर्ड की न्यूनतम लंबाई के लिए सेट करें।

  • ईमेल के माध्यम से उपयोगकर्ता पासवर्ड न भेजें

भूल गए पासवर्ड को पुनर्प्राप्त करने के लिए आपको उस पते को भेजना चाहिए जिसके द्वारा उपयोगकर्ता पासवर्ड बदल सकता है।

  • यूजर्स पासवर्ड की हैश को अपडेट करें

पासवर्ड हैश पुराना हो सकता है (एल्गोरिथम के पैरामीटर अपडेट किए जा सकते हैं)। फ़ंक्शन का उपयोग करके password_needs_rehash()आप इसे देख सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.