【问题标题】:Random seed generator随机种子生成器
【发布时间】:2017-08-11 21:28:59
【问题描述】:

编辑:抱歉发错了,下次我会更好地检查论坛位置。我选择了一个已接受的答案,我认为这认为问题已结束。感谢您提供有用的回复和提示!

原文: 我今天需要升级到新的 Iota 钱包。它没有随机种子生成器,所以我自己构建并从 NetBeans 运行它。你能给我你的意见吗?它必须是 81 个字符长,并且包含 A 到 Z 和数字 9。没有别的。这是完整的代码。

这会留下什么不安全的东西吗?从约定的角度来看,代码是否更简洁?

    class SeedGenerator    {
    /*
    This is a program to randomize a seed for Iota wallet
    */

    public static void main(String[] args)  {
        System.out.println("*****");
        int seedLength = 81;
        String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ9"; //Only characters allowed in Iota seed are A-Z and number 9
        char[] charArray = alphabet.toCharArray();  //Turn string into array of characters to be referenced by index
        String[] seed = new String[seedLength];
        System.out.print("Random wallet seed is: ");

        for (int i = 0; i < seedLength; i++)    {
            Random newRandomNumber = new Random();
            int seedIndex = newRandomNumber.nextInt(alphabet.length()); //This is an array of index numbers to pull from charArray
//            System.out.print(seedIndex + " "); //Used for testing the random character index range
            seed[i] += charArray[seedIndex];
            System.out.print(charArray[seedIndex] + "");

        }

        System.out.println();
        System.out.println("*****");
    }
}

【问题讨论】:

  • 如果您的代码完整、有效并且您希望对其进行审核,请将其发布在 Code Review 上。
  • 也许在你的代码中查看 codereview.stackexchange.com 的 cmets。我会说,将您自己的加密原语作为第一个项目进行滚动保证是不安全的。例如,您使用的是 Random,而 docs.oracle.com/javase/7/docs/api/java/security/… 中似乎有一个加密强的随机数生成器。可能也不建议为每个循环创建一个新的 Random 对象!您还将种子打印到标准输出,如果有人在您的肩膀上看着,这(如果敏感)可能会很糟糕。 (这是不看你的代码。)
  • 也许看看stackoverflow.com/questions/41107/… 有类似的问题。

标签: java random generator seed iota


【解决方案1】:

当要求审查代码时,您应该发布here。但不管怎样,有更有效的方法来生成随机字符。

其中一种方法是生成一个介于 65 和 90 之间的随机字符,即ASCII table 上 A-Z 的十进制值。然后,只需将值转换为 char 即可获得与数字对应的实际字母。但是,您说您希望数字 9 也包含在内,因此您可以将其扩展为 91,如果您得到 91(在 ASCII 表中为 [),请将数字 9 添加到您的字符串中而不是那个。

这段代码很容易做到这一点:

String mySeed = "";
      for(int i=0; i<81; i++)
      {
         int randomNum = (int)(Math.random()*27) + 65;
         if(randomNum==91)
            mySeed+="9";
         else
            mySeed+=(char)randomNum;
      }
      System.out.println(mySeed);

而且,正如@O.O.所提到的。你可以看看生成一个安全的随机数here

【讨论】:

    【解决方案2】:

    我建议使用名为 Jota 的官方 IOTA Java 库。

    SeedRandomGenerator 类有一个 generateNewSeed 实现:

    public static String generateNewSeed() {
        char[] chars = Constants.TRYTE_ALPHABET.toCharArray();
        StringBuilder builder = new StringBuilder();
        SecureRandom random = new SecureRandom();
        for (int i = 0; i < Constants.SEED_LENGTH_MAX; i++) {
            char c = chars[random.nextInt(chars.length)];
            builder.append(c);
        }
        return builder.toString();
    }
    

    Constants 类中查找 TRYTES_ALPHABET 和 SEED_LENGTH_MAX 的常量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 2014-09-20
      • 1970-01-01
      • 2021-05-15
      相关资源
      最近更新 更多