আমি জাভাতে কীভাবে পাসওয়ার্ড হ্যাশ করতে পারি?


176

একটি ডাটাবেসে সঞ্চয় করার জন্য আমার পাসওয়ার্ড হ্যাশ করতে হবে। আমি জাভাতে এটি কীভাবে করতে পারি?

আমি সমতল পাঠ্য পাসওয়ার্ড নেওয়ার প্রত্যাশা করছিলাম, এলোমেলো লবণ যুক্ত করুন, তারপরে লবণ এবং হ্যাশ পাসওয়ার্ডটি ডাটাবেসে সংরক্ষণ করুন।

তারপরে কোনও ব্যবহারকারী লগ ইন করতে চাইলে আমি তাদের জমা দেওয়া পাসওয়ার্ড নিতে পারি, তাদের অ্যাকাউন্টের তথ্য থেকে এলোমেলো লবণ যোগ করতে পারি, হ্যাশ করে দেখতে পারি এবং এটি যদি তাদের অ্যাকাউন্টের তথ্যের সাথে সঞ্চিত হ্যাশ পাসওয়ার্ডের সাথে সমান হয়।


11
@ ওয়াইজিএল এটি আজকাল জিপিইউ আক্রমণগুলির তুলনায় এতটা স্বল্প সংস্থান নয়, এসএএএ পরিবার লবণের সাথে পাসওয়ার্ড হ্যাশিং (খুব দ্রুত) জন্য খুব খারাপ পছন্দ। Bcrypt, scrypt বা PBKDF2 ব্যবহার করুন
মেডান

11
কেন এই প্রশ্নটি বন্ধ ছিল? প্রকৃত প্রকৌশল সমস্যার জন্য এটি একটি প্রশ্ন এবং উত্তরগুলি অমূল্য। ওপি একটি লাইব্রেরি চাইছে না, তিনি ইঞ্জিনিয়ারিংয়ের সমস্যা কীভাবে সমাধান করবেন তা জিজ্ঞাসা করছেন।
stackoverflowuser2010

12
অসাধারণ. এই প্রশ্নের 52 টি upvotes আছে, এবং কেউ "অফ-টপিক" হিসাবে এটি বন্ধ করার সিদ্ধান্ত নিয়েছে।
stackoverflowuser2010

1
হ্যাঁ, আমি ক্লোজিংয়ের এই বিষয়টি সম্পর্কে আগে মেটাতে পোস্ট করেছি, যদিও খুব খারাপভাবে মারধর করা হয়েছে।
ক্রিস ডাট্রো

8
এই প্রশ্নটি আবার খোলা উচিত। একটি সংক্ষিপ্ত কোড সমাধান সহ বর্ণিত সমস্যার (পাসওয়ার্ড প্রমাণীকরণ) সমাধান করার জন্য একটি প্রোগ্রাম কীভাবে লিখবেন তা একটি প্রশ্ন। ট্রিগার শব্দটি "লাইব্রেরি" দেখলে রিফ্লেকসিভ কোনও প্রশ্ন বন্ধ করে দেওয়া ন্যায়সঙ্গত হয় না; তিনি একটি লাইব্রেরির সুপারিশ চাইছেন না, তিনি কীভাবে পাসওয়ার্ড হ্যাশ করবেন তা জিজ্ঞাসা করছেন। সম্পাদনা: সেখানে, এটি স্থির।
এরিকসন

উত্তর:


157

এটি করার জন্য আপনি জাভা রানটাইমে অন্তর্নির্মিত কোনও সুবিধা ব্যবহার করতে পারেন। জাভা 6-এ সানজেসিই পিবিকেডিএফ 2 সমর্থন করে যা পাসওয়ার্ড হ্যাশিংয়ের জন্য ব্যবহার করার জন্য একটি ভাল অ্যালগরিদম।

byte[] salt = new byte[16];
random.nextBytes(salt);
KeySpec spec = new PBEKeySpec("password".toCharArray(), salt, 65536, 128);
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] hash = f.generateSecret(spec).getEncoded();
Base64.Encoder enc = Base64.getEncoder();
System.out.printf("salt: %s%n", enc.encodeToString(salt));
System.out.printf("hash: %s%n", enc.encodeToString(hash));

এখানে একটি ইউটিলিটি ক্লাস যা আপনি পিবিকেডিএফ 2 পাসওয়ার্ড প্রমাণীকরণের জন্য ব্যবহার করতে পারেন:

import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Arrays;
import java.util.Base64;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;

/**
 * Hash passwords for storage, and test passwords against password tokens.
 * 
 * Instances of this class can be used concurrently by multiple threads.
 *  
 * @author erickson
 * @see <a href="http://stackoverflow.com/a/2861125/3474">StackOverflow</a>
 */
public final class PasswordAuthentication
{

  /**
   * Each token produced by this class uses this identifier as a prefix.
   */
  public static final String ID = "$31$";

  /**
   * The minimum recommended cost, used by default
   */
  public static final int DEFAULT_COST = 16;

  private static final String ALGORITHM = "PBKDF2WithHmacSHA1";

  private static final int SIZE = 128;

  private static final Pattern layout = Pattern.compile("\\$31\\$(\\d\\d?)\\$(.{43})");

  private final SecureRandom random;

  private final int cost;

  public PasswordAuthentication()
  {
    this(DEFAULT_COST);
  }

  /**
   * Create a password manager with a specified cost
   * 
   * @param cost the exponential computational cost of hashing a password, 0 to 30
   */
  public PasswordAuthentication(int cost)
  {
    iterations(cost); /* Validate cost */
    this.cost = cost;
    this.random = new SecureRandom();
  }

  private static int iterations(int cost)
  {
    if ((cost < 0) || (cost > 30))
      throw new IllegalArgumentException("cost: " + cost);
    return 1 << cost;
  }

  /**
   * Hash a password for storage.
   * 
   * @return a secure authentication token to be stored for later authentication 
   */
  public String hash(char[] password)
  {
    byte[] salt = new byte[SIZE / 8];
    random.nextBytes(salt);
    byte[] dk = pbkdf2(password, salt, 1 << cost);
    byte[] hash = new byte[salt.length + dk.length];
    System.arraycopy(salt, 0, hash, 0, salt.length);
    System.arraycopy(dk, 0, hash, salt.length, dk.length);
    Base64.Encoder enc = Base64.getUrlEncoder().withoutPadding();
    return ID + cost + '$' + enc.encodeToString(hash);
  }

  /**
   * Authenticate with a password and a stored password token.
   * 
   * @return true if the password and token match
   */
  public boolean authenticate(char[] password, String token)
  {
    Matcher m = layout.matcher(token);
    if (!m.matches())
      throw new IllegalArgumentException("Invalid token format");
    int iterations = iterations(Integer.parseInt(m.group(1)));
    byte[] hash = Base64.getUrlDecoder().decode(m.group(2));
    byte[] salt = Arrays.copyOfRange(hash, 0, SIZE / 8);
    byte[] check = pbkdf2(password, salt, iterations);
    int zero = 0;
    for (int idx = 0; idx < check.length; ++idx)
      zero |= hash[salt.length + idx] ^ check[idx];
    return zero == 0;
  }

  private static byte[] pbkdf2(char[] password, byte[] salt, int iterations)
  {
    KeySpec spec = new PBEKeySpec(password, salt, iterations, SIZE);
    try {
      SecretKeyFactory f = SecretKeyFactory.getInstance(ALGORITHM);
      return f.generateSecret(spec).getEncoded();
    }
    catch (NoSuchAlgorithmException ex) {
      throw new IllegalStateException("Missing algorithm: " + ALGORITHM, ex);
    }
    catch (InvalidKeySpecException ex) {
      throw new IllegalStateException("Invalid SecretKeyFactory", ex);
    }
  }

  /**
   * Hash a password in an immutable {@code String}. 
   * 
   * <p>Passwords should be stored in a {@code char[]} so that it can be filled 
   * with zeros after use instead of lingering on the heap and elsewhere.
   * 
   * @deprecated Use {@link #hash(char[])} instead
   */
  @Deprecated
  public String hash(String password)
  {
    return hash(password.toCharArray());
  }

  /**
   * Authenticate with a password in an immutable {@code String} and a stored 
   * password token. 
   * 
   * @deprecated Use {@link #authenticate(char[],String)} instead.
   * @see #hash(String)
   */
  @Deprecated
  public boolean authenticate(String password, String token)
  {
    return authenticate(password.toCharArray(), token);
  }

}

11
আপনি বেক্স থেকে হেক্স রূপান্তরগুলির সাথে কিছুটা সতর্ক হতে চাইতে পারেন BigInteger: শীর্ষস্থানীয় শূন্যগুলি সরানো হয়েছে। তাড়াতাড়ি ডিবাগ করার জন্য এটি ঠিক আছে, তবে আমি সেই ফলাফলের কারণে প্রোডাকশন কোডে বাগগুলি দেখেছি।
টমাস পর্নিন

