PDA

View Full Version : سوال: ذخیره کردن اطلاعات کلمه رمز ماژول پرداخت آنلاین، اس ام اس و... توی دیتابیس



idocsidocs
پنج شنبه 14 اردیبهشت 1391, 16:49 عصر
من بغیر از کلمه رمزی که کاربر برای لاگین به وب سایت استفاده می کنه برای کارهایی مثل ارسال اس ام اس، ماژول پرداخت آنلاین و.... هم باید از کاربر کلمه رمز دریافت کنم تا بتونم از وب سرویس ها استفاده کنم.

چطور می تونم برای این کلمات عبور امنیت ایجاد کنم؟

Hamid.RDN
پنج شنبه 14 اردیبهشت 1391, 17:04 عصر
اونها رو به صورت رمزنگاری شده (encrypted) ذخیره کنید و در موقع لزوم از رمزنگاری خارج (Decrypt) نمایید

idocsidocs
پنج شنبه 14 اردیبهشت 1391, 17:27 عصر
اونها رو به صورت رمزنگاری شده (encrypted) ذخیره کنید و در موقع لزوم از رمزنگاری خارج (Decrypt) نمایید


از چه توابعی باید استفاده کنم؟

از sha1 و md5 که نمی شه استفاده کرد. لطفا توضیح بدید.

reza10wert
پنج شنبه 14 اردیبهشت 1391, 17:51 عصر
از چه توابعی باید استفاده کنم؟

از sha1 و md5 که نمی شه استفاده کرد. لطفا توضیح بدید.
با دستورهای زیر


base64_encode();
base64_decode();

idocsidocs
پنج شنبه 14 اردیبهشت 1391, 18:18 عصر
توابع base64 که به راحتی دیکد می شن. راه بهتری سراغ ندارید؟

Hamid.RDN
پنج شنبه 14 اردیبهشت 1391, 19:48 عصر
از این دوتا تابع میتونی استفاده کنی


/**
* Encrypt using Mcrypt
* @access public
* @param string Data to encode
* @param string key to encode
* @return string
*/
function mcryptEncode($data, $key)
{
$init_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$init_vect = mcrypt_create_iv($init_size, MCRYPT_RAND);
return $init_vect.mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $init_vect);
}

/**
* Decrypt using Mcrypt
* @access public
* @param string Data to decode
* @param string Key to encode
* @return string
*/
function mcryptDecode($data, $key)
{
$init_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
if ($init_size > strlen($data))
return FALSE;
$init_vect = substr($data, 0, $init_size);
$data = substr($data, $init_size);
return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $init_vect), "\0");
}


اینم مثالش:

echo $enc_value = mcryptEncode('Hamid.RDN', 'VERYSECUREKEY');
echo '<br>';
echo mcryptDecode($enc_value, 'VERYSECUREKEY');

راجع به mcrypt هم تحقیق کن.

idocsidocs
پنج شنبه 14 اردیبهشت 1391, 20:38 عصر
راجع به mcrypt هم تحقیق کن.
آیا mcrypt بصورت پیش فرض روی همه سرورها اجرا می شه؟

Hamid.RDN
جمعه 15 اردیبهشت 1391, 12:46 عصر
در بیش از ۹۰٪ سرورها بله.
یک extension بسیار مهم و حیاطی است که از PHP ۵.۳ به صورت پیش فرض وجود داره و قابل استفاده است.
در PHP های قدیمیتر هم به دلیل پر استفاده بودن وجود خواهد داشت.

idocsidocs
جمعه 15 اردیبهشت 1391, 13:08 عصر
در بیش از ۹۰٪ سرورها بله.
اگر توی این سرورها تابع mcrypt رو فراخوانی کنم، آیا بدون ارور اجرا می شه یا باید این اکستنشن فقط توی سرور وجود داره و برای فعال کردنش باید از پشتیبان درخواست فعال شدن بدم؟

