当前位置: 首页 > 知识库问答 >
问题:

Java SecureRandom作为salt

锺霍英
2023-03-14

这是密码生成盐的正确方式吗?

        SecureRandom random = new SecureRandom();
        byte[] salt = random.generateSeed(64);

        String decoded = new String(salt, "Cp1252");
        System.out.println(decoded);

我正在尝试生成新的密码(SHA-512),所以我也需要一个salt。
散列密码将是=用户密码+salt...这是正确的吗?
这些奇怪的字符会“破坏”数据库(MySQL)吗?(更新:不,因为salt应该被加密/编码/散列,结果不应该使用奇怪的字符)

ã2}wÑ»-ÄKÇæꮃzR4qÉÖÙÚ!ž0ÉW9;*Vß4x»)
àöˆ˜£¿{,J¼…HþTù#+Bv(Fp´G~Aò`^e_ElpíÜžS  A!­ñÛz‹y@`ý‡)‡ª€
5a£Æ.¥sgöfÈB:4-�y$Óx%Óâyý¾N¨…áq

更新:

        SecureRandom random = new SecureRandom();
        byte[] saltArr = new byte[64];
        random.nextBytes(saltArr);

        String salt = new String(saltArr, "Cp1252");
        System.out.println("SALT:"+salt);


        byte[] encodedBytes = Base64.encodeBase64(saltArr);
        System.out.println("Encoded SALT:" + new String(encodedBytes));

        byte[] decodedBytes = Base64.decodeBase64(encodedBytes);
        System.out.println("Decoded SALT:" + new String(decodedBytes, "Cp1252"));


        //SHA
        String target = "Test";
        MessageDigest sh = MessageDigest.getInstance("SHA-512");
        sh.update(target.getBytes());
        StringBuffer sb = new StringBuffer();
        for (byte b : sh.digest()) sb.append(Integer.toHexString(0xff & b));
        System.out.println("Hashed PWD:"+sb);

        //And then joining them together... 

共有1个答案

易宏阔
2023-03-14

首先,使用NextBytes(实际调用PRNG)而不是GenerateSeed就足够了。后者使用种子生成算法,这是一个更复杂的操作,因为它需要一个熵源(800-90a p19-23)

salts的主要功能是防御字典攻击(相对于密码散列列表)和预先计算的彩虹表攻击。(维基百科)

换句话说,每个密码都需要一个不同的salt,但这个salt不是秘密的(您将把它与摘要输出一起存储),并且您应该可以使用PRNG的输出。

*SHA不是加密函数。

SecureRandom random = new SecureRandom();
byte[] salt = new byte[64];
random.nextBytes(salt);

String password="god";
MessageDigest md = MessageDigest.getInstance("SHA-512");
md.update(password.getBytes(Charset.forName("UTF-8")));
md.update(salt);

byte[] digest = md.digest();
 类似资料:
  • 问题内容: 我试图通过使用Action对象将功能与GUI应用程序中的状态分开。我已经成功地使用它们来创建具有相同功能的菜单项和按钮。 我的问题是:我希望菜单中的“退出”项和框架的关闭按钮都具有相同的操作。 目前,我已经可以通过将以下WindowListener添加到框架中来解决此问题: 有没有更简单,更直接的方法来做到这一点? 问题答案: 转发事件是很方便的,但你也可以使用,如在这里。 附录:下面

  • 我有一个流量endpoint,我提供给客户机(订户),以接收更新的价格。我正在测试它通过浏览器访问URL(http://localhost:8080/prices),它工作得很好。我面临的问题(我可能在这里遗漏了一些概念)是,当我在许多浏览器中打开这个URL,我希望在所有浏览器中都收到通知,但只有一个浏览器收到通知。它作为一个队列而不是一个主题工作(就像在message Brokers中一样)。那

  • 因此,我的任务是为客户端的Oracle Hyperion应用程序启用SSO。我使用的方法是基于自定义标头变量的SSO。 平联邦目前作为许多应用程序的SSO身份验证服务器存在,计划是在它(平馈SP)从Okta IDP检索属性/身份验证用户时使用它作为目标应用程序的SP。 我对这个过程相对较新,因为您可能已经猜到了,并且正在寻找有关如何配置的澄清: > SP 从 Pingfed 启动 SSO,并从 O

  • 问题内容: 我怎样才能得到 作为MySQL中的UTC / GMT?该日期在连接的时区中返回。 我不想更改连接的时区。 问题答案: 您最好提前设置时区: 原因是涉及本地时区的转换可能是有损的。这里的文档中有一个示例(请参阅以“注意:”开头的部分下的第4段)

  • 问题内容: 我有 如何在管理界面中将TextArea小部件分配给“ descr”字段? upd: 在管理界面中!使用ModelForm的好主意。 问题答案: 你将必须创建一个描述你希望如何显示该字段的表单,然后告诉你使用该表单。例如: 属性记录在官方Django文档中。