- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 .net port of libsodium .哈希生成函数有两种形式,一种接受字节数组,一种接受字符串:
public static byte[] ArgonHashBinary(string password, string salt, long opsLimit, int memLimit, long outputLength = ARGON_SALTBYTES)
public static byte[] ArgonHashBinary(byte[] password, byte[] salt, long opsLimit, int memLimit, long outputLength = ARGON_SALTBYTES)
我遇到的问题是,当输入值相同时,两种形式都会产生相同的散列。
var saltAsBytes = PasswordHash.ArgonGenerateSalt();
var saltAsString = Encoding.UTF8.GetString(saltAsBytes);
var tmp = Encoding.UTF8.GetBytes(saltAsString);
var hash1 = PasswordHash.ArgonHashBinary(password, saltAsString, 6, 134217728, 16);
var hash2 = PasswordHash.ArgonHashBinary( Encoding.UTF8.GetBytes(password), saltAsBytes, 6, 134217728, 16);
任何带有“PasswordHash”的东西。是 libsodium 而不是我的代码。
从上面的代码中,当我将它从字符串转换为字节数组然后返回到字节数组时。字节数组数组总是不同的长度。 ArgonGenerateSalt()
生成一个长度为 16 的字节数组。当我将它从一个通常大于 30 的字符串转换回时(由于生成的盐不同,每次都不同)。
为什么我要转换为 UTF8?因为这就是他们在内部所做的事情: https://github.com/adamcaudill/libsodium-net/blob/master/libsodium-net/PasswordHash.cs
public static byte[] ArgonHashBinary(string password, string salt, StrengthArgon limit = StrengthArgon.Interactive, long outputLength = ARGON_SALTBYTES)
{
return ArgonHashBinary(Encoding.UTF8.GetBytes(password), Encoding.UTF8.GetBytes(salt), limit, outputLength);
}
当我将 salt 转换为 UTF8 字符串时,哈希函数将失败,因为它们正在检查字节数组的长度以确保其为 16 个字节。如果我将它转换为 ASCII 字符串,它可以工作,但会产生不同的哈希值(这是预期的)。
澄清这段代码中的散列部分不是问题。找出为什么 tmp
与 saltAsBytes
不同是关键。
最佳答案
我认为这里的问题是 ArgonGenerateSalt
方法不返回 UTF8 编码的字符串,它 returns completely random bytes .
您不能将随机字节解码为 UTF8 字符串并期望它进行往返。一个简单的例子来查看它在哪里爆炸是执行以下操作:
var data = new byte[] { 128 };
var dataAsString = Encoding.UTF8.GetString( data );
var dataAsBytes = Encoding.UTF8.GetBytes( dataAsString );
在此之后,dataAsBytes
将是 3 个字节(具体为 239、191、189)。
关于c# - 将字节数组转换为字符串然后再返回会产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41287772/
我有本地更改和远程更改。 有人告诉我必须先推,再 pull 。这背后有什么原因吗? 最佳答案 那个人错了:正确的模型是pull-before-you-push,而不是相反。 当您pull时,git 将
我正在使用最新版本的 Flat UI Pro 1.3.2 ( http://designmodo.com/flat/ ),jQuery 插件 flatui-radiocheck v0.1.0 和 iO
我是一名优秀的程序员,十分优秀!