2013-09-06 13 views
8

जानना मैं एक वेब अनुप्रयोग के लिए लॉगिन प्रणाली बना रहा हूं। डीबी में पासवर्ड स्टोर करने के लिए, मैं SHA256 का उपयोग कर के रूप में इस पासवर्ड एन्क्रिप्ट कर रहा हूँ:डीकोड हैश sha256 एन्क्रिप्शन, नमक

$salt ="sometext"; 
$escapedPW="userpass"; 
$saltedPW = $escapedPW . $salt; 
$hashedPW = hash('sha256', $saltedPW); 
echo "<center>".$hashedPW."</center>"; 

डेटाबेस में मैं उपयोगकर्ता, उपयोगकर्ता का पासवर्ड और हैश बनाने के लिए और उपयोगकर्ता के प्रवेश को मान्य करने के लिए इस्तेमाल नमक भंडारण कर रहा हूँ। अभी मैं उपयोगकर्ता को आपके पासवर्ड के साथ एक ईमेल भेजने की कार्यक्षमता कर रहा हूं, लेकिन जब उपयोगकर्ता ईमेल प्राप्त करता है, चूंकि sha256 एन्क्रिप्टेड पासवर्ड में संग्रहीत किया जाता है, तो उपयोगकर्ता को एक लंबी स्ट्रिंग प्राप्त होती है, न कि पासवर्ड जिसे उपयोगकर्ता माना जाता है जानना।

मेरा प्रश्न यह है कि मैं आपको वास्तविक उपयोगकर्ता पासवर्ड भेज सकता हूं और पासवर्ड एन्क्रिप्शन नहीं भेज सकता, यानी, अगर मुझे नमक पता है तो sha256 के विपरीत करने का कोई तरीका है? यदि संभव नहीं है, तो एन्क्रिप्शन कुंजी के विपरीत को पूरा करने और ईमेल में उपयोगकर्ता को वास्तविक पासवर्ड भेजने के लिए एन्क्रिप्शन की विधि की अनुशंसा की जाती है।

+7

हैश का पूरा बिंदु यह है कि आप मूल मान प्राप्त करने के लिए इसे उलट नहीं सकते हैं; न ही आपको उस उपयोगकर्ता को मूल पासवर्ड भेजना चाहिए जो इसे भूल गया है - आप उन्हें अपना पासवर्ड रीसेट करने के लिए एक बार, समय-सीमित लिंक भेजते हैं –

+1

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

+0

@Renan जरूरी नहीं है, उपयोगकर्ता डीबी में होना चाहिए, और पासवर्ड उपयोगकर्ता के व्यक्तिगत ईमेल पर भेजा जाता है। – franvergara66

उत्तर

7

जैसा कि आपके प्रश्न की टिप्पणियों में बताया गया है, हैश को उलटना वास्तव में एक विकल्प नहीं है।

हालांकि आप क्या कर सकते हैं, और यह वही है जो हर कोई करता है। आपके पंजीकरण कोड (उदा। Register.php) में जो आपके फॉर्म को पोस्ट करता है, वह PHP स्क्रिप्ट को ईमेल में पासवर्ड भेज सकता है और फिर इसे एन्क्रिप्ट कर सकता है और इसे डेटाबेस में संग्रहीत कर सकता है।

मुझे लगता है कि आपके पास किसी प्रकार का पंजीकरण फॉर्म है, और वह फॉर्म नए उपयोगकर्ताओं के विवरण को किसी अन्य (या एक ही) php स्क्रिप्ट पर पोस्ट करता है, है ना?

उदाहरण के लिए अगर मेरे प्रपत्र कहा <form method="post" action="register.php">

की तरह कुछ और register.php में मैं तो

<?php 
$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']); /*cleartext*/ 
$email = mysql_real_escape_string($_POST['email']); 

mail($email,"New account","Your username \"$username\" and your password is \"$password\""); 

$salt ="sometext"; 
$escapedPW="userpass"; 
$saltedPW = $escapedPW . $salt; 
$hashedPW = hash('sha256', $saltedPW); 

mysql_query("INSERT INTO users (username, password, email) VALUES ($username, $hashedPW, $email)") 

कुछ जैसे कुछ किसी न किसी उदाहरण कोड होगा। मुझे उम्मीद है यह मदद करेगा!

+0

अच्छा समाधान .. धन्यवाद – franvergara66

+0

खुशी मेरी सभी है :) –

1

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

आपको @Henrik द्वारा सुझाए गए एक साधारण हैश का उपयोग करना चाहिए। मानक समायोज्य-कार्य पासवर्ड का उपयोग करें केडीएफ (पीबीकेडीएफ 2, बीक्रिप्ट, स्क्रिप)

यदि आप PHP 5.5 का उपयोग कर सकते हैं, तो standard password hashing functions का उपयोग करें। ऐसे मेजबान हैं जो PHP 5.5 का समर्थन करते हैं, लेकिन आपको उनकी तलाश करनी है और इसके लिए पूछना है।

वेब पर कई जगहें हैं जो बताती हैं कि इसे सही तरीके से कैसे करें (उदा। https://wiki.mozilla.org/WebAppSec/Secure_Coding_Guidelines#Authentication) और कई लोग यह बताते हैं कि इसे गलत तरीके से कैसे किया जाए। अपनी खुद की प्रमाणीकरण प्रणाली को रोल करने का निर्णय लेने से पहले कृपया शोध करने के लिए कुछ समय दें।

+0

PHP 5.3.7 में https://github.com/ircmaxell/password_compat जोड़ना पहले से सोचा आसान है - शायद PHP 5.5 होस्ट पर जाने से कहीं अधिक आसान है। –

संबंधित मुद्दे