SORU
3 EYLÜL 2008, ÇARŞAMBA


Nasıl alfa-sayısal rasgele bir dize oluşturmak için?

Bir arıyordumbasitJava rasgele alfa sayısal bir dize oluşturmak için kullanılan algoritma. Benim durumda benzersiz bir oturum olarak kullanılabilir/anahtar "ile 500 bin nesil (ihtiyaçlarımı gerçekten her şey çok daha karmaşık gerektirmez. benzersiz olması" muhtemel ki bu tanımlayıcı olur İdeal olarak, bir uzunluk teklik ihtiyaçlarıma göre belirlemek mümkün olacaktır. Örneğin, uzunluğu 12 oluşturulan bir dize "AEYGF7K0DM1X" gibi bir şey olabilir.

CEVAP
3 EYLÜL 2008, ÇARŞAMBA


Burada, kolay, ama biraz daha pahalı güvenli oturum tanımlayıcıları için kod.

import java.security.SecureRandom;

public final class SessionIdentifierGenerator {
  private SecureRandom random = new SecureRandom();

  public String nextSessionId() {
    return new BigInteger(130, random).toString(32);
  }
}

Bu şifreli olarak güvenli rasgele bit jeneratör 130 bit seçme ve base-32 onları kodlama ile çalışır. 128 bit şifreli olarak kabul edilirgüçlü,ama temel 32 sayı içinde her basamak 128 5 sonraki katına yuvarlanır yani 5 bit kodlamak. Bu kodlama kompakt ve verimli, karakter başına 5 rasgele bit ile. Toplamda sadece standart düzende karakter başına 3.4 bit olan rastgele bir UUID, ve sadece 122 rasgele bit ile karşılaştırın.

Eğer oturum tanımlayıcıları kolayca (çok kısa, kusurlu rastgele sayı üreteci, vb.) tahmin edilebilir, eğer izin verirseniz saldırganların diğer oturumları kaçırmak olabilir. SecureRandom nesneleri başlatmak için pahalı, bir elinde tutmak ve bunu yeniden kullanmak istersiniz unutmayın.

Burada, alfa-sayısal bir dize daha güvensiz rastgele başka bir kod. "Sembol daha kullanmak isterseniz" karakterleri. bu tweak olabilir

public class RandomString {

  private static final char[] symbols;

  static {
    StringBuilder tmp = new StringBuilder();
    for (char ch = '0'; ch <= '9';   ch)
      tmp.append(ch);
    for (char ch = 'a'; ch <= 'z';   ch)
      tmp.append(ch);
    symbols = tmp.toString().toCharArray();
  }   

  private final Random random = new Random();

  private final char[] buf;

  public RandomString(int length) {
    if (length < 1)
      throw new IllegalArgumentException("length < 1: "   length);
    buf = new char[length];
  }

  public String nextString() {
    for (int idx = 0; idx < buf.length;   idx) 
      buf[idx] = symbols[random.nextInt(symbols.length)];
    return new String(buf);
  }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • engineerguy

    engineerguy

    10 Ocak 2010
  • Fubar Protocol

    Fubar Protoc

    21 AĞUSTOS 2010
  • Philip DeFranco

    Philip DeFra

    16 EYLÜL 2006