eshpilen
جمعه 15 اردیبهشت 1391, 16:06 عصر
اگر میخواید از رمزنگاری استفاده کنید توصیه میکنم از کتابخانهء phpseclib استفاده کنید.
این رو ببینید: آموزش استفادهء ساده از رمزنگاری متقارن (AES128-CBC) (http://barnamenevis.org/showthread.php?314829-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87%D8%A1-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%B1%D9%85%D8%B2%D9%86%DA%AF%D8%A7%D8%B1%DB%8C-%D9%85%D8%AA%D9%82%D8%A7%D8%B1%D9%86-%28AES128-CBC%29)
به این صورت دیگه نگران نسخهء PHP و نصب بودن اکستنشن هم نیستید.
ضمنا استفاده ازش راحتتره. دو جفت متد بهش اضافه کردم که کارها رو خیلی ساده میکنن. یک جفت برای رمزنگاری CBC که بصورت خودکار IV رو هم تولید میکنه، و یک جفت متد دیگه که علاوه بر رمزنگاری شامل HMAC هم میشه.

البته باید ببینید آیا اون چیزی که شما واقعا نیاز دارید رمزنگاری هست یا نه.
از رمزنگاری انتظار معجزه نداشته باشید.
بطور مثال وقتی شما کلید رمزنگاری رو در کد منبع یا هر جای دیگری در سمت سرور داشته باشید و هکر بتونه به اون کلید دست پیدا کنه طبیعتا رمزنگاری دیگه فایده ای نداره.
ولی یک مزیت رمزنگاری اینه که اگر دیتابیس هک بشه ولی هکر دسترسی به کد منبع پیدا نکرده باشه، امنیت اطلاعات به کلی از بین نمیره. البته این به شرطی هست که خود کلید هم در دیتابیس هک شده ذخیره نشده باشه.

اصلا سوالی هم که شما پرسیدید مقداری مبهم و بیش از حد مختصر هست.
اون کلمهء رمز کاربران چیه دقیقا؟ خودشون یک پسورد انتخاب میکنن یا از جای دیگری میارن؟ اون پسورد دقیقا برای چی و کجا و چه وقت و چرا بکار میره؟ آیا اون رو در دیتابیس ذخیره میکنید؟ آیا مجبور به ذخیرهء اون هستید؟ سایتهای دیگه چطور عمل میکن؟ سرویس مشابهی با مال شما دارن؟ ...

idocsidocs
جمعه 15 اردیبهشت 1391, 17:17 عصر
ا
اصلا سوالی هم که شما پرسیدید مقداری مبهم و بیش از حد مختصر هست.
اون کلمهء رمز کاربران چیه دقیقا؟ خودشون یک پسورد انتخاب میکنن یا از جای دیگری میارن؟ اون پسورد دقیقا برای چی و کجا و چه وقت و چرا بکار میره؟ آیا اون رو در دیتابیس ذخیره میکنید؟ آیا مجبور به ذخیرهء اون هستید؟ سایتهای دیگه چطور عمل میکن؟ سرویس مشابهی با مال شما دارن؟ ...
فرض کنید توی سایتتون قابلیت ارسال اس ام اس دارید.

در این صورت باید کلمه کاربری و کلمه رمزی که به مدیر سایت دادن رو توی دیتابیس نگهداری کنید تا هروقت خواستید اس ام اس بفرستید، بتونید به راحتی کلمه رمز و کلمه کاربری رو از دیتابیس بخونید و اس ام اس رو بفرستید.

برای این کار، آیا نیازی به هش کردن کلمه رمز هست یا نه؟

موارد زیاد دیگه ای هم وجود داره، مثل ارسال ایمیل توسط جیمیل که باید اطلاعات ایمیل رو از کاربر بگیریم، پرداخت آنلاین، سیستم های پستی مثل فروتل و....

eshpilen
جمعه 15 اردیبهشت 1391, 22:11 عصر
بنظر بنده سپردن پسورد ایمیل و غیره به سایتهای دیگر اصلا معقول نیست و از نظر Privacy و امنیت نمیشه توجیهش کرد.
خیلی مسخرس این همه همینطوریش امنیت خدشه داره و کلی نکته و ترفند و احتیاط باید بکار برد برای حفظ امنیت و حیطهء خصوصی، اونوقت این رویه باب بشه که ملت بیان به سایتها و افراد دیگر هم مشخصات و پسوردهای خودشون رو بدن.

همون یک سایت ایمیل که آدم توش ثبت نام میکنه مثل یاهو بنظر من باید پسورد همونجا باشه و همونجا وارد بشه و بس. ضرورتی نمیبینم بخوایم همهء سرویسها و پسوردهایی رو که داریم متمرکز بکنیم در یک سایت دیگه که معلوم نیست کیا بهش دسترسی دارن و چقدر اصولی طراحی شده و چقدر امنیت داره. اصولا ذخیرهء اصل این همه پسورد در یک جا از نظر امنیتی نادرسته و راه بقدر کافی امنی نداره.

آیا سایت شما لزوما از HTTPS استفاده میکنه؟ آیا خود شما قابل اعتماد هستید؟ آیا اعتبار و مهارت برنامه نویسی شما اونقدری زیاده که بتونید با امنیت سایتهای معروف برابری بکنید؟ آیا سرور و هاست شما امنیت کافی داره؟ آیا افراد دیگری نمیتونن هیچوقت بهش دسترسی پیدا کنن؟ ضمنا کدام سایتهای معتبر و معروف و جهانی نظیر چنین کاری رو انجام میدن؟

ذخیره پسورد اونم پسورد اکانتهای سرویسهای مختلف در یک همچین سایت و زیر دست آدمهای دیگه کار درستی نیست بنظر بنده. از نظر امنیتی کاملا نامعقوله و با این همه توصیه مکرر متخصصان و تجربه های امنیتی در تضاده.

و رواج دادن چنین روشهایی هم درست نیست و درواقع از بین امنیت و اصول پایه و وادار کردن مردم به ارتکاب و عادت به حماقت و ساده لوحی است.

eshpilen
جمعه 15 اردیبهشت 1391, 22:15 عصر
اونم که شما پرداخت آنلاین میکنید میره توی سایت صاحب اون اطلاعات و پرداخت صورت میگیره. هیچوقت نباید این اطلاعات از طریق سایت دیگری منتقل بشه یا بدتر اینکه در جای دیگری ذخیره بشه.

حالا بعضی چیزها شاید اینقدر حساس نباشه یا محدود به یکی دو نفر و مالک/مدیر خود سایت باشه و این حرفا شاید بحث دیگری باشه. ولی یه چیزی مثل مشخصات ورود به ایمیل های شخصی و پرداخت آنلاین کارت بانکی رو که نباید آنلاین ذخیره کرد جای دیگری و حتی نباید در هیچ کجا غیر از سایت اصلی (بانک) وارد کرد. کلا نباید کاربران رو مجبور به این کار کرد، و اصلا نباید حتی ترغیب به این کار کرد، چون برخلاف تمام اصول امنیتی و سیاسی و غیره هست. جز از بین بردن امنیت و Privacy عمومی و رواج حماقت و اهمال چیزی نیست. کاربران رو به این کارها عادت ندید! منکه در هیچ سایت و منبع معتبری چنین چیزی رو ندیدم و نخوندم تاحالا.

idocsidocs
جمعه 15 اردیبهشت 1391, 22:47 عصر
و رواج حماقت و اهمال چیزی نیست. کاربران رو به این کارها عادت ندید!
یکم زیاده روی نشده بنظرتون؟

اگر کلمه رمز رو نگه داری نکنیم، چطور می شه از طریق جی میل، ایمیل بفرستیم؟

الان من یه ماژول پرداخت آنلاین برای فروتل نوشتم، برای استفاده از این وب سرویس، حتما باید کلمه رمز رو توی کدها قرار داد تا بشه از خدماتشون استفاده کرد !

eshpilen
شنبه 16 اردیبهشت 1391, 00:27 صبح
یکم زیاده روی نشده بنظرتون؟

بطور عمومی خیر.
یعنی اینکه کاربران عادی و ناشناس بیان پسوردهاشون رو بدن به یک سایت دیگه، این خلاف تمام دانش و بینش امنیتی ای هست که بنده در طی سالها دیدم و بهش رسیدم.
دلایلش هم فکر میکنم واضح باشه و هرکسی با منطق خودش هم میتونه راحت بفهمه. لزوما نیازی به دانش امنیتی گسترده نیست.


اگر کلمه رمز رو نگه داری نکنیم، چطور می شه از طریق جی میل، ایمیل بفرستیم؟مگه من نوعی مجبورم پسورد جیمیل خودم رو بدم به سایت شما تا شما ایمیلم رو واسم چک کنید یا برام ایمیل بفرستید؟!


الان من یه ماژول پرداخت آنلاین برای فروتل نوشتم، برای استفاده از این وب سرویس، حتما باید کلمه رمز رو توی کدها قرار داد تا بشه از خدماتشون استفاده کرد !
من نمیدونم جریان این فروتل چیه. تاحالا کار و مطالعه ای نداشتم درموردش.
شاید هدف اونا موارد خاصی بوده و شرایط و محدودیت های خاصی داره. شاید هم نه. و شاید اشتباه طراحی کردن. شاید بی مسئولیت بودن. شاید سواد نداشتن. شاید اهداف سوء داشتن. شاید خودخواه بودن و دنبال سود و جلب مشترک تا مسائل امنیتی و کار اصولی و مطابق استانداردهای صحیح.
مگر وجود این سیستم به فرض اینکه اینطور باشه که شما میگی و مجبور باشی حتما این کار رو بکنی سند میشه برای اثبات درستی این کار؟
یک مورد سایت و منبع معتبر خارجی اگر تونستی پیدا کنی که چنین کاری بکنه یا این مشی رو تایید بکنه بگو.
چرا اینها به روشی که بانکهای دیگه عمل میکنن عمل نمیکنن؟ چه اشکالی داشته؟
ایرانیها هم که در مسائل امنیتی و رعایت Privacy و اینها نه سابقه ای دارن و نه سواد و بینش خاصی. نه تحقیق و تحلیل تخصصی خاصی و نه قانون و استانداردی بر این اساس.
این فروتل جزییاتش رو بنده نمیدونم. شاید اهمیت کمتری داره و مثلا سقف اعتبارش و میزان خرید روزانه محدودیت قابل توجه داره. بهرحال گفتم که این مسئله رو بنظر بنده نمیشه به هیچ وجه عمومی کرد و تعمیم داد به چیزهایی مثل ایمیل شخصی و کارتهای بانکی و امثالهم.
نکنه این فروتل هم خودش اطلاعات کارت های بانکی دیگر رو میگیره و از جانب شما خرید میکنه؟ اینطوری که دیگه وضع بدتر میشه، چون بجای اعتماد و اتکا به یک سایت و افراد بیگانه بحث دو سایت و افراد بیگانه مطرح میشه برای کاربر بیچاره!!

البته شما با مسئولیت خودت میتونی بصورت شخصی این کار رو بکنی. یعنی بعنوان مالک یا مدیر سایت و فقط نسبت به حساب و اکانت به نام خودت، ولی این درست نیست که کاربر پسورد ایمیل شخصی خودش رو بده به سایت شما. و این درست نیست که اگر کارت بانکی یا سیستم اعتبار مالی مجازی شخصی داره بیاد و پسورد اون رو بده به سایت دیگری و اون سایت دیگر براش خرید کنه یا هر کار دیگری؛ ذخیرهء چنین اطلاعاتی روی یک وب سرور از نظر فنی هم دارای مشکل امنیتی جدی هست که تا اینجا راهی برای برطرف کردنش بنظرم نمیرسه (حداقل نه یک راه عمومی و راحت و قاطع).

idocsidocs
شنبه 16 اردیبهشت 1391, 01:16 صبح
مگه من نوعی مجبورم پسورد جیمیل خودم رو بدم به سایت شما تا شما ایمیلم رو واسم چک کنید یا برام ایمیل بفرستید؟!

این کار فقط برای مدیر سایت انجام می شه. اگر می شد بدون کلمه رمز ارسال کرد که مشکلی نبود.


فرض کنید می خواید یه سیستم خبرنامه راه اندازی کنید و هاست اشتراکی دارید و این هاست اجازه نمی ده شما در روز بیشتر از 100 ایمیل بفرستید، در این مورد راهی غیر از استفاده از جیمیل براتون باقی می مونه؟

فروتل هم فعلا این کار رو می کنه.

سایتهایی که اس ام اس اجاره می دن هم همین کار رو می کنن.

و باید برای این موارد کلمه رمز رو از کاربر گرفت و توی دیتابیس ذخیره کرد.

eshpilen
شنبه 16 اردیبهشت 1391, 08:11 صبح
این کار فقط برای مدیر سایت انجام می شه. اگر می شد بدون کلمه رمز ارسال کرد که مشکلی نبود.

فرض کنید می خواید یه سیستم خبرنامه راه اندازی کنید و هاست اشتراکی دارید و این هاست اجازه نمی ده شما در روز بیشتر از 100 ایمیل بفرستید، در این مورد راهی غیر از استفاده از جیمیل براتون باقی می مونه؟

خب اگر محدود به مدیر سایت بشه حداقل بخشی از مشکل امنیتی مرتفع میشه. چون دیگه بحث این نیست که یکی بیاد اطلاعات ورود ایمیلش رو به سایت و افراد دیگری بده.


فروتل هم فعلا این کار رو می کنه.یعنی اطلاعات کارت بانکی شما رو میگیره و از جانب شما خرید میکنه؟
خب چرا خودتون مستقیما از API بانکها استفاده نمیکنید؟


سایتهایی که اس ام اس اجاره می دن هم همین کار رو می کنن.

و باید برای این موارد کلمه رمز رو از کاربر گرفت و توی دیتابیس ذخیره کرد. اس ام اس و اینها رو نمیدونم. ولی فکر میکنم بدیهی باشه که آدم نباید اطلاعات ورود به ایمیل یا حساب بانکی خودش رو به سایت و اشخاص دیگری بده. ذخیرهء چنین اطلاعات حساسی بصورت آنلاین هم مسلما ریسک امنیتی افزوده داره. بخصوص که شیرهاست باشه.

idocsidocs
شنبه 16 اردیبهشت 1391, 11:34 صبح
اس ام اس و اینها رو نمیدونم. ولی فکر میکنم بدیهی باشه که آدم نباید اطلاعات ورود به ایمیل یا حساب بانکی خودش رو به سایت و اشخاص دیگری بده. ذخیرهء چنین اطلاعات حساسی بصورت آنلاین هم مسلما ریسک امنیتی افزوده داره. بخصوص که شیرهاست باشه.
بحث داره از مسیر اصلی خارج می شه

به هر صورت (خوب یا بد) باید کلمات رمز رو توی دیتابیس ذخیره کنم.

چه راهی برای بالا بردن امنیت کلمات عبور پیشنهاد می کنید؟