2016-07-03 13 views
0

私はC#プログラミングの全く新しい学生です。私は現在MVCを使ってミニセキュリティプロジェクトを行っています。プロジェクト: ユーザーにはアカウントを含むcsvファイルをアップロードできますが、パスワードはハッシュと塩ではありません。 (完了) 次に、ファイルをvirustotalに送信し、サーバーに保存する前にスキャンします(完了) 保存後、データをcsvファイルに挿入し、パスワードをデータベースにハッシュして暗号化する必要があります。 (助けが必要)csvからパスワードをハッシュして塩に追加する方法C#

マイコントローラー

public ActionResult Upload(HttpPostedFileBase file) 
    { 
     if (System.IO.Path.GetExtension(file.FileName).Equals(".csv")) 
     { 
      //{0} = Y, {1} = M, {2} = D, {3} = H, {4} = min, {5} = Sec 
      string datetime = string.Format("{0}{1}{2}-{3}{4}{5}", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second); 
      string fileName = string.Format("{0}_{1}.csv", file.FileName.Substring(0, (file.FileName.Length - 4)), datetime); 
      var fileStream = new System.IO.MemoryStream(); 
      file.InputStream.CopyTo(fileStream); 

      var vtObj = new VirusTotal("%API KEY%"); 
      vtObj.UseTLS = true; 
      try 
      { 
       var fileResults = vtObj.ScanFile(fileStream, fileName); 
       var report = vtObj.GetFileReport(fileResults.ScanId); 

       int resPos = report.Positives; 

       if (resPos == 0) 
       { 
        string savePath = Server.MapPath("~/CSV/" + fileName); 
        file.SaveAs(savePath); 
        try 
        { 
         //removing the first row 
         insertDB(fileName, savePath); 
         ViewBag.error = "Updated successfully"; 
         return View(); 

        } 
        catch (Exception ex) 
        { 
         ViewBag.error = "Unable to update DB" + ex; 
         return View("Index"); 
        } 
       } 
       else 
       { 
        ViewBag.error = "Unable to upload"; 
        return View("Index"); 
       } 
      } 
      catch (Exception ex) 
      { 
       ViewBag.error = string.Format("Unable to upload | One min only can upload 4 times | {0} | {1}", ex, fileName); 
       return View("Index"); 
      } 
     } 
     else 
     { 
      ViewBag.error = "Unable to upload"; 
      return View("Index"); 
     } 
    } 

    public void insertDB(string fileName, string savePath) 
    { 

     using (DB01Entities dbc = new DB01Entities()) 
     { 
      string sql = string.Format(@"CREATE TABLE [dbo].[TempImport] 
             (
              Name varchar(255), 
              Password VARBINARY(50) 
             ) 

             bulk insert [dbo].[TempImport] from '%MyPATH%\CSV\{0}' with (ROWTERMINATOR = '\n') 

             INSERT INTO dbo.Employee 
             (
              Name 
              Password 
             ) 
             SELECT name 
             FROM  dbo.TempImport 

             DROP TABLE dbo.TempImport", fileName); 
      dbc.Database.ExecuteSqlCommand(sql); 
      dbc.SaveChanges(); 
     } 
    } 
} 
} 

マイ指数

@{ 
ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

@using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
<input type="file" name="File" id="file" accept=".csv"/> 
<input type="submit" value="Upload" /> 
<div class="error">@ViewBag.error</div> 
} 

アップロード

@{ 
ViewBag.Title = "Upload"; 
} 

<div class="success">@ViewBag.error</div> 
<a href="/Home/Index">Back to Index>></a> 

答えて

1

と:

あなたはASP.NETを使用しているので、Cryptoクラスを使用しますパスワードをハッシュする:

var hashedPassword = Crypto.HashPassword(plainTextPassword); 

後でプレーンテキストのバージョンを確認したい場合は、

bool matches = Crypto.VerifyHashedPassword(hashedPassword, plainTextPassword); 
を使用

ハッシュ化されたパスワードには、ハッシュ処理に使用するソルトが含まれています.Cryptoは、パスワードハッシュからソルトを抽出する方法を知っています。

あなたから読み込むためのストリームを持っているので:

using(var reader = new StreamReader(fileStream)) 
{ 
    using (DB01Entities dbc = new DB01Entities()) 
    { 
     while(reader.Peek != -1) 
     { 
      var parts = reader.ReadLine().Split(','); 
      var hashedPassword = Crypto.HashPassword(parts[1]); 
      dbc.Employees.Add(new Employee { Name = parts[0], Password = hashedPassword }); 
     } 

     dbc.SaveChanges(); 
    } 
} 

あなたはちょうどあなたが既にメモリに持ってバイトを使用することができますので、これはまた、任意の場所に保存するファイルを必要としないという利点を有します。

+0

このソリューションは良いですが、安全な方法である 'Crypto.HashPassword'を使用しています。それはハッシュの反復を含む。 – zaph

+0

こんにちは、私は文字列を[パスワード= hashedPassword]でバイト[]に変換できません –

-1

SQLステートメントを変更し、SQLを経由して一括挿入は必要条件ではないと仮定すると、それに静的な塩を加える

CREATE TABLE [dbo].[TempImport] (
Name varchar(50) 
Password varchar(50) 
) 
bulk insert [dbo].[TempImport] from '%Abs_Path%' with (ROWTERMINATOR = '\n') 
INSERT INTO dbo.Employee 
(
Name 
Password 
) 
SELECT Name, HASHBYTES('SHA1', (Password+'+_)(*&^%$#@!')) FROM dbo.TempImport 
DROP TABLE dbo.TempImport 
+1

塩を追加するだけでは十分なセキュリティが提供されなくなりました。 OWASP(オープンWebアプリケーションセキュリティプロジェクト)[パスワード保存チートシート](https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet#Leverage_an_adaptive_one-way_function)を参照してください。 Security Stackexchangeの[パスワードを安全にハッシュする方法、The Theory](http://security.stackexchange.com/questions/211/how-to-securely-hash-passwords/31846#31846)を参照してください。 – zaph

+1

1. SHA-1を使用しないでください。SHA-256などのSHA-2機能を使用してください。 2.静的な塩を使用しないで、同じパスワードを使用するすべてのエントリが同じ塩を持つので、他のすべてが公開されていることがわかったら、DBにも保存されているランダムな塩を使用します。 3.塩を連結するだけではなく、HMAC機能を使用してください。 4.計算ハッシュが非常に高速であるため、ハッシュ関数を反復する必要があります。 5.「Crypto.HashPassword」、「PBKDF2」、「password_hash」、「bcrypt」、スクリプトなどの標準的なパスワード派生関数を使用してください。 – zaph

関連する問題