【发布时间】:2017-05-05 21:29:53
【问题描述】:
【问题讨论】:
-
没有加密 - 它是使用 BCrypt 的哈希
-
C# 可以使用 bcrypt,所以这是在 C# 中复制逻辑的情况
-
谢谢@Plutonix,
标签: c# mongodb meteor meteor-accounts
【问题讨论】:
标签: c# mongodb meteor meteor-accounts
这是一个 bcrypt 哈希吗?它取决于密钥的大小,因为 Blowfish 作为可变大小的密钥。如果是 32 位。当然,你可以用一些强大的计算能力和几个小时来完成它。它是一个 128 位密钥,在它完成暴力破解之前,你早就死了(我们所知道的宇宙也会死)。不过,Blowfish 确实存在弱密钥的小漏洞。我会重新考虑你的实施。
【讨论】:
散列和加密密码的真正目的是使解密它们变得不切实际。
但是,如果您使用相同的方案,您可以重用流星应用程序中的 bcrypt(hash(password)) 并在另一个应用程序中对其进行检查。
【讨论】:
正如其他答案中所述,您无法解密密码,但您可以很好地使用 Meteor 数据库在不同的系统中进行身份验证。
这是怎么做的:
在您的其他系统中,首先找到提供SHA256 和bcrypt 实现的库。
然后获取用户输入的密码,并首先从中计算出 SHA256 摘要哈希。
然后使用轮数 = 10 将此哈希字符串提供给 bcrypt(这是 Meteor 的默认值)。
现在将 bcrypt 的结果与 Meteor 的 MongoDB 数据库中的 services.password.bcrypt 进行比较。如果它们匹配,则用户提供了正确的密码。
作为参考,Meteor 实现is here。它非常简单,并且注释很好。
【讨论】:
我遇到了一个类似的用例,我正在编写一个 C# 应用程序,该应用程序将验证通过 Meteor.js 应用程序创建的用户。我开始工作的代码是这样的(使用 System.Security.Cryptography 和 BCrypt.Net-Next):
string sha256_hash(string value) {
StringBuilder stringBuilder = new StringBuilder();
using (SHA256 hash = SHA256.Create()) {
Encoding enc = Encoding.UTF8;
Byte[] resultingHash = hash.ComputeHash(enc.GetBytes(value));
foreach (Byte b in resultingHash) {
stringBuilder.Append(b.ToString("x2"));
}
}
return stringBuilder.ToString();
}
// First compute SHA256 hash
string sha256hash = sha256_hash("my_password");
// Let BCrypt.Net rehash and check if it matches Meteor's hash
if (BCrypt.Net.BCrypt.Verify(sha256hash, dbPassword) == true) {
Console.WriteLine("Valid!");
}
【讨论】: