Reputation: 13112
I'm converting some code from C# to VB.NET. I have the following line in C#
var bytes = new byte[password.Length * sizeof(char)];
Looking on MSDN it appears that VB.NET does not seem to have the sizeof
operator. I understand there is a Marshal.SizeOf
but further MSDN documentation states that the value returned can be different to that of sizeof
.
Can anybody help? Is there an equivalent statement in VB.NET?
Additional Information
My aim is to convert a password into an array of bytes which I can then hash and then either store in a database or compare to a previously stored hash. But I don't necessarily want an answer relating to my particular situation.
Dim bytes(password.Length * xxx) As Byte
System.Buffer.BlockCopy(password.ToCharArray(), 0, bytes, 0, bytes.Length)
Dim sha512 = System.Security.Cryptography.SHA512.Create()
Dim hash = sha512.ComputeHash(bytes)
' compare hash or stroe in database
Upvotes: 11
Views: 10996
Reputation: 415870
I'm hashing a password and was following stackoverflow.com/a/10380166/1113475
The top answer there is wrong, in spite of high vote count. The code for that answer still uses an encoding (Unicode), because that's how all strings are encoded internally in .NET. Even if it didn't, the encoding still matters, because you need to be able to decrypt the string on a different system than the one that encrypted it and obtain meaningful results. Even with the same system doing the encrypting/decrypting, something as simple as a Windows Update patch to the .NET Framework could break this. Pick an encoding (like Unicode or UTF-8), and just call its GetBytes()
method:
Dim bytes = Encoding.Unicode.GetBytes(password)
Upvotes: 1
Reputation: 84765
VB.NET's Char
maps to .NET's System.Char
, which is defined in ECMA 335 to be a 16-bit Unicode character. Meaning, Char
has a fixed size (no matter on which platform you compile or run your code), you don't actually need sizeof
.
Therefore, just multiply by 2
.
Upvotes: 2
Reputation: 6542
The 'Len' operator in VB will do this (but it works on instances, so you need to adjust accordingly):
Dim bytes = New Byte((someString.Length * Len(New Char)) - 1){}
Upvotes: 5