مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

dib

عضویت از 1395/04/07

هش کردن پسورد با RSA

  • دوشنبه 6 دی 1395
  • 10:08
تشکر میکنم

برای هش کردن پسورد دریافتی از کاربر برای ذخیره در دیتابیس و یا بازیابی پسورد از دیتابیس جهت ورود کاربر می خواهم از RSA و کلید 2048 بیتی استفاده کنم.
ممکنه راهنمایی کنید چطور می تونم این کارو کنم؟

پاسخ های این پرسش

تعداد پاسخ ها : 10 پاسخ
کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • دوشنبه 6 دی 1395
  • 10:13

من تا حالا با RSA کار نکردم و از کد زیر استفاده میکنم

/* =======================
 * HASHED PASSWORD FORMATS
 * =======================
 * 
 * Version 3:
 * PBKDF2 with HMAC-SHA256, 128-bit salt, 256-bit subkey, 10000 iterations.
 * Format: { 0x01, prf (UInt32), iter count (UInt32), salt length (UInt32), salt, subkey }
 * (All UInt32s are stored big-endian.)
 */

public string HashPassword(string password)
{
    var prf = KeyDerivationPrf.HMACSHA256;
    var rng = RandomNumberGenerator.Create();
    const int iterCount = 10000;
    const int saltSize = 128 / 8;
    const int numBytesRequested = 256 / 8;

    // Produce a version 3 (see comment above) text hash.
    var salt = new byte[saltSize];
    rng.GetBytes(salt);
    var subkey = KeyDerivation.Pbkdf2(password, salt, prf, iterCount, numBytesRequested);

    var outputBytes = new byte[13 + salt.Length + subkey.Length];
    outputBytes[0] = 0x01; // format marker
    WriteNetworkByteOrder(outputBytes, 1, (uint)prf);
    WriteNetworkByteOrder(outputBytes, 5, iterCount);
    WriteNetworkByteOrder(outputBytes, 9, saltSize);
    Buffer.BlockCopy(salt, 0, outputBytes, 13, salt.Length);
    Buffer.BlockCopy(subkey, 0, outputBytes, 13 + saltSize, subkey.Length);
    return Convert.ToBase64String(outputBytes);
}

public bool VerifyHashedPassword(string hashedPassword, string providedPassword)
{
    var decodedHashedPassword = Convert.FromBase64String(hashedPassword);

    // Wrong version
    if (decodedHashedPassword[0] != 0x01)
        return false;

    // Read header information
    var prf = (KeyDerivationPrf)ReadNetworkByteOrder(decodedHashedPassword, 1);
    var iterCount = (int)ReadNetworkByteOrder(decodedHashedPassword, 5);
    var saltLength = (int)ReadNetworkByteOrder(decodedHashedPassword, 9);

    // Read the salt: must be >= 128 bits
    if (saltLength < 128 / 8)
    {
        return false;
    }
    var salt = new byte[saltLength];
    Buffer.BlockCopy(decodedHashedPassword, 13, salt, 0, salt.Length);

    // Read the subkey (the rest of the payload): must be >= 128 bits
    var subkeyLength = decodedHashedPassword.Length - 13 - salt.Length;
    if (subkeyLength < 128 / 8)
    {
        return false;
    }
    var expectedSubkey = new byte[subkeyLength];
    Buffer.BlockCopy(decodedHashedPassword, 13 + salt.Length, expectedSubkey, 0, expectedSubkey.Length);

    // Hash the incoming password and verify it
    var actualSubkey = KeyDerivation.Pbkdf2(providedPassword, salt, prf, iterCount, subkeyLength);
    return actualSubkey.SequenceEqual(expectedSubkey);
}

private static void WriteNetworkByteOrder(byte[] buffer, int offset, uint value)
{
    buffer[offset + 0] = (byte)(value >> 24);
    buffer[offset + 1] = (byte)(value >> 16);
    buffer[offset + 2] = (byte)(value >> 8);
    buffer[offset + 3] = (byte)(value >> 0);
}

private static uint ReadNetworkByteOrder(byte[] buffer, int offset)
{
    return ((uint)(buffer[offset + 0]) << 24)
        | ((uint)(buffer[offset + 1]) << 16)
        | ((uint)(buffer[offset + 2]) << 8)
        | ((uint)(buffer[offset + 3]));
}

کاربر سایت

sg.programmer

عضویت از 1393/06/30

  • دوشنبه 6 دی 1395
  • 22:43

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

همچنین اگه ممکنه کد از هش در آوردن اش را هم بگید.

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • سه شنبه 7 دی 1395
  • 09:36

عنوان متد ا کاملا مشخص هست

شما نمیتونید از Hash در بیارید ر واقع هش غیر قابل بازگشت است و برای مقایسه مقدار دوم هش شده و با مقدار قبلی مقایسه خواهد شد

کاربر سایت

محمد قاری

عضویت از 1395/02/07

  • سه شنبه 7 دی 1395
  • 21:25

سلام

مهندس ای KeyDerivation  چکار میکنه ؟

برای من نمیشناستش.

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 8 دی 1395
  • 08:17

باید یک متد باید

شاید نیاز به using داشته باشه

انتخابش کنید ، باید یک دستگیره کنارش بیاد و بعد فضای نامش را using کنید

کاربر سایت

محمد قاری

عضویت از 1395/02/07

  • چهارشنبه 8 دی 1395
  • 11:37

دستگیره نمیاد

does not exist in the current context

میده فقط

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 8 دی 1395
  • 12:16
static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt)
{
  HashAlgorithm algorithm = new SHA256Managed();

  byte[] plainTextWithSaltBytes = 
    new byte[plainText.Length + salt.Length];

  for (int i = 0; i < plainText.Length; i++)
  {
    plainTextWithSaltBytes[i] = plainText[i];
  }
  for (int i = 0; i < salt.Length; i++)
  {
    plainTextWithSaltBytes[plainText.Length + i] = salt[i];
  }

  return algorithm.ComputeHash(plainTextWithSaltBytes);            
}

کاربر سایت

محمد قاری

عضویت از 1395/02/07

  • چهارشنبه 8 دی 1395
  • 12:21

مهندس میشه بفرمایید این چیه ؟

کجا استفاده کنم اینو؟

کاربر سایت

dib

عضویت از 1395/04/07

  • چهارشنبه 8 دی 1395
  • 12:34

من الگوريتم rsa و پيدا كردم فقط تنها كاري مونده ذخيره كليد عمومي در كلاينت سمت كاربره با كمك جاوااسكريپت تا هر بار موقع ورود رمزعبور و انكريپت كنه و بفرسته تا درستيش چك بشه، ميتونين كمكي يا راهنمايي كنيد از نحوه ذخيره اطلاعات روي كلاينت سمت كاربر؟

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 8 دی 1395
  • 12:39

متاسفانه تجربه ای در این ضمینه ندارم

چون نا امن هست و کلید نباید سمت کلاینت ذخیره بشه

اگر کاربر بهش دسترسی پیدا کنه همه چی تمومه

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)