Mật khẩu băm và muối trong C #
https://crackstation.net/hashing-security.htm
https://www.bentasker.co.uk/blog/security/201-why-you-should-be-asking-how-your-passwords-are-stored
Như tôi đã nêu trong phần nhận xét của mình, băm mật khẩu là điều mà có lẽ bạn không nên tự làm.
Một số điều cần lưu ý:
- SHA1 không được khuyến nghị cho mật khẩu
- Mật khẩu nên được ướp muối
- Bạn nên sử dụng khung userstore đã được xác minh thay vì cố gắng tạo khung của riêng bạn, vì bạn có thể sẽ "làm sai"
- Tôi chắc rằng còn nhiều điều khác nữa
Điều đó đang được nói , để hoàn thành câu hỏi cụ thể của bạn, bạn sẽ muốn một cái gì đó như sau:
Users
----
userId
passwordHashed
passwordHashed lưu trữ phiên bản đã băm của mật khẩu của người dùng (mật khẩu văn bản thuần túy không bao giờ được lưu trữ lâu dài ở bất kỳ đâu.)
để kiểm tra mật khẩu hợp lệ, điều gì đó giống như thế này đã được thực hiện:
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
Để chèn / cập nhật mật khẩu người dùng, bạn cần đảm bảo lưu trữ mật khẩu đã băm chứ không phải mật khẩu văn bản thuần túy, chẳng hạn như vậy;
INSERT INTO users(userId, passwordHashed)
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)
hoặc
UPDATE users
SET passwordHased = HASHBYTES('SHA1', @rawPassword)
WHERE userId = @userId
CHỈNH SỬA:
chỉ nhận ra rằng bạn đang hỏi cách thực hiện băm trong C #, không phải SQL. Bạn có thể thực hiện những điều sau (lấy từ Hashing với SHA1 Thuật toán trong C # ):
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(temp);
return Convert.ToBase64String(hash);
}
}
Đoạn mã của bạn có thể là:
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);
Bạn cũng nên lưu ý rằng bạn nên tham số hóa các tham số của mình cho thủ tục được lưu trữ của bạn thay vì chuyển chúng theo cách của bạn - có vẻ như bạn đã có một câu hỏi riêng về điều đó.