.NET框架附带了6种不同的散列算法:
每个功能都有不同的表现; MD5是最快的,RIPEMD是最慢的.
MD5的优势在于它适用于内置的Guid类型; 它是3型UUID的基础.SHA-1哈希是类型5 UUID的基础.这使得它们非常易于识别.
然而,MD5易受碰撞攻击,SHA-1也容易受到攻击,但程度较轻.
我真的很想回答的具体问题是:
MD5不值得信任吗?在正常情况下,当您使用没有恶意意图的MD5算法且没有任何第三方有任何恶意意图时,您会期望任何冲突(意味着两个任意byte []产生相同的哈希)
RIPEMD比SHA1好多少?(如果它更好)它的计算速度要慢5倍,但散列大小与SHA1相同.
散列文件名(或其他短字符串)时获得非恶意冲突的几率是多少?(例如,2个具有相同MD5哈希值的随机文件名)(使用MD5/SHA1/SHA2xx)一般来说,非恶意冲突的几率是多少?
这是我使用的基准:
static void TimeAction(string description, int iterations, Action func) {
var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < iterations; i++) {
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
}
static byte[] GetRandomBytes(int count) {
var bytes = new byte[count];
(new Random()).NextBytes(bytes);
return bytes;
}
static void …Run Code Online (Sandbox Code Playgroud) 我需要将WPF应用程序中使用的颜色序列化到数据库.我想使用sRGB值,因为他们对我们这些在过去几年中进行Web开发的人更熟悉.
如何从System.Windows.Media.Color对象获取ARGB字符串(如#FFFFFFFF)?
更新:我被MSDN上的文档误导了.正如下面提到的@Kris,该ToString()方法的文档不正确.虽然它说ToString()"使用ScRGB通道创建颜色的字符串表示",但如果使用该FromARGB()方法创建颜色,它实际上将返回ARGB十六进制格式的字符串.我想这是一个没有文档记录的功能.
为什么这些不一样?
PHP:
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password) );
Run Code Online (Sandbox Code Playgroud)
C#
public static string ComputeHash(string plainText, string salt)
{
// Convert plain text into a byte array.
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
byte[] saltBytes = Encoding.UTF8.GetBytes(salt);
SHA256Managed hash = new SHA256Managed();
// Compute hash value of salt.
byte[] plainHash = hash.ComputeHash(plainTextBytes);
byte[] concat = new byte[plainHash.Length + saltBytes.Length];
System.Buffer.BlockCopy(saltBytes, 0, concat, 0, saltBytes.Length);
System.Buffer.BlockCopy(plainHash, 0, concat, saltBytes.Length, plainHash.Length);
byte[] tHashBytes = hash.ComputeHash(concat);
// Convert result into a base64-encoded string.
string hashValue …Run Code Online (Sandbox Code Playgroud) 我正在使用Azure存储表,我有数据进入RowKey,其中包含斜杠.根据此MSDN页面,PartitionKey和RowKey中不允许使用以下字符:
正斜杠(/)字符
反斜杠()字符
数字符号(#)字符
问号(?)字符
控制字符从U + 0000到U + 001F,包括:
水平制表符(\ t)字符
换行符(\n)字符
回车(\ r)字符
控制字符从U + 007F到U + 009F
我见过有些人使用URL编码来解决这个问题.不幸的是,这可能会产生一些问题,例如能够插入但无法删除某些实体.我也看到有些人使用base64编码,但是这也可以包含不允许的字符.
如何在不运行不允许的字符或滚动自己的编码的情况下有效编码RowKey?
在C#中散列XML文档的最佳方法是什么?我想散列一个XML文档,以便我可以判断它是否从生成时手动更改.我没有使用它来保证安全性 - 如果有人更改XML并更改哈希值以匹配,则可以.
例如,我会对根的子节点进行哈希并将哈希存储为根的属性:
<RootNode Hash="abc123">
<!-- Content to hash here -->
</RootNode>
Run Code Online (Sandbox Code Playgroud) 我试图在C#中进行一些转换,我不知道如何做到这一点:
private int byteArray2Int(byte[] bytes)
{
// bytes = new byte[] {0x01, 0x03, 0x04};
// how to convert this byte array to an int?
return BitConverter.ToInt32(bytes, 0); // is this correct?
// because if I have a bytes = new byte [] {0x32} => I got an exception
}
private string byteArray2String(byte[] bytes)
{
return System.Text.ASCIIEncoding.ASCII.GetString(bytes);
// but then I got a problem that if a byte is 0x00, it show 0x20
}
Run Code Online (Sandbox Code Playgroud)
谁能给我一些想法?
我在我的C++/CLI项目中使用ToBase64String了一个字符串,就像/MnwRx7kRZEQBxLZEkXndA==我想将这个字符串转换为十六进制表示,我怎样才能在C++/CLI或C#中做到这一点?
我正在使用以下代码来执行SHA256.
public static string GenerateSaltedHash(string plainTextString, string saltString)
{
byte[] salt = Encoding.UTF8.GetBytes(saltString);
byte[] plainText = Encoding.UTF8.GetBytes(plainTextString);
HashAlgorithm algorithm = new SHA256Managed();
byte[] plainTextWithSaltBytes =
new byte[plainText.Length + salt.Length];
for (int i = 0; i < plainText.Length; i++)
{
plainTextWithSaltBytes[i] = plainText[i];
}
for (int i = 0; i < salt.Length; i++)
{
plainTextWithSaltBytes[plainText.Length + i] = salt[i];
}
byte[] bytes = algorithm.ComputeHash(plainTextWithSaltBytes);
return Convert.ToBase64String(algorithm.ComputeHash(plainTextWithSaltBytes));
}
Run Code Online (Sandbox Code Playgroud)
由于我使用SHA256,预期结果长度为64.但是我得到了44的结果.问题是什么?44长度输出会影响安全质量吗?
假设我有字节数组.
byte[] a = new byte[] {0x33,0x43,0xFE};
Run Code Online (Sandbox Code Playgroud)
我想把它转换成string.
string str = convert(a);
Run Code Online (Sandbox Code Playgroud)
我的str应该是这样的:
"33 43 FE"
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
最近,我注意到SHA算法计算随机长度的哈希值.
HashAlgorithm provider;
provider = HashAlgorithm.Create("System.Security.Cryptography.SHA256");
while(!stackoverflow) {
Console.WriteLine(Encoding.UTF8.GetString(
provider.ComputeHash(Encoding.UTF8.GetBytes(
(new Random()).Next().ToString())))
.Count().ToString());
}
Run Code Online (Sandbox Code Playgroud)
输出:
29
29
30
29
29
30
29
31
29
29
32
29
30
28
...
Run Code Online (Sandbox Code Playgroud)
是否可以设置最大哈希长度?(可能使哈希无用..)或者我在计算哈希值时做错了什么?编码?
编辑:
上面的代码片段就是一个例子.我最终需要的是一个接受字符串的方法,计算字符串的散列并返回它.HashAlgorithm.ComputeHash取字节并返回字节,所以我使用UTF8.GetBytes()/ UTF8.GetString()进行转换,这似乎是一个巨大的错误.
我正在构建一个C#应用程序,该应用程序使用加密文本并在文本框中显示结果,System.Security.Cryptography.Rijndael以便接收方复制结果并使用相同的密钥对其进行解密。
当我将加密的文本从EncryptStringToBytes函数返回的byte []转换为可以在textBox中显示的字符串以便以后复制和解密时,就会发生问题。
我使用了以下转换方法,但是没有一个方法能够显示有意义的字符串,以后可以将其用于解密,并且可以将其重新转换为先前从返回的原始字节形状EncryptStringToBytes。
以下是用于执行转换的方法:
从byte []转换为字符串以便在文本框中显示:
textBox3.Text = Encoding.Default.GetString(encryptionResult)
Run Code Online (Sandbox Code Playgroud)
从文本框复制的字符串转换为byte []以便作为参数发送给它DecryptStringFromBytes,以完成解密过程:
byte[] textToByte = Encoding.Default.GetBytes(textToDecrypt)
Run Code Online (Sandbox Code Playgroud) 我有以下字符串: TheString = 12424$456$06$4539527688361959$2017$188.98.78.191$
我想要该字符串的SHA1哈希,为此我使用以下代码:
string TheSHA1Hash = BitConverter.ToString(new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(TheString)));
Run Code Online (Sandbox Code Playgroud)
这是输出:
8F-BA-36-2C-FC-DE-31-B2-AC-66-07-37-2D-80-85-63-5A-33-35-F4
Run Code Online (Sandbox Code Playgroud)
当我访问http://www.sha1-online.com/并散列字符串时,这是输出,这就是我想要的:
8fba362cfcde31b2ac6607372d8085635a3335f4
Run Code Online (Sandbox Code Playgroud)
它看起来一样,但不一样.如何获得我想要的输出?