2009-07-31 40 views
8

Tôi có một chút mã cần chạy với các đặc quyền nâng cao (tôi muốn phần còn lại của mã của mình chạy).Cách đặt mật khẩu vào mã

Tôi có mã để thiết lập Mạo danh hoạt động nhưng yêu cầu tên người dùng, tên miền và mật khẩu. Như mã của tôi là trong C#. Net Tôi biết rằng mật khẩu có thể được tìm thấy bởi bất cứ ai xác định đủ.

Có cách nào để mã hóa mật khẩu trong mã của tôi không? Hoặc bảo mật mật khẩu này và vẫn có thể chuyển nó vào?

Đây là mã tôi kêu gọi:

using (new Impersonator("UserNameGoesHere", "DomainNameGoesGere", "Password Goes Here")) 
{ 
    uint output; 
    NetUserAdd(AUTHENTICATION_SERVER, 1, ref userinfo, out output); 
    return output; 
} 

Tôi rất thích một ví dụ cho thấy làm thế nào để khắc phục điều này để không hiển thị mật khẩu của tôi trong văn bản đơn giản.

Tôi đang sử dụng Visual Studio 2008, .NET 3.5 SP1 và chạy trên Windows Server 2003.

+0

Cảm ơn tất cả các câu trả lời tuyệt vời! Tôi sẽ thử chúng ra và chọn cái nào hoạt động tốt nhất. Cảm ơn một lần nữa! – Vaccano

Trả lời

2

Bạn không nói rõ nếu điều này là một máy tính để bàn hoặc ứng dụng web như vậy ...

ASP.NET 2.0 supports encrypting sections of the web.config.

+0

Liên kết của bạn trong bình luận cho câu trả lời của Sean là hữu ích nhất. Cảm ơn! – Vaccano

+0

http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx – Vaccano

4

Vaccano,

Tôi muốn giới thiệu tra API bảo vệ dữ liệu (DPAPI) cho những gì bạn đang cố gắng để đạt được. Nó được coi là một phần của giải pháp trong nhiều phương pháp thực hành tốt nhất để đảo ngược lưu trữ mật khẩu cần thiết bởi các ứng dụng.

Một bài viết tốt thảo luận về DPAPI (và các kỹ thuật khác + mối quan tâm) có thể được tìm thấy ở đây:

http://msdn.microsoft.com/en-us/magazine/cc164054.aspx

Với C# 2.0, P/Gọi là thậm chí không cần thiết; wrappers quản lý tồn tại:

http://blogs.freshlogicstudios.com/Posts/View.aspx?Id=41ca5a99-ddc0-4d0a-9919-2ce10bf50c7e

Tôi hy vọng điều này sẽ giúp!

+1

Jon Galloway có một số ví dụ về việc thực hiện điều này ... http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx – MyItchyChin

4

Bạn có nhiều lựa chọn ở đây.

  1. Bạn có thể băm mật khẩu lần đầu tiên và lưu băm vào một tệp. Bây giờ, lần sau, bạn muốn thực thi mã với các đặc quyền nâng cao, bạn cần phải chấp nhận/nhập lại mật khẩu và tính toán lại băm và kết hợp nó với băm được lưu trữ. Chỉ khi nó phù hợp với bạn sẽ thực thi mã của bạn trong chế độ độ cao. Bạn có thể băm bằng SHA. Hãy nhìn vào không gian tên System.Crytography cho các ví dụ về băm.

  2. Tùy chọn thứ hai là mã hóa mật khẩu bằng các thuật toán như AES. Tuy nhiên bạn sẽ cần phải có một chìa khóa để làm điều này và bạn sẽ phải lo lắng về việc bảo vệ khóa này.

  3. Tùy chọn thứ ba là sử dụng DPAPI và mã hóa mật khẩu nhưng không phải lo lắng về việc bảo vệ khóa - tùy chọn dễ dàng hơn nhiều so với 2.

Tôi khuyên bạn nên 1 nếu bạn không nhớ nhập lại mật khẩu mỗi khi ứng dụng bắt đầu. Nếu đó không phải là một khả năng, tôi sẽ đề nghị đi với 3 và sử dụng DPAPI.

Dưới đây là một số liên kết để giúp bạn bắt đầu.

1. http://www.obviex.com/samples/dpapi.aspx 2. http://www.obviex.com/samples/Encryption.aspx

+0

Đề xuất băm mật khẩu không lấy cầu vồng tấn công bảng vào tài khoản. Mật khẩu phải được "muối" trước khi nó được băm. Xem http://www.codinghorror.com/blog/archives/000949.html –

2

Bạn có thể sử dụng safe-config gói NuGet. Bên trong nó sử dụng api bảo vệ dữ liệu để mã hóa và giải mã dữ liệu.

//Save some configuration data at folder data\temp\ 
var configManager = new ConfigManager() 
    .WithOptions(DataProtectionScope.CurrentUser) 
    .Set("password", "my-massword") 
    .AtFolder(@"data\temp\") 
    .Save(); 

    ... 

//Load configuration data 
var loadedValue = new ConfigManager() 
    .AtFolder(@"data\temp\") 
    .Load() 
    .Get<string>("password"); 
Các vấn đề liên quan