https://crackstation.net/hashing-security.htm
https://www.bentasker.co.uk/blog/security/201-why-you-should-be-asking-how-your-passwords-are-stored
コメントで述べたように、パスワードのハッシュは、おそらく自分で行うべきではありません。
注意事項:
- SHA1 はパスワードに推奨されません
- パスワードはソルト化する必要があります
- 「間違ったことをする」可能性が高いため、独自のフレームワークを作成するのではなく、検証済みのユーザーストア フレームワークを使用する必要があります
- 他にもたくさんあると思います
そうは言っても 、特定の質問を達成するには、次のようなものが必要です:
Users
----
userId
passwordHashed
passwordHashed には、ユーザーのパスワードのハッシュ バージョンが保存されます (プレーン テキストのパスワードは永続的にどこにも保存されません)。
有効なパスワードを確認するには、次のようにします:
ALTER procedure [dbo].[proc_UserLogin]
@userid varchar(20),
@password nvarchar(50)
As
declare
@ReturnVal varchar(500)
SET NOCOUNT ON
if exists(select userid,password from LoginManager where [email protected] and password=HASHBYTES('SHA1', @password))
set @ReturnVal='0|Logged in Successfully'
else
set @ReturnVal='1|Login Failed/Username does not exist'
select @ReturnVal
ユーザーパスワードを挿入/更新するには、プレーンテキストのパスワードではなく、ハッシュ化されたパスワードを保存する必要があります。
INSERT INTO users(userId, passwordHashed)
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)
または
UPDATE users
SET passwordHased = HASHBYTES('SHA1', @rawPassword)
WHERE userId = @userId
編集:
SQL ではなく C# でハッシュを実行する方法を尋ねていることに気付きました。以下を実行できます (Hashing with SHA1 から取得)。 C# のアルゴリズム ):
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(temp);
return Convert.ToBase64String(hash);
}
}
コード スニップは次のようになります:
conn.Open();
string query = "EXEC dbo.proc_UserLogin'" + username.Text+ "', '" + this.Hash(System.Text.Encoding.UTF8.GetBytes(password.Text))+"'";
OleDbCommand cmd = new OleDbCommand(query, conn);
また、パラメーターをそのままの方法で渡すのではなく、パラメーターをストアド プロシージャにパラメーター化する必要があることにも注意してください。これに関しては、既に別の質問があるようです。