微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我应该如何直接使用UTF8或UTF16随机生成一个固定长度的String变量?

如何解决我应该如何直接使用UTF8或UTF16随机生成一个固定长度的String变量?

这是我的代码,它基本上生成了用于加密的盐。 为了生成随机字符,我简单地使用了一个包含所有字符的预先声明的字符串变量,以便代码根据预先声明的变量生成字符串输出

但是,我认为如果我使用一组更大的密钥(例如 UTF8 或 16)来生成盐,结果可能不会那么随机

static final String keychain = "0123456789qwertyuioasdfghjklzxcvbnm,.+_=-][}{;:></?'|!@#$%^&*()坢坣坥坧坨坩坪坫坬坭坮" ;
static SecureRandom randomValue = new SecureRandom();


public static String GetRandomSalt(){


    StringBuilder constructsalt = new StringBuilder(16);
    for (int i = 0; i < 16; i ++){
        constructsalt.append(keychain.charat(randomValue.nextInt(keychain.length())));
    }

    System.out.println(constructsalt.toString());
    return constructsalt.toString();


}

那么是否可以参考上面的代码使用UTF8/16键集直接生成一个随机的固定长度的String?

解决方法

但是,我认为如果我使用一组更大的密钥(例如 UTF8 或 16)来生成盐,结果可能不会那么随机。

你似乎很困惑。

加密完全在字节上完成。不是字符。字节是数字,从 0 到 255。仅此而已。

但是,如果需要,您可以将字符转换为字节。没有一种固定的方法可以做到这一点。 US-ASCII 是一种方式(并且只定义了 96 个字符,映射到范围 32-127)。 UTF-8 是另一个。大多数编码都具有不能产生所有可能的字节序列的特性;只是其中的一个子集。这对加密来说是个坏消息,所以避免使用字符串。时期。 (对于几乎所有编码,有些字节序列永远不会成为将字符串转换为字节的结果)。

getRandomSalt 返回字符串的事实?

你搞砸了。那是错误的。它应该返回 byte[]

许多加密工具、API 和教程确实似乎都使用字符串。这有两个独立的、同样愚蠢的起源:

对字符集的误解

一大堆编程语言随便模糊了字符串和一袋字节的区别,分不清"Hello"[0,72,101,108,111]的区别。这是一个非常愚蠢的想法 - 有更多的字符不仅仅是英语倾向于使用的字符,并且整个 unicode 符号集不适合 0-255 范围;毕竟,way 有超过 256 个独特的字符。

幸运的是,Java 并不是一种愚蠢的语言。 byte[] 和 String 不可互换,因此,使该方法返回 byte[]

更容易转移到人类眼球

阅读 Hello 比阅读 0,111 要容易得多。但是将事物保持为字符串是,最好的情况,令人困惑的情况和最坏的情况,严重减少强> 你的键和盐表达随机性的能力。 这很糟糕

因此,这取代了您在问题中粘贴的所有代码,并且非常优越:

public byte[] getRandomSalt() {
    byte[] salt = new byte[16];
    random.nextBytes(salt);
    return salt;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。