ASP.NET成员如何生成其salt密钥,然后如何对其进行编码(即,是salt +密码还是密码+ salt)?
我正在使用SHA-1和我的会员资格,但我想重新创建相同的盐,所以内置的会员资格可以像我的东西一样散列东西.
编辑2:没关系.我误读了它并且认为它说的是字节,而不是位.所以我传入128个字节,而不是128位.
编辑:我一直试图这样做.这就是我的意思,
public string EncodePassword(string password, string salt)
{
byte[] bytes = Encoding.Unicode.GetBytes(password);
byte[] src = Encoding.Unicode.GetBytes(salt);
byte[] dst = new byte[src.Length + bytes.Length];
Buffer.BlockCopy(src, 0, dst, 0, src.Length);
Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
byte[] inArray = algorithm.ComputeHash(dst);
return Convert.ToBase64String(inArray);
}
private byte[] createSalt(byte[] saltSize)
{
byte[] saltBytes = saltSize;
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetNonZeroBytes(saltBytes);
return saltBytes;
}
Run Code Online (Sandbox Code Playgroud)
所以我没有试过看看ASP.NET成员资格是否会识别这个,但散列密码看起来很接近.我只是不知道如何将它转换为base64 for salt.
我这样做了
byte[] storeSalt = createSalt(new byte[128]); …Run Code Online (Sandbox Code Playgroud) 我试图创建在ASP.Net成员资格系统默认的SHA-1密码哈希的纯T-SQL表示.理想情况下,我会得到的是:
UserName Password GeneratedPassword
cbehrens 34098kw4D+FKJ== 34098kw4D+FKJ==
Run Code Online (Sandbox Code Playgroud)
注意:那里有伪造的base-64文本.我有base64_encode和解码函数正确往返.这是我的尝试,但不起作用:
SELECT UserName, Password, dbo.base64_encode(HASHBYTES('SHA1', dbo.base64_decode(PasswordSalt) + 'test')) As TestPassword FROM aspnet_Users U JOIN aspnet_membership M ON U.UserID = M.UserID
Run Code Online (Sandbox Code Playgroud)
我尝试了很多关于主题的变化,但没有用.我需要在纯T-Sql中执行此操作; 涉及控制台应用程序或类似的东西将使工作翻倍.
因此,如果有人能提供从ASP.Net会员资料中复制该密码的语法应该是什么,我将非常感激.
我有一个庞大的用户数据库(~200,000),我正在从ASP.NET应用程序转移到Ruby on Rails应用程序.我真的不想要求每个用户重置密码,所以我试图在Ruby中重新实现C#密码散列函数.
旧功能是这样的:
public string EncodePassword(string pass, string saltBase64)
{
byte[] bytes = Encoding.Unicode.GetBytes(pass);
byte[] src = Convert.FromBase64String(saltBase64);
byte[] dst = new byte[src.Length + bytes.Length];
Buffer.BlockCopy(src, 0, dst, 0, src.Length);
Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
byte[] inArray = algorithm.ComputeHash(dst);
return Convert.ToBase64String(inArray);
}
Run Code Online (Sandbox Code Playgroud)
示例哈希密码和盐是(并且使用的密码是"密码"):
哈希密码:"weEWx4rhyPtd3kec7usysxf7kpk ="盐:"1ptFxHq7ALe7yXIQDdzQ9Q =="密码:"密码"
现在使用以下Ruby代码:
require "base64"
require "digest/sha1"
password = "password"
salt = "1ptFxHq7ALe7yXIQDdzQ9Q=="
concat = salt+password
sha1 = Digest::SHA1.digest(concat)
encoded = Base64.encode64(sha1)
puts encoded
Run Code Online (Sandbox Code Playgroud)
我没有得到正确的密码哈希(我得到"+ BsdIOBN/Vh2U7qWG4e + O13h3iQ ="而不是"weEWx4rhyPtd3kec7usysxf7kpk =").任何人都可以看到问题可能是什么?
非常感谢 …
有谁知道是否可以将ASP.NET成员资格API配置为使用SHA-256或SHA-512?我真的不想写下自己的写作,我们的雇主有一个不允许MD5或SHA-1的加密策略.我可以从Microsoft找到的是HashAlgorythmType枚举
...但是这只包含MD5和SHA1
谢谢,
基诺
首先,我使用SHA256和.NET/Node.js读取了这个Hashing密码,它对我没有帮助.
我必须验证在node.js环境中在ASP.NET中创建的密码哈希.我被告知使用此算法生成密码:ASP.NET成员资格使用的默认哈希算法是什么?.
我有示例密码哈希和盐(第一行是密码,第二行是盐):
"Password": "jj/rf7OxXM263rPgvLan4M6Is7o=",
"PasswordSalt": "/Eju9rmaJp03e3+z1v5s+A==",
Run Code Online (Sandbox Code Playgroud)
我知道哈希算法是SHA1,我知道上面的哈希是为输入生成的test123.但是我不能重现散列算法来为此输入获取相同的散列.我尝试了什么:
Password = "jj/rf7OxXM263rPgvLan4M6Is7o="
PasswordSalt = "/Eju9rmaJp03e3+z1v5s+A=="
crypto = require("crypto")
sha1 = crypto.createHash("sha1")
PasswordSalt = new Buffer(PasswordSalt, 'base64').toString('utf8')
sha1.update(PasswordSalt+"test123", "utf8")
result = sha1.digest("base64")
console.log(Password)
console.log(result)
Run Code Online (Sandbox Code Playgroud)
结果是:
jj/rf7OxXM263rPgvLan4M6Is7o=
xIjxRod4+HVYzlHZ9xomGGGY6d8=
Run Code Online (Sandbox Code Playgroud)
我能够得到C#算法:
using System.IO;
using System;
using System.Text;
using System.Security.Cryptography;
class Program
{
static string EncodePassword(string pass, string salt)
{
byte[] bytes = Encoding.Unicode.GetBytes(pass);
byte[] src = Convert.FromBase64String(salt);
byte[] dst = new byte[src.Length + bytes.Length];
Buffer.BlockCopy(src, …Run Code Online (Sandbox Code Playgroud) 尝试使用PHP针对现有ASP.NET成员资格数据库对用户进行身份验证时遇到一些问题。我搜索了网络,发现的现有答案似乎不适用于我。即:
public static function Hash($password, $salt)
{
$decodedSalt = base64_decode($salt);
$utf = mb_convert_encoding($password, 'UTF-16LE', 'UTF-8');
return base64_encode(sha1($decodedSalt.$utf, true));
}
Run Code Online (Sandbox Code Playgroud)
我认为问题的部分原因在于密码散列实际上不是使用SHA-1计算的,因为数据库中的值是44个字符长,base64编码的字符串(这意味着输入可能是256位长)。我尝试使用SHA-256代替SHA-1,但无济于事。我在web.config中找不到会进一步加重哈希值的机器密钥,并且当我在本地或在生产服务器上运行时,ASP.NET站点会生成相同的哈希值,因此我不知道为什么它们没有不匹配。
Web.config成员资格提供程序:
<add connectionStringName="MySqlMembershipConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" autogenerateschema="true" name="MySqlMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider, mysql.web" />
Run Code Online (Sandbox Code Playgroud)
例如密码应工作:
$salt = 'Mu1tp8XzfKl8dSTVAZm44A=='; // Straight from the DB
$password = 'testing';
$expectedHash = 'TQN7m8OWIyBOKVwzegWSUBVq7o7+KWFBc46J+B77mLw=' // Straight from the DB
// When using the above Hash function with SHA-256 instead of SHA-1
$generatedHash = 'rpmTmtBfWoJz71ooQGQUIIyQJKd99qhYxMUI1yda0qE='
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?知道为什么我的哈希值与数据库中存储的哈希值不匹配(以及为什么/如何在通过ASP.NET网站登录时起作用)吗?我尝试换出哈希函数,反转密码/盐的串联,并在打我的计算机时大声喊叫,但这些似乎都没有帮助。
我们如何找出MVC4使用的加密方式?我注意到有一个SALT选项,但这似乎也没有在WebSecurity()模块中使用.
我想知道使用的标准,以及是否可以轻松升级到最新的SHA
我有两个使用.net 4.0和.net 4.6.1的项目,KeyDerivation仅在.net 4.5.1之后可用。如何使用其他哈希库(例如 Rfc2898DeriveBytes/ Crypto)在 .Net 4.0 中获得相同的哈希结果
byte[] salt = new byte[128 / 8];
var hashedPassword = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: "GN(o@D30",
salt: salt,
prf: KeyDerivationPrf.HMACSHA512,
iterationCount: 100000,
numBytesRequested: 256 / 8)
);
Run Code Online (Sandbox Code Playgroud)