我必须将一些代码从VB.net移植到C#。现在我很尴尬,但我无法想象,如何翻译以下代码:
来自VB
Dim Hash() As Byte
Hash = Encoding.UTF8.GetBytes("StackOverflow".GetHashCode)
到C#(不工作):
byte[] Hash;
Hash = Encoding.UTF8.GetBytes("StackOverflow".GetHashCode());
正确的语法是什么?
答案 0 :(得分:3)
目前的方法存在两个问题。
A)您可疑密码的问题域是int.MinValue to int.MaxValue
(-2147483648 - 2147483647),即2 ^ 32,这意味着如果将其作为Web服务公开,我可以按照每秒10000个请求的速度生成请求,这将需要大约5天(最坏的情况)蛮力猜测密码。
B)如果你的"哈希"由于默认的.NET字符串散列函数(https://github.com/floodyberry/Marvin32/blob/master/Marvin32.c)不具有加密功能(它非常快 - 这在哈希表和字典中的使用是可取的),因此密码被盗了很容易对用户的密码进行反向工程设计,为其预定了GetHashCode()方法) - 因此随机行走已知密码列表将生成匹配哈希FAST的结果。
有人可能会争辩说,既然你没有使用众所周知的加密功能,黑客将不得不编写一些独特的代码来破解它并识别正在使用的哈希函数(即无法访问源代码) - 这通过默默无闻被称为安全,仅对B)而言是真实的
正确的方法如下:
var password = "StackOverflow";
// ideally salt should be something bound for given user
var salt = "MY UNIQUE SALT";
byte[] hash;
using (var algorithm = new SHA512Managed()) {
hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(salt + password));
}
SHA512的问题域是2 ^ 512 - 即请求速度为每秒10000次,需要(4e + 142年)才能通过蛮力破解它。此外,如果您的"哈希"密码被盗,无法重建原始密码。
所以我建议实施一个像样的密码散列和强制切换用户新方法。
答案 1 :(得分:1)
尝试
Hash = Encoding.UTF8.GetBytes("StackOverflow".GetHashCode().ToString());
对于C#和VB,它都给出相同的结果
Byte[] (11 items)
45
50
48
51
54
49
50
54
55
56
49