PDA

View Full Version : اینکریپت کردن کلمه عبور



ali2000_1358
شنبه 19 آبان 1386, 15:05 عصر
سلام دوستان من میخواستم بدونم چطور میشه یک کلمه عبور را اینکریپت کرده ودر زمانی که بخواهیم کلمه عبور رو مشاهده کنیم آنرا دوباره به حالت عادی نمایش بده
به عنوان مثال کلمه عبور tr123
در بانک یک چیز دیگری ذخیره کنه ودر هنگامی که ما میخواهیم همان tr123 رو نمایش بده

SabaSabouhi
شنبه 19 آبان 1386, 15:14 عصر
سلام دوستان من میخواستم بدونم چطور میشه یک کلمه عبور را اینکریپت کرده ودر زمانی که بخواهیم کلمه عبور رو مشاهده کنیم آنرا دوباره به حالت عادی نمایش بده
به عنوان مثال کلمه عبور tr123
در بانک یک چیز دیگری ذخیره کنه ودر هنگامی که ما میخواهیم همان tr123 رو نمایش بده

با سلام
کافیه یه تابع برگشت پذیر درست کنى که کلمه‌ى عبور را تبدیل به یک رشته‌ى دیگر کند.
اما تو هیچ سیستم به درد بخورى ندیدم که کلمه‌ى عبور قابل بازیافت باشد. تقریباً همه از توابع یک‌طرفه استفاده مى‌کنن. یعنى یک تابع به به ازاى یک کلمه‌ى عبور یک خروجى‌ همیش ثابت تولید مى‌کند اما از روى خروجى نمى‌توان ورودى را محاسبه کرد. یکى از این روش‌ها استفاده از CRC هست که به ازاى یک ورودى یک خروجى 16 یا 32 بیتى تولید مى‌کند ( این روش بیشتر براى داده‌ها استفاده مى‌شود ) و روش دیگر که بیشتر براى کلمه‌ى عبور استفاده مى‌شود روش Hash هست. که اگر جستجو کنى مطالب مربوط را پیدا مى‌کنى.

صبا صبوحى

mehdi.mousavi
یک شنبه 20 آبان 1386, 00:24 صبح
سلام دوستان من میخواستم بدونم چطور میشه یک کلمه عبور را اینکریپت کرده ودر زمانی که بخواهیم کلمه عبور رو مشاهده کنیم آنرا دوباره به حالت عادی نمایش بده به عنوان مثال کلمه عبور tr123 در بانک یک چیز دیگری ذخیره کنه ودر هنگامی که ما میخواهیم همان tr123 رو نمایش بده

سلام.
Encrypt کردن کلمات عبور کار مناسبی نیست، اگر چه بهتر از نگهداری اونها بصورت Clear هستش. اما واقعیت اینه که نه مدیر سیستم و نه کاربران، هرگر نیازی ندارن تا به کلمه عبور اصلی برسن. اجازه بدید با یه مثال منظورم رو بیان کنم. فرض کنید که کاربری کلمه عبور خودش رو به گفته شما tr123 گذاشته. این کلمه رو من بصورت XDF$#^ در بانک ذخیره میکنم، و برای این تبدیل از تابعی ریاضی استفاده کردم که بازگشت ناپذیره. به توابعی که ورودیهای باینری به طول دلخواه رو به خروجیهای باینری با طولهای کوچکتر و اندازه ثابت تبدیل می کنن، Hash Function یا تابع hash میگن. به خروجی هم Hash Value گفته میشه. در عمل، پیدا کردن دو ورودی متفاوت که باعث تولید خروجی یکسانی توسط تابع hash بشه، غیر ممکنه. (اگر چه مثال Mashiharu (http://www.mehdi.biz/blog/2007/06/gethashcode-vs-uniqueness.html)، نمونه نقضی برای این موضوع بود). بعبارت دیگه، شما نمیتونید یه ورودی دیگه به تابع hash بدید و همون خروجی ( XDF$#^) رو بگیرید.

این مساله به ما کمک میکنه تا بتونیم جاهایی که نیاز نداریم به ورودی اولیه برسیم، از Hash استفاده کنیم. یه نمونه بارز این مساله، کلمات عبور هستش. کاربر کلمه عبوری رو تعیین میکنه، ما اونو Hash میکنیم و در بانک نگه میداریم. هر وقت کاربر خواست Login کنه، ازش کلمه عبور رو میپرسیم. کلمه عبور وارد شده رو Hash میکنیم، و با مقدار ذخیره شده در بانک مقایسه میکنیم. اگر یکی بود، پس کاربر کلمه عبور رو درست وارد کرده.