24
@ থমাস-পর্নিন হাইলাইটগুলি কেন আমাদের প্রায় একটি লাইব্রেরি প্রয়োজন , কোড ব্লক নয় কেন । ভীতিজনক যে স্বীকৃত উত্তরটি এ জাতীয় গুরুত্বপূর্ণ বিষয়ে প্রশ্নের উত্তর দেয় না।
নীলজোর

9
জাভা 8 দিয়ে শুরু করে অ্যালগরিদম PBKDF2WithHmacSHA512 ব্যবহার করুন এটি কিছুটা শক্তিশালী।
iwan.z

1
নোট, বিদ্যমান algs পরে সংস্করণে মোছা নয়: java_4: PBEWithMD5AndDES, DESede, DES java_5 / 6/7: PBKDF2WithHmacSHA1, PBE, PBEWithSHA1AndRC2_40, PBEWithSHA1And, PBEWithMD5AndTriple java_8 (শুধুমাত্র জাভা 5): PBEWithHmacSHA224AndAES_128, PBEWithHmacSHA384AndAES_128, PBEWithHmacSHA512AndAES_128, RC4_40, PBKDF2WithHmacSHA256 , PBEWithHmacSHA1AndAES_128, RC4_128, PBKDF2WithHmacSHA224, PBEWithHmacSHA256AndAES_256, RC2_128, PBEWithHmacSHA224AndAES_256, PBEWithHmacSHA384AndAES_256, PBEWithHmacSHA512AndAES_256, PBKDF2WithHmacSHA512, PBEWithHmacSHA256AndAES_128, PBKDF2WithHmacSHA384, PBEWithHmacSHA1AndAES_256
iwan.z

4
@ দ্য টোস্টারস হ্যাঁ, ভুল পাসওয়ার্ডের জন্য মৃত্যুদন্ড কার্যকর করার সময়টি দীর্ঘতর হবে ; আরও সুনির্দিষ্টভাবে, ভুল পাসওয়ার্ডগুলি সঠিক পাসওয়ার্ড হিসাবে একই সময় নেবে। এটি সময়ের আক্রমণগুলি প্রতিরোধ করে , যদিও আমি স্বীকার করি যে আমি এই ক্ষেত্রে এই জাতীয় দুর্বলতা কাজে লাগানোর জন্য কোনও ব্যবহারিক উপায় সম্পর্কে ভাবতে পারি না। কিন্তু আপনি কোণ কাটা না। আমি এটি দেখতে পারছি না বলেই এর অর্থ এই নয় যে আরও বিভ্রান্ত মন হবে না।
এরিকসন

97

আপনি যা চান ঠিক তেমন দুটি পদ্ধতিতে সম্পূর্ণ বাস্তবায়ন এখানে রয়েছে :

String getSaltedHash(String password)
boolean checkPassword(String password, String stored)

মুল বক্তব্যটি হ'ল যদি কোনও আক্রমণকারী আপনার ডাটাবেস এবং উত্স কোড উভয়টিতে অ্যাক্সেস পান তবে পাসওয়ার্ডগুলি এখনও নিরাপদ।

import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.SecureRandom;
import org.apache.commons.codec.binary.Base64;

public class Password {
    // The higher the number of iterations the more 
    // expensive computing the hash is for us and
    // also for an attacker.
    private static final int iterations = 20*1000;
    private static final int saltLen = 32;
    private static final int desiredKeyLen = 256;

    /** Computes a salted PBKDF2 hash of given plaintext password
        suitable for storing in a database. 
        Empty passwords are not supported. */
    public static String getSaltedHash(String password) throws Exception {
        byte[] salt = SecureRandom.getInstance("SHA1PRNG").generateSeed(saltLen);
        // store the salt with the password
        return Base64.encodeBase64String(salt) + "$" + hash(password, salt);
    }

    /** Checks whether given plaintext password corresponds 
        to a stored salted hash of the password. */
    public static boolean check(String password, String stored) throws Exception{
        String[] saltAndHash = stored.split("\\$");
        if (saltAndHash.length != 2) {
            throw new IllegalStateException(
                "The stored password must have the form 'salt$hash'");
        }
        String hashOfInput = hash(password, Base64.decodeBase64(saltAndHash[0]));
        return hashOfInput.equals(saltAndHash[1]);
    }

    // using PBKDF2 from Sun, an alternative is https://github.com/wg/scrypt
    // cf. http://www.unlimitednovelty.com/2012/03/dont-use-bcrypt.html
    private static String hash(String password, byte[] salt) throws Exception {
        if (password == null || password.length() == 0)
            throw new IllegalArgumentException("Empty passwords are not supported.");
        SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        SecretKey key = f.generateSecret(new PBEKeySpec(
            password.toCharArray(), salt, iterations, desiredKeyLen));
        return Base64.encodeBase64String(key.getEncoded());
    }
}

আমরা সংরক্ষণ করছি 'salt$iterated_hash(password, salt)'। লবণ 32 এলোমেলো বাইট এবং এর উদ্দেশ্য হ'ল যদি দু'জন পৃথক লোক একই পাসওয়ার্ডটি বেছে নেয় তবে সঞ্চিত পাসওয়ার্ডগুলি এখনও আলাদা দেখায়।

iterated_hash, যা মূলত hash(hash(hash(... hash(password, salt) ...)))এটা খুবই একটি সম্ভাব্য আক্রমণকারীর অনুমান পাসওয়ার্ড, তাদের হ্যাশ আপনার ডাটাবেসের অ্যাক্সেস আছে জন্য ব্যয়বহুল করে তোলে, এবং ডাটাবেসের মধ্যে হ্যাশ আপ দেখুন। iterated_hashপ্রতিবার ব্যবহারকারী যখন লগইন করেন আপনাকে এটি গণনা করতে হবে, তবে আক্রমণকারীর তুলনায় এটি আপনার পক্ষে খুব বেশি খরচ করে না যারা তাদের সময়ের কম্পিউটিং হ্যাশগুলির প্রায় 100% ব্যয় করে।


14
নাগ করার জন্য দুঃখিত, তবে কেন আমি এটি একটি বিদ্যমান লাইব্রেরির উপরে বেছে নেব? কোনও গ্রন্থাগারের সম্ভবত পুরোপুরি পর্যালোচনা হওয়ার উচ্চতর সম্ভাবনা রয়েছে। আমি সন্দেহ করি যে 14 টি আপ-ভোটের প্রত্যেকটিই কোনও সমস্যার জন্য কোডটি বিশ্লেষণ করেছে।
জোছিম সউর

2
@ জোচিমসৌয়ার এটি মূলত কেবল একটি লাইব্রেরি (javax.crypto) ব্যবহার করছে তবে আপনি ঠিক বলেছেন - খালি পাসওয়ার্ড সমর্থিত নয়। এটি সুস্পষ্ট করতে একটি ব্যতিক্রম যুক্ত হয়েছে Added ধন্যবাদ!
মার্টিন কোনিসেক

3
আপনার সম্ভবত পদ্ধতিগুলির স্বাক্ষর char[] passwordপরিবর্তে পরিবর্তিত করা উচিত String password
Assylias

2
যদিও মনে হয় রেফারেন্স সর্বসম্মত চুক্তিটি পায় না। এটিও দেখুন: security.stackexchange.com/a/20369/12614
assylias

3
আপনি কি নিশ্চিত যে স্ট্রিংগুলিতে .aquals () সংক্ষিপ্ত সার্কিট নয় (যেমন: যখন দুটি বাইট সমান নয় তখন লুপিং বন্ধ করুন)? যদি এটি করে তবে একটি পাসওয়ার্ড হ্যাশ সম্পর্কিত তথ্য ফাঁস হওয়ার সময়সীমার ঝুঁকি রয়েছে।
ববপোকার্ট


7

আপনি ব্যবহার করতে পারেন শিরো লাইব্রেরির (পূর্বে JSecurity ) বাস্তবায়ন কি দ্বারা বর্ণিত হয় OWASP

দেখে মনে হচ্ছে জাসিপিটি লাইব্রেরির অনুরূপ উপযোগিতা রয়েছে


আমি যা ব্যবহার করছিলাম তা আসলে। তবে যেহেতু আমরা শিরো ব্যবহার না করার সিদ্ধান্ত নিয়েছি, কেবল একটি প্যাকেজের জন্য পুরো শিরো লাইব্রেরি অন্তর্ভুক্ত করার অদক্ষতা সম্পর্কে কিছুটা উদ্বেগ ছিল।
ক্রিস ডাট্রো

আমি কেবল একটি পাসওয়ার্ড হ্যাশিং ইউটিলিটি দিয়ে তৈরি একটি লাইব্রেরি জানি না। নির্ভরতা যদি উদ্বেগজনক হয় তবে আপনি সম্ভবত নিজের ঘূর্ণায়মান ভাল। এরিকসনের উত্তর আমার কাছে বেশ ভাল লাগছে। বা কেবলমাত্র OWASP লিংকটি থেকে কোডটি অনুলিপি করুন তবে আপনি যদি সুরক্ষিত উপায়ে SHA ব্যবহার করতে চান তবে।
ল্যাজ

7

আপনি ব্যবহার করে হ্যাশগুলি গণনা করতে পারেন MessageDigestতবে এটি সুরক্ষার দিক থেকে ভুল। পাসওয়ার্ডগুলি সংরক্ষণ করার জন্য হ্যাশগুলি ব্যবহার করা উচিত নয়, কারণ এগুলি সহজেই ব্রেকযোগ্য।

আপনার পাসওয়ার্ড সংরক্ষণ করতে আপনার আরেকটি অ্যালগরিদম যেমন bcrypt, PBKDF2 এবং স্ক্রিপ্ট ব্যবহার করা উচিত। এখানে দেখুন


3
আপনি কিভাবে ডাটাবেসে লবণ সংরক্ষণ না করে লগইনে পাসওয়ার্ডটি হ্যাশ করবেন?
জেডজেড কোডার

9
লবণ হিসাবে ব্যবহারকারীর নাম ব্যবহার করা মারাত্মক ত্রুটি নয়, তবে এটি কোনও ক্রিপ্টোগ্রাফিক আরএনজি থেকে লবণ ব্যবহার করার মতো খুব ভাল নেই। এবং ডেটাবেসে লবণ সংরক্ষণের কোনও সমস্যা নেই। নুন গোপন নয়।
এরিকসন

1
ব্যবহারকারীর নাম এবং ইমেলটি কি ডাটাবেসে সংরক্ষণ করা হবে না?
ক্রিস ডাট্রো

@ জেডজেড কোডার, @ জিক্সন সঠিক, আমি একরকম ধরে নিয়েছি যে এটি সমস্ত পাসওয়ার্ডের জন্য একটি লবণ হবে, এটি একটি সহজেই গণনাযোগ্য রেনবো টেবিলের দিকে নিয়ে যাবে।
বোজহো

13
লবণ হিসাবে ব্যবহারকারীর নাম (অথবা ইমেলের মতো অন্যান্য আইডি) ব্যবহার করার ক্ষেত্রে একটি সমস্যা হ'ল আপনি তখনও নতুন পাসওয়ার্ড সেট করে না রেখে আইডি পরিবর্তন করতে পারবেন না।
লরেন্স ডল

6

অন্যান্য উত্তরে উল্লিখিত বিসিআরপিট এবং পিবিকেডিএফ 2 ছাড়াও, আমি স্ক্রিপ্ট দেখার পরামর্শ দেব

MD5 এবং SHA-1 সুপারিশ করা হয় না কারণ তারা তুলনামূলকভাবে দ্রুত হয় "প্রতি ঘন্টা ভাড়া" বিতরণ করা কম্পিউটিং (উদাহরণস্বরূপ ইসি 2) বা একটি আধুনিক উচ্চ প্রান্তের জিপিইউ তুলনামূলকভাবে কম ব্যয় এবং যুক্তিসঙ্গত ব্রুট ফোর্স / অভিধান আক্রমণ ব্যবহার করে পাসওয়ার্ডগুলিকে "ক্র্যাক" করতে পারে সময়।

যদি আপনার এগুলি অবশ্যই ব্যবহার করা হয় তবে কমপক্ষে একটি পূর্বনির্ধারিত উল্লেখযোগ্য পরিমাণের (1000+) অ্যালগরিদমকে অন্তত পুনরাবৃত্তি করুন।


6

এরিকসনের সাথে সম্পূর্ণরূপে একমত যে পিবিকেডিএফ 2 এর উত্তর।

আপনার যদি সেই বিকল্প না থাকে বা কেবল একটি হ্যাশ ব্যবহার করা প্রয়োজন, অ্যাপাচি কমন্স ডাইজেস্ট ইউটিসগুলি সঠিকভাবে জেসিই কোড পাওয়ার চেয়ে সহজ: https://commons.apache.org/proper/commons-codec/apidocs/org/apache /commons/codec/digest/DigestUtils.html

যদি আপনি একটি হ্যাশ ব্যবহার করেন তবে sha256 বা sha512 সহ যান। পাসওয়ার্ড হ্যান্ডলিং এবং হ্যাশিং সম্পর্কে এই পৃষ্ঠায় ভাল সুপারিশ রয়েছে (নোট করুন এটি পাসওয়ার্ড হ্যান্ডলিংয়ের জন্য হ্যাশ করার পরামর্শ দেয় না): http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html


এটি লক্ষণীয় যে SHA512 SHA256 এর চেয়ে ভাল নয় (এই উদ্দেশ্যে) কেবল সংখ্যাটি বড়।
অ্যাজজি

5

আপনি ব্যবহার করতে পারে স্প্রিং সিকিউরিটি ক্রিপ্টো (শুধুমাত্র হয়েছে 2 ঐচ্ছিক কম্পাইল নির্ভরতা ), যা সমর্থন PBKDF2 , BCrypt , SCrypt এবং Argon2 পাসওয়ার্ড এনক্রিপশন।

Argon2PasswordEncoder argon2PasswordEncoder = new Argon2PasswordEncoder();
String aCryptedPassword = argon2PasswordEncoder.encode("password");
boolean passwordIsValid = argon2PasswordEncoder.matches("password", aCryptedPassword);
SCryptPasswordEncoder sCryptPasswordEncoder = new SCryptPasswordEncoder();
String sCryptedPassword = sCryptPasswordEncoder.encode("password");
boolean passwordIsValid = sCryptPasswordEncoder.matches("password", sCryptedPassword);
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
String bCryptedPassword = bCryptPasswordEncoder.encode("password");
boolean passwordIsValid = bCryptPasswordEncoder.matches("password", bCryptedPassword);
Pbkdf2PasswordEncoder pbkdf2PasswordEncoder = new Pbkdf2PasswordEncoder();
String pbkdf2CryptedPassword = pbkdf2PasswordEncoder.encode("password");
boolean passwordIsValid = pbkdf2PasswordEncoder.matches("password", pbkdf2CryptedPassword);

4

যদিও , NIST সুপারিশ PBKDF2 ইতিমধ্যে উল্লিখিত হয়েছে, আমি বাতলান করতে একটি সর্বজনীন ছিল চাই পাসওয়ার্ড হ্যাশ প্রতিযোগিতা যে 2013 থেকে 2015. শেষ পর্যন্ত পালিয়ে যায়, Argon2 প্রস্তাবিত পাসওয়ার্ড হ্যাশ ফাংশন হিসাবে মনোনীত হন।

মূল (নেটিভ সি) লাইব্রেরির জন্য আপনি ব্যবহার করতে পারেন এমন একটি মোটামুটি ভালভাবে গৃহীত জাভা বাইন্ডিং রয়েছে

গড় ব্যবহারের ক্ষেত্রে, আমি যদি মনে করি না আপনি যদি আরগোন ২ বা তদ্বিপরীত থেকে PBKDF2 বেছে নেন তবে এটি সুরক্ষার দৃষ্টিকোণ থেকে গুরুত্বপূর্ণ। আপনার যদি দৃ strong় সুরক্ষা প্রয়োজনীয়তা থাকে তবে আমি আপনার মূল্যায়নে আর্গন 2 বিবেচনা করার পরামর্শ দিচ্ছি।

পাসওয়ার্ড হ্যাশিং ফাংশনগুলির সুরক্ষা সম্পর্কিত আরও তথ্যের জন্য দেখুন সুরক্ষা . se ।


@ জাফ আমি উত্তরটি আরও উদ্দেশ্যসম্পন্ন বলে সম্পাদনা করেছি। দয়া করে সচেতন হন যে এনআইএসটি সুপারিশটি সর্বদা সেরা পছন্দ নাও হতে পারে ( উদাহরণ হিসাবে এখানে দেখুন ) - অবশ্যই এটি অন্য কোথাও প্রস্তাবিত যে কোনও ক্ষেত্রে অবশ্যই সত্য। সুতরাং আমি মনে করি এই উত্তরটি এই প্রশ্নের একটি মান সরবরাহ করে।
Qw3ry

2

MD5 হ্যাশিং এবং অন্যান্য হ্যাশ পদ্ধতির জন্য এখানে আপনার দুটি লিঙ্ক রয়েছে:

জাভাদোক এপিআই: https://docs.oracle.com/javase/1.5.0/docs/api/java/security/MessageDigest.html

টিউটোরিয়াল: http://www.twmacinta.com/myjava/fast_md5.php


3
কেবল মনে রাখবেন যে পাসওয়ার্ড হ্যাশিংয়ের জন্য, ধীরতর ভাল। আপনার একটি "কী শক্তিশালীকরণ" কৌশল হিসাবে হ্যাশ ফাংশনটির কয়েক হাজার পুনরাবৃত্তি ব্যবহার করা উচিত। এছাড়াও, লবণ অপরিহার্য।
এরিকসন

আমি এই ছাপের মধ্যে ছিলাম যে কোনও মানের হ্যাশিং অ্যালগরিদমের একাধিক পুনরাবৃত্তি এক পুনরাবৃত্তির মতো একই সুরক্ষা সম্পর্কে উত্পাদন করতে পারে যেহেতু বাইটগুলির দৈর্ঘ্য এখনও একই থাকবে?
ক্রিস ডাট্রো 21

@ এরিকসন স্পষ্টভাবে আক্রমণকারীদের ধীর করা ভাল।
ডিমোন

6
কী শক্তিশালীকরণ সম্পর্কে: প্রাক্পম্পিউটেড হ্যাশগুলি ব্যবহারযোগ্য না করার জন্য লবণ বিদ্যমান। তবে আক্রমণকারীদের প্রাক্কুট করতে হবে না। আক্রমণকারীরা ডানটি না পাওয়া পর্যন্ত "উড়ানের দিকে" কেবল স্ট্রিং + লবণ হ্যাশ করতে পারে। তবে আপনি যদি আপনার হ্যাশগুলির জন্য কয়েক হাজার বার পুনরাবৃত্তি করেন তবে তাদের একই কাজ করতে হবে। আপনার সার্ভারটি 10 ​​কে পুনরাবৃত্তির দ্বারা খুব বেশি প্রভাবিত হবে না কারণ এটি প্রায়শই ঘটে না। আক্রমণকারীদের 10k গুণ কম্পিউটিং পাওয়ার প্রয়োজন হবে।
জোকম্যান

2
@ সিমন আজ এমডি 5 পাসওয়ার্ড হ্যাশিংয়ের জন্য অকেজো হিসাবে বিবেচিত হয় কারণ এটি জিপিইউ ব্রুট ফোর্স / অভিধান আক্রমণ ব্যবহার করে কয়েক সেকেন্ডে ফাটল যায়। এখানে দেখুন: codahale.com/how-to-safely-store-a-password
মেডান

1

সমস্ত স্ট্যান্ডার্ড হ্যাশ স্কিমগুলির মধ্যে, এলডিএপি শশা ব্যবহারের জন্য সবচেয়ে সুরক্ষিত,

http://www.openldap.org/faq/data/cache/347.html

আমি কেবল সেখানে নির্দিষ্ট করা অ্যালগরিদমগুলি অনুসরণ করব এবং হ্যাশটি করতে বার্তাডিজাস্ট ব্যবহার করব।

আপনার পরামর্শ অনুযায়ী আপনার ডেটাবেজে লবণ সংরক্ষণ করতে হবে।


1
কারণ এসএসএইচএ হ্যাশ ফাংশনটি পুনরাবৃত্তি করে না, এটি খুব দ্রুত। এটি আক্রমণকারীদের আরও দ্রুত পাসওয়ার্ড চেষ্টা করার অনুমতি দেয়। Bcrypt, PBBKDF1, এবং PBKDF2 এর মতো আরও ভাল অ্যালগরিদম আক্রমণকারীদের ধীরে ধীরে "কী শক্তিশালীকরণ" কৌশল ব্যবহার করে যেখানে একটি পাসওয়ার্ডের মেয়াদ শেষ হওয়া উচিত যেখানে তারা একটি 8-অক্ষরের পাসওয়ার্ড স্পেসও চাপিয়ে দিতে পারে।
এরিকসন

এই সমস্ত প্রক্রিয়াটির সাথে সমস্যা হ'ল আপনি ক্লায়েন্ট সমর্থন পাবেন না। হ্যাশ পাসওয়ার্ডের সমস্যা হ'ল আপনি অন্য অ্যালগরিদমের সাহায্যে পাসওয়ার্ড হ্যাশ করতে পারবেন না। শশা সহ কমপক্ষে সমস্ত এলডিএপি ক্লায়েন্টরা এটি সমর্থন করে।
জেডজেড কোডার

এটি "সর্বাধিক সুরক্ষিত" নয় এটি নিছক "বেশ সামঞ্জস্যপূর্ণ"। bcrypt / scrypt হ'ল রিসোর্স ইনটেনসিভ।
উপস্থাপিত

1

2020 সালের হিসাবে, ব্যবহারে সবচেয়ে বিশ্বাসযোগ্য এবং নমনীয় অ্যালগরিদম,

যে কোনও হার্ডওয়ারের ফলে তার শক্তিটিকে সর্বোত্তম করার সম্ভাবনা সবচেয়ে বেশি,

হয় Argon2id বা Argon2i

এটি একটি টার্গেট হ্যাশিংয়ের সময় এবং ব্যবহৃত হার্ডওয়্যার প্রদত্ত অনুকূলিতকরণের শক্তি পরামিতিগুলি সন্ধান করার জন্য প্রয়োজনীয় ক্রমাঙ্কন সরঞ্জাম সরবরাহ করে।

  • আর্গন 2i মেমরি লোভী হ্যাশিংয়ে বিশেষীকরণ করেছে
  • আরগন 2 ডি সিপিইউ লোভী হ্যাশিংয়ে বিশেষজ্ঞ
  • Argon2id উভয় পদ্ধতি ব্যবহার করে।

স্মৃতি লোভী হ্যাশিং ক্র্যাকিংয়ের জন্য জিপিইউ ব্যবহারের বিরুদ্ধে সহায়তা করবে।

স্প্রিং সিকিউরিটি / বাউন্সি ক্যাসল বাস্তবায়ন অনুকূলিত হয় না এবং আক্রমণকারী কী ব্যবহার করতে পারে তা তুলনামূলকভাবে সপ্তাহে। সিএফ: বসন্তের ডকুমেন্টেশন

বর্তমানে প্রয়োগটি বাউন্সি দুর্গ ব্যবহার করে যা পাসওয়ার্ড ক্র্যাকাররা যে প্যারালালিজম / অপ্টিমাইজেশানগুলি কাজে লাগায় না তাই আক্রমণকারী এবং ডিফেন্ডারের মধ্যে অপ্রয়োজনীয় অসামঞ্জস্যতা রয়েছে।

জাভা ব্যবহারের জন্য সবচেয়ে বিশ্বাসযোগ্য বাস্তবায়ন হ'ল ম্যাকম্মেরারের এক,

মরচে লেখা সরকারী নেটিভ বাস্তবায়নের একটি মোড়কের জার / গ্রন্থাগার।

এটি ব্যবহারযোগ্যভাবে লিখিত এবং সহজ।

এম্বেড করা সংস্করণটি লিনাক্স, উইন্ডোজ এবং ওএসএক্সের জন্য দেশীয় বিল্ড সরবরাহ করে।

উদাহরণস্বরূপ, এটা তার মধ্যে jpmorganchase দ্বারা ব্যবহৃত হয় Tessera নিরাপদ করার জন্য ব্যবহৃত নিরাপত্তা প্রকল্পের কোরাম , তার Ethereum cryptocurency বাস্তবায়ন।

এখানে টেসেরা থেকে উদাহরণ কোড দেওয়া হয়েছে।

De.mkammerer.argon2 ব্যবহার করে ক্রমাঙ্কন সম্পাদন করা যেতে পারে rআর্গন 2 সহায়তা # সন্ধান

এসসিআরওয়াইপিটি এবং পিবিকেডিএফ 2 অ্যালগরিদমকে কিছু সাধারণ বেনমার্ক লিখেও ক্যালিব্রেট করা যেতে পারে তবে বর্তমান ন্যূনতম নিরাপদ পুনরাবৃত্তির মানগুলির জন্য উচ্চতর হ্যাশিং সময় প্রয়োজন হবে।


0

আমি উডেমির একটি ভিডিও থেকে ঝুঁকেছি এবং এলোমেলো পাসওয়ার্ডকে শক্তিশালী করতে সম্পাদনা করেছি

}

private String pass() {
        String passswet="1234567890zxcvbbnmasdfghjklop[iuytrtewq@#$%^&*" ;

        char icon1;
        char[] t=new char[20];

         int rand1=(int)(Math.random()*6)+38;//to make a random within the range of special characters

            icon1=passswet.charAt(rand1);//will produce char with a special character

        int i=0;
        while( i <11) {

             int rand=(int)(Math.random()*passswet.length());
             //notice (int) as the original value of Math>random() is double

             t[i] =passswet.charAt(rand);

             i++;
                t[10]=icon1;
//to replace the specified item with icon1
         }
        return new String(t);
}






}

আমি সংশোধন করার জন্য উন্মুক্ত, তবে আমি মনে করি হ্যাশ করার সময় আপনার এলোমেলো সংখ্যা ব্যবহার করা উচিত নয়। এটি আপনার হ্যাশ ফাংশনটি নির্ধারক থেকে যায়; যদি আপনি একাধিকবার স্ট্রিং হ্যাশ করেন তবে আপনি সেই স্ট্রিংয়ের জন্য সর্বদা একই হ্যাশ মান ফিরে পাবেন।
দুলদী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.