所以我想通过添加随机盐来散列我的密码。网。我为此使用的内置类是RNGCryptoServiceProvider-生成随机盐和Rfc2898DeriveBytes-散列实际密码。
但是当我为相同的passwordString组合调用Rfc2898DeriveBytes的GetBytes()函数时,SaltBytes
public class PBKDF2Implementation
{
int minSaltSize = 32;
int maxSaltSize = 64;
public string CreateHash(string plainText , out string salt)
{
Random random = new Random();
int saltSize = random.Next(minSaltSize, maxSaltSize);
// Allocate a byte array, which will hold the salt.
byte[] saltBytes = new byte[saltSize];
// Initialize a random number generator.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
// Fill the salt with cryptographically strong byte values.
rng.GetNonZeroBytes(saltBytes);
string strSalt = System.Text.Encoding.ASCII.GetString(saltBytes);
//string strSalt = System.Convert.ToBase64String(saltBytes);
salt = strSalt;
Console.WriteLine(saltBytes.Count());
Console.WriteLine(strSalt);
Rfc2898DeriveBytes pwdGen = new Rfc2898DeriveBytes(plainText, saltBytes, 1000);
// generate an RC2 key
byte[] key = pwdGen.GetBytes(32);
Console.WriteLine(System.Convert.ToBase64String(key));
return System.Convert.ToBase64String(key);
}
public bool CompareHash(string plainText, string salt, string hashValue)
{
byte[] saltBytes = System.Text.Encoding.ASCII.GetBytes(salt);
//byte[] saltBytes = System.Convert.FromBase64String(salt);
Console.WriteLine(saltBytes.Count());
Console.WriteLine(System.Text.Encoding.ASCII.GetString(saltBytes));
Rfc2898DeriveBytes pwdGen = new Rfc2898DeriveBytes(plainText, saltBytes, 1000);
// generate an RC2 key
byte[] key = pwdGen.GetBytes(32);
Console.WriteLine(System.Convert.ToBase64String(key));
return System.Convert.ToBase64String(key) == hashValue;
}
}
在我的测试课上,我有这个函数
[Test]
public void shouldGenerateConsistentHash()
{
PBKDF2Implementation cPbkdf2Implementation = new PBKDF2Implementation();
string salt;
string hashValue = cPbkdf2Implementation.CreateHash("password", out salt);
bool result = cPbkdf2Implementation.CompareHash("password", salt, hashValue);
Assert.IsTrue(result) ;
}
测试失败了
但是如果在上面的类PBKDF2实现中,如果我替换了行系统。文本编码。ASCII码。使用系统获取字符串。文本编码。Unicode。获取字符串和系统。文本编码。ASCII码。使用系统获取字节。文本编码。Unicode。GetBytes
测试通过了。知道为什么会这样吗?我想让它与ASCII编码一起工作的原因是因为存储这个hashvalue的同一个数据库也将被PHP应用程序使用
下面是同一个http://www.php.net/manual/en/function.hash-hmac.php#101540的PHP实现
字节[]
例如。
byte [] data = new byte [] { 65, 0, 65 };
var s = System.Text.Encoding.ASCII.GetString (data);
什么是s
值?
答:"A"
如果从同一个字符串中请求字节[]
,您将得到:字节[1]{65}
,它与原始的不一样,对于大多数加密用法都不起作用。
Base64更安全,因为它将保持每个字节完整。
最近,我参加了一次面试,遇到了一个关于哈希碰撞的很好的问题。 问题:给出一个字符串列表,把字谜一起打印出来。 示例: I/P: 、 、 、 、 、 、 、 、 、 、 、 、 {行为,上帝,动物,狗,猫} O/P: 演戏,猫,狗,上帝 我要创建hashmap并将单词作为键,将值作为字母表列表 为了避免冲突,我想为字母表生成唯一的哈希代码,而不是排序并使用排序后的单词作为
问题内容: 这个问题与PHP的实现有关。对于此问题,不计算盐的前7个字符,因此盐’ ‘的长度为1,因为它仅是盐的1个字符和元数据的7个字符。 当使用长度超过22个字符的盐字符串时,生成的哈希值不会发生变化(即,截断),而当使用长度小于21个字符的字符串时,盐将被自动填充(显然带有’ ‘字符);这非常简单。但是,如果给定一个Salt 20个字符和Salt 21个字符,并且除了21个长度的salt的最
本文向大家介绍java集合与数组的相同点和不同点,包括了java集合与数组的相同点和不同点的使用技巧和注意事项,需要的朋友参考一下 数组: 数组可以用来保存多个基本数据类型的数据,也可以用来保存多个对象。 数组的长度是不可改变的,一旦初始化数组时就指定了数组的长度(无论是静态初始化还是动态初始化)。 数组无法保存具有映射关系的数据。 集合: 集合是只用于存储数量不等的对象。 集合的长度是可变的。
对于以下地图: 这是代码。。。 ...保证两次打印相同的序列? 如果没有,在例如< code>java.util.HashMap中是否有任何保证?
或者他是对的,使用默认的object.hashCode()实现,我们永远不会发生冲突,即两个不同的对象永远不会有相同的hashCode。如果是的话,为什么那么多的java手册没有明确地这么说。 我如何编写一些代码来演示这一点呢?因为通过演示,我还可以证明hashmap中的bucket可以包含不同的hashcode(我试图向他展示hashmap在哪里展开的调试器,但他告诉我这只是逻辑实现,而不是内部
问题内容: 我有一个函数可以在C#中生成MD5哈希,如下所示: 在Java中,我的函数如下所示: C#代码生成:“ 02945C9171FBFEF0296D22B0607D522D”时,Java代码生成:“ 5a700e63fa29a8eae77ebe0443d59239”。 有没有办法为相同的字节数组生成相同的md5哈希? 一经请求: 这是java中的测试代码: 这是我在C#中的代码 干杯 问题