اگر به System.Security.Cryptography Namespace رجوع کنید، کلاسی با نام HashAlgorithm میبینید که در واقع Base Class ای هستش برای کلاسهایی که با الگوریتمهای متفاوت می تونن Hash تولید کنن. این الگوریتمها عبارتند از MD5، MD160، SHA1، SHA256، SHA384 و SHA512. کلاسهای متانظر با این الگوریتمها هم در C# عبارتند از :


System.Security.Cryptography.MD5
System.Security.Cryptography.RIPEMD160
System.Security.Cryptography.SHA1
System.Security.Cryptography.SHA256
System.Security.Cryptography.SHA384
System.Security.Cryptography.SHA512


اما ممکنه بپرسید که اگه کاربر کلمه عبور رو فراموش کرد چی؟ در چنین حالتهایی، لینک Reset Password رو برای کاربر ارسال می کنن...

اما نکته آخر. بسیاری از برنامه نویسان کلمات عبور رو بروش فوق الذکر Hash و در بانکها ذخیره میکردن. ممکن بود دو کاربر کلمه LOVE رو بعنوان کلمه عبور خودشون انتخاب کنن، که طبیعتا Hash Value یکسانی داشت. وقتی بانک دست مهاجم می افتاد، مهاجم با روشها و Dictionary های متفاوتی که بعنوان ابزار در اختیار داشت، با نگاهی ساده به بانک متوجه فراوانی تکرار Hash Value ها میشد. مثلا، میدید کلمه XDF$#^ صد بار در بانک تکرار شده. اون میدونست که بیشترین تعداد کاربرها کلمه LOVE رو بعنوان کلمع عبور خودشون انتخاب میکنن، پس با چند تلاش ساده میدید که میتونه به سیستم Login کنه. اون یه Password رو در واقع پیدا کرده، اما صد کاربر ازین مساله متضرر شدن!

برای اینکه این اتفاق نیفته، گفتن که ازین به بعد یه رشته کاملا Random رو به کلمه عبور اضافه میکنیم، بعد کلمه جدید رو Hash میکنیم. (به اون رشته تصادفی Salt Value میگن). به این ترتیب اگر دو کاربر متفاوت کلمه عبور یکسانی هم داشته باشن، این مساله از دید مهاجم پنهان خواهد بود. کلاس RandomNumberGenerator نیز در C# به این منظور استفاده میشه.

نتیجه:
حتما از توابع Hash برای Hash نمودن کلمه عبور استفاده کنید و حتما کلمه عبور رو با Salt Value ترکیب کنید تا مشکلات فوق الذکر رخ نده.

hdv212
یک شنبه 20 آبان 1386, 01:11 صبح
اگه از sql server 2005 استفاده میکنی، راحت ترین راه اینه که توسط کد زیر اطلاعاتتو به صورت رمزنگاری شده در دیتابیس ذخیره کنی :

DECLARE @Password NVARCHAR(100)
SET @Password='MyStrongPassword_*&^g768$%'

INSERT EncTest VALUES(
EncryptByPassPhrase(@Password, '111-222-333-444'))

اینطوری هم میتونی از حالت رمز درش بیاری و نمایش بدی :

DECLARE @Password NVARCHAR(100)
SET @Password='MyStrongPassword_*&^g768$%'
SELECT CAST(DecryptByPassPhrase(@Password,CCNo) AS VARCHAR(MAX)) FROM EncTest

لازم به ذکره که فیلد CCNo، فیلدی هست که در جدول به صورت رمزشده در اومده.

ali2000_1358
شنبه 03 آذر 1386, 14:33 عصر
قبل از هر چیزی از شما دوستان تشکر می کنم
ولی دوست عزیز قسمت دوم Tsql که نوشتید اجرا نمی شود

ir_programmer
شنبه 03 آذر 1386, 14:56 عصر
این فایل رمز نگاری رو attach کردم.
این طرز استفادش:




Private Function EncryptStr(ByVal InputStr As String) As String


Dim KeyWord As String = "ir_programmer"

Crypto.Encoding = Crypto.EncodingType.HEX
Crypto.EncryptionAlgorithm = Crypto.Algorithm.RSA
Crypto.Key = KeyWord

If Crypto.EncryptString(InputStr) Then
Return Crypto.Content
Else
Return Crypto.CryptoException.Message
End If

End Function

Private Function DecryptStr(ByVal InputStr As String) As String

Dim keyWord As String = "ir_programmer"

Crypto.Encoding = Crypto.EncodingType.HEX
Crypto.EncryptionAlgorithm = Crypto.Algorithm.RSA
Crypto.Key = keyWord
Crypto.Content = InputStr
If Crypto.DecryptString Then
Return Crypto.Content
Else
Return Crypto.CryptoException.Message
End If

End Function

hassan razavi
سه شنبه 06 آذر 1386, 09:26 صبح
کدی که دوست عزیزمون ir_programer زحمتش و کشیدن رو تبدیل به کنترل کردم تا به راحتی در #C استفاده بشه. همراه با مثال میفرستم

babak23
سه شنبه 06 آذر 1386, 09:52 صبح
کد رمز شده در مورد بالا خیلی طولانی هست و در این مورد از کلید هم استفاده نشده

من این مورد را ترجیح میدم در ضمن در این لینک حتی میشه فایل را هم رمز کرد
http://barnamenevis.org/forum/showthread.php?t=85635&page=3

hassan razavi
سه شنبه 06 آذر 1386, 10:10 صبح
Dim keyWord As String = "ir_programmer"



دوست من هم از کلید استفاده شده و هم اینکه تنوع Encrypt کردنش هم زیاده فکر کنم 10 تا الگوریتم برا رمزنگاری داره.
هم کلید و هم نوع رمزنگاری به عنوان پارامتر در کتدهای Encryption و Dectription کنترلی که ساختم ارسال میشوند.

pourhabibi
سه شنبه 27 آذر 1386, 08:46 صبح
سلام.
Encrypt کردن کلمات عبور کار مناسبی نیست، اگر چه بهتر از نگهداری اونها بصورت Clear هستش. اما واقعیت اینه که نه مدیر سیستم و نه کاربران، هرگر نیازی ندارن تا به کلمه عبور اصلی برسن. اجازه بدید با یه مثال منظورم رو بیان کنم. فرض کنید که کاربری کلمه عبور خودش رو به گفته شما tr123 گذاشته. این کلمه رو من بصورت XDF$#^ در بانک ذخیره میکنم، و برای این تبدیل از تابعی ریاضی استفاده کردم که بازگشت ناپذیره. به توابعی که ورودیهای باینری به طول دلخواه رو به خروجیهای باینری با طولهای کوچکتر و اندازه ثابت تبدیل می کنن، Hash Function یا تابع hash میگن. به خروجی هم Hash Value گفته میشه. در عمل، پیدا کردن دو ورودی متفاوت که باعث تولید خروجی یکسانی توسط تابع hash بشه، غیر ممکنه. (اگر چه مثال Mashiharu (http://www.mehdi.biz/blog/2007/06/gethashcode-vs-uniqueness.html)، نمونه نقضی برای این موضوع بود). بعبارت دیگه، شما نمیتونید یه ورودی دیگه به تابع hash بدید و همون خروجی ( XDF$#^) رو بگیرید.

این مساله به ما کمک میکنه تا بتونیم جاهایی که نیاز نداریم به ورودی اولیه برسیم، از Hash استفاده کنیم. یه نمونه بارز این مساله، کلمات عبور هستش. کاربر کلمه عبوری رو تعیین میکنه، ما اونو Hash میکنیم و در بانک نگه میداریم. هر وقت کاربر خواست Login کنه، ازش کلمه عبور رو میپرسیم. کلمه عبور وارد شده رو Hash میکنیم، و با مقدار ذخیره شده در بانک مقایسه میکنیم. اگر یکی بود، پس کاربر کلمه عبور رو درست وارد کرده.

اگر به System.Security.Cryptography Namespace رجوع کنید، کلاسی با نام HashAlgorithm میبینید که در واقع Base Class ای هستش برای کلاسهایی که با الگوریتمهای متفاوت می تونن Hash تولید کنن. این الگوریتمها عبارتند از MD5، MD160، SHA1، SHA256، SHA384 و SHA512. کلاسهای متانظر با این الگوریتمها هم در C# عبارتند از :


System.Security.Cryptography.MD5
System.Security.Cryptography.RIPEMD160
System.Security.Cryptography.SHA1
System.Security.Cryptography.SHA256
System.Security.Cryptography.SHA384
System.Security.Cryptography.SHA512


اما ممکنه بپرسید که اگه کاربر کلمه عبور رو فراموش کرد چی؟ در چنین حالتهایی، لینک Reset Password رو برای کاربر ارسال می کنن...

اما نکته آخر. بسیاری از برنامه نویسان کلمات عبور رو بروش فوق الذکر Hash و در بانکها ذخیره میکردن. ممکن بود دو کاربر کلمه LOVE رو بعنوان کلمه عبور خودشون انتخاب کنن، که طبیعتا Hash Value یکسانی داشت. وقتی بانک دست مهاجم می افتاد، مهاجم با روشها و Dictionary های متفاوتی که بعنوان ابزار در اختیار داشت، با نگاهی ساده به بانک متوجه فراوانی تکرار Hash Value ها میشد. مثلا، میدید کلمه XDF$#^ صد بار در بانک تکرار شده. اون میدونست که بیشترین تعداد کاربرها کلمه LOVE رو بعنوان کلمع عبور خودشون انتخاب میکنن، پس با چند تلاش ساده میدید که میتونه به سیستم Login کنه. اون یه Password رو در واقع پیدا کرده، اما صد کاربر ازین مساله متضرر شدن!

برای اینکه این اتفاق نیفته، گفتن که ازین به بعد یه رشته کاملا Random رو به کلمه عبور اضافه میکنیم، بعد کلمه جدید رو Hash میکنیم. (به اون رشته تصادفی Salt Value میگن). به این ترتیب اگر دو کاربر متفاوت کلمه عبور یکسانی هم داشته باشن، این مساله از دید مهاجم پنهان خواهد بود. کلاس RandomNumberGenerator نیز در C# به این منظور استفاده میشه.

نتیجه:
حتما از توابع Hash برای Hash نمودن کلمه عبور استفاده کنید و حتما کلمه عبور رو با Salt Value ترکیب کنید تا مشکلات فوق الذکر رخ نده.



سلام
من برای رمزنگاری از توابع Hash استفاده می کنم و مشکل تشایه کلمات عبور رو دارم.
اگه بخوام اینطور که شما می گین از SaltValue به طور رندم استفاده کنم و Password رو با این SaltValue کد کنم، چه طوری در هنگام login کاربر به سایت دوباره همون Saltvalue رو تولید کنم؟ ( من از MD5 استفاده می کنم)
یا شایدم باید کار دیگه ای بکنم؟

pourhabibi
سه شنبه 27 آذر 1386, 13:32 عصر
سلام به همه
من خودم در جواب سوال قبلی خودم این لینک رو پیدا کردم . شاید به درد شمام بخوره. به نظر خودم که کدهای جالبی بودن :

http://www.obviex.com/samples/hash.aspx#Output

beh_develop
سه شنبه 27 آذر 1386, 13:41 عصر
شما می تونیم از تابع زیر استفاده کنین ، به این صورت که برای اولین بار که می خواین کلمه رمز را ذخیره کنین رشته وارد شده را به تابع زیر داده و مقدار برگشتی را در دیتا بیس ذخیره کنین ( اینم دقت کنین که طول آرایه 16 تا می باشد، و فیلد رمز عبور در دیتابیس binary با طول 16 تعریف کنین)
در دفعات بعد هنگامی که کاربر کلمه عبور را وارد کرد، بازهم با استفاده از تابع زیر آنرا Enrypt کنین و نتیجه را با مقدارای که در دیتابیس ذخیره کردین مقایسه کنین. (برای ذخیره کلمه عبور نیازی نیست از روش های رمزنگاری دوطرفه استفاده کنین)



private byte[] StringToMD5(string password)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
UTF8Encoding utf8 = new UTF8Encoding();
byte[] bytePass = new byte[16];
bytePass = md5.ComputeHash(utf8.GetBytes(password));
return bytePass;
}

Ali Mahabadi
سه شنبه 27 آذر 1386, 22:13 عصر
با کمال تشکر از ir_programmer

در مورد اینکه فایل های private.key , public.key کنار exe ایجاد می شه آیا این فایل ها قابل استفاده برای هکر ها هستند یا اینکه محتویات آنرا باید در داخل برنامه قرار دهیم ؟

اَرژنگ
چهارشنبه 28 آذر 1386, 05:05 صبح
به Membership یک نگاه بندازید

alirzn
چهارشنبه 28 آذر 1386, 07:24 صبح
آقا این خروجیش خیلی طولانی هست. من میخوام از این برای تولید serial number استفاده کنم. تابعی نیست که خروجیش خیلی کوتاه باشه؟


کدی که دوست عزیزمون ir_programer زحمتش و کشیدن رو تبدیل به کنترل کردم تا به راحتی در #C استفاده بشه. همراه با مثال میفرستم

babak23
چهارشنبه 28 آذر 1386, 07:44 صبح
آقا این خروجیش خیلی طولانی هست. من میخوام از این برای تولید serial number استفاده کنم. تابعی نیست که خروجیش خیلی کوتاه باشه؟



کد رمز شده در مورد بالا خیلی طولانی هست و در این مورد از کلید هم استفاده نشده
من این مورد را ترجیح میدم در ضمن در این لینک حتی میشه فایل را هم رمز کرد
http://barnamenevis.org/forum/showthread.php?t=85635&page=3


جواب
http://barnamenevis.org/forum/showthread.php?t=85635&page=3[/quote

seyedmostafa
یک شنبه 30 دی 1386, 08:32 صبح
میتونی از تابع gethashcode هم استفاده کنی

arman_bay2002
پنج شنبه 27 تیر 1387, 11:15 صبح
به آدرس زیر یه سر بزن
http://barnamenevis.org/forum/showthread.php?t=113861
بو حال کن

mahrokh_1121
چهارشنبه 12 اسفند 1388, 14:34 عصر
کدی که دوست عزیزمون ir_programer زحمتش و کشیدن رو تبدیل به کنترل کردم تا به راحتی در C#‎‎ استفاده بشه. همراه با مثال میفرستم


ممنون از لطفتون
من پسورد دیتا بیس ام رو با برنامه شما کد کردم
بعد برای DeCode کردنش تو برنامه خودم کد زدم
قبلش dll رو به برنامه ام اضافه کردم بعداون قسمت decrypet رو به صورت زیر نوشتم
البته من همیشه یه کلاس بنام Class_SQLConnection دارم که همیشه از اونجا به دیتا بیس وصل میشم...:



class Class_SQLConnection
{
public enum EncodingType
{HEX = 0,
BASE_64 = 1}
public enum Algorithm
{SHA1 = 0,
SHA256 = 1,
SHA384 = 2,
Rijndael = 3,
TripleDES = 4,
RSA = 5,
RC2 = 6,
DES = 7,
//DSA = 8
MD5 = 9,
RNG = 10,
//Base64 = 11
SHA512 = 12}
public static SqlConnection con;
public static void StrCon()
{con = new SqlConnection();
string s = Bills.Properties.Settings.Default.BillDBConnection String;
int index = s.IndexOf("Password=");
string str = s.Substring(0, index + 9);
string pwd = (s.Substring(index + 9, s.Length - index - 9));
CryptoCntrol.CryptCtrl cc = new CryptoCntrol.CryptCtrl();
string p = cc.DeCryption(pwd, "Hassan", (int)EncodingType.HEX, (int)Algorithm.RSA);
str += p;
con.ConnectionString = str;}}


ولی جواب نمیده...

فکر میکنم کار دیگه ایی باید انجام میدادم که جا افتاده...
لطفا راهنماییم کنید

Vahid_moghaddam
چهارشنبه 12 اسفند 1388, 15:06 عصر
سلام
من برای رمزنگاری از توابع Hash استفاده می کنم و مشکل تشایه کلمات عبور رو دارم.
اگه بخوام اینطور که شما می گین از SaltValue به طور رندم استفاده کنم و Password رو با این SaltValue کد کنم، چه طوری در هنگام login کاربر به سایت دوباره همون Saltvalue رو تولید کنم؟ ( من از MD5 استفاده می کنم)
یا شایدم باید کار دیگه ای بکنم؟

http://www.dotnetspider.com/resources/6149-Salted-MD-Encryption.aspx