【问题标题】:Random identifier in javajava中的随机标识符
【发布时间】:2012-10-18 21:12:12
【问题描述】:

我想在 java 中生成随机标识符。标识符应该有一个固定的大小,两次生成相同标识符的概率应该很低(系统大约有50万用户)。另外;标识符应该很长,以至于通过暴力攻击“猜测”是不可行的。

到目前为止,我的方法是这样的:

String alphabet = "0123456789ABCDE....and so on";
int lengthOfAlphabet = 42; 
long length = 12; 

public String generateIdentifier(){
    String identifier = "";
    Random random = new Random(); 
    for(int i = 0;i<length;i++){
        identifier+= alphabet.charAt(random.nextInt(lengthOfAlphabet));
    }
    return identifier; 
}

我通过数据库中的约束来强制执行唯一性。如果我点击了一个已经创建的标识符,我将继续生成,直到找到一个未使用的标识符。

我的假设是我可以调整 lenghtOfAlpahbet 和长度以获得我正在寻找的属性:

  1. 罕见的碰撞
  2. 暴力破解不可行
  3. 标识符应尽可能短,因为系统用户必须键入它。

这是一个好方法吗?有人对“长度”的价值有任何想法吗?

【问题讨论】:

  • 开始之前:请说明UUID.randomUUID() 有什么问题?是不是太长了?它可以转换成更短的形式,例如以 base 64 编码。
  • 真空量子涨落产生的真正随机数150.203.48.55/index.php
  • @Marko:我想问题是要求 #3。有更容易键入的随机标识符(但这可能只是格式化/解析的事情)。
  • @JoachimSauer 你认为我的想法是从 randomUUID 开始并将其后处理成更密集的东西,比如 base-64 表示?
  • 还不错,马尔科。 @letterboy:请记住,非常长的随机字符串的替代方法是严重缩短该字符串的生命周期,并改用较短但寿命短的字符串。例如,与其创建一个巨大的、终身有效的身份验证令牌,不如生成一个短的(约 6 个字符)令牌,该令牌仅有效一次(并且在失效之前最多接受 2 次尝试)。通过这种方式,您可以让您的用户免于输入长字符串的痛苦,同时仍然获得高安全性。

标签: java security random statistics


【解决方案1】:

我认为 randomUUID 是你的朋友。它是固定宽度。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/UUID.html#randomUUID()

如果我没记错的话,由于 UUID 是 32 个十六进制数字 (0-f),那么排列的数量是 16^32,这是一个很大的数字,因此很难猜到。

【讨论】:

    【解决方案2】:

    我建议保持简单,并使用内置方法来表示编码为字符串的普通伪随机整数:

    Random random = new Random(); 
    
    /**
     * Generates random Strings of 1 to 6 characters. 0 to zik0zj
     */
    public String generateShortIdentifier() {
        int number;
        while((number=random.nextInt())<0);
        return Integer.toString(number, Character.MAX_RADIX);
    }
    
    /**
     * Generates random Strings of 1 to 13 characters. 0 to 1y2p0ij32e8e7
     */
    public String generateLongIdentifier() {
        long number;
        while((number=random.nextLong())<0);
        return Long.toString(number, Character.MAX_RADIX);
    }
    

    Character.MAX_RADIX 是 36,这将等于所有 0 到 9 和 A 到 Z 的字母表。简而言之,您会将随机整数转换为以 36 为底的数字。

    如果需要,您可以调整所需的长度,但只需 13 个字符,您就可以编码 2^63 个数字。

    编辑:将其修改为仅生成 0 到 2^63,没有负数,但这取决于您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      相关资源
      最近更新 更多