如何解决我应该如何直接使用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 举报,一经查实,本站将立刻删除。