【问题标题】:C# emulating php cryptC# 模拟 php crypt
【发布时间】:2015-10-01 20:55:04
【问题描述】:

我需要以其他软件可以理解的方式使用 C# 对密码进行哈希处理。 最初 php 的 crypt 函数就是这样做的。它有以下输出

$6$rounds=1000$1f$yeKGQo0b8MqqMpocFla8uKLE6GOpEygSQUH4qMi4msJZsD50Eh00bU4GwoGGPEeLMdG6C17ehl/l8SrcOABdC0

我猜是 SHA512。 .如何使用 C# 实现 php 的 crypt 功能

原php

$salt = '$6$rounds=1000$'.dechex(rand(0,15)).dechex(rand(0,15)).'$';
$crypted = crypt($password, $salt);

【问题讨论】:

  • 你有生成该输出的 php 代码吗?如果是的话,你能展示一下吗?
  • 根据docs crypt 根据机器上可用的内容做不同的事情。所以要回答这个问题,我们需要知道它在你的机器上做了什么。
  • 在我看来就像 SHA-512 - 浏览 php 文档
  • PHP crypt 函数的 C# 实现可以在这里找到:gist.github.com/otac0n/1092558,更多详细信息请参阅这篇文章stackoverflow.com/questions/855103/…
  • 我编辑了我的问题(php 源代码)

标签: c# crypt


【解决方案1】:

CryptSharp 为所有常见的隐窝变体计算此值。

生成 SHA-512 加盐哈希(此算法的默认轮数为 5000):

using CryptSharp;
string hash = Crypter.SHA512.Crypt(password);

使用自定义轮数:

var saltOptions = new CrypterOptions() { { CrypterOption.Rounds, 10000 } };
string salt = Crypter.SHA512.GenerateSalt(saltOptions);
string hash = Crypter.SHA512.Crypt(password, saltOptions);

验证哈希:

bool matched = Crypter.CheckPassword(testPassword, hash);

另一方面,原始 PHP 确实应该受到保护。 salt 只有 8 位,由 rand 生成(使用 openssl_random_pseudo_bytes 代替)。哈希专门选择默认轮数的五分之一。

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    相关资源
    最近更新 更多