|
|
|
เข้ารหัสไฟล์ ASP.NET (C#) ใครพอทราบคำสั่งการเข้ารหัสไฟล์บ้างครับช่วยให้คำแนะนำหน่อย |
|
|
|
|
|
|
|
เก็บใส่ฐานข้อมูลเลยครับ
|
|
|
|
|
Date :
2010-05-21 15:56:51 |
By :
tungman |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ก็เจ็บใส่ฐานข้อมูลนั้นแหละครับแต่ตัวไฟล์มันนะอยากจะเข้ารหัสไว้นะครับป้องกันการแฮ็คนะครับ
|
|
|
|
|
Date :
2010-05-21 16:12:57 |
By :
loogway |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมหมายถึงเอาไฟล์ทั้งไฟล์เก็บลงฐานข้อมูลครับ มันจะกลายเป็น binary data ครับ
ถึงแฮคฐานข้อมูลได้ก็ยังลำบาก (นิดหน่อย) ในการเอา binary data กลับออกมาเป็นฐานเหมือนเดิม
แต่กว่าจะแฮคฐานข้อมูลได้นี่หืดขึ้นคอเหมือนกัน
|
|
|
|
|
Date :
2010-05-21 17:22:40 |
By :
tungman |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ข้อเสียของ binary data คือมันมีขนาดใหญ่ครับ
|
|
|
|
|
Date :
2010-05-22 10:01:54 |
By :
webmaster |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไม่เป็นไรครับ
พอดีขอพื้นที่ ms sql 2005 ของบริษัทไว้ 200G
แต่คุณวินเข้าใจเรื่องเข้ารหัสไฟล์ที่เขาถามไหมครับ
|
|
|
|
|
Date :
2010-05-22 10:06:15 |
By :
tungman |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เข้าใจครับ
|
|
|
|
|
Date :
2010-05-22 10:14:11 |
By :
webmaster |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แต่ผมไม่เข้าใจครับ
ความเข้าใจของผมคือ เขาต้องการอัฟโหลดไฟล์ขึ้น server โดยเข้ารหัสไฟล์นั้นด้วย
คือเปลี่ยนจากฟอร์แม็ตปกติไปเป็นฟอร์เม็ตอื่นที่เข้ารหัส เพื่อที่จะป้องกันผู้อื่นที่เข้ามา
ที่ server ไม่ว่าจะเป็นการ remote หรือ ftp ไม่สามารถอ่านไฟล์นั้นได้ ผมเข้าใจถูกไหมครับ
ซึ่งจริงๆ มันก็มีหลายวิธีที่จะป้องกันแต่ไม่ใช่วิธีเข้ารหัสไฟล์ ยกตัวอย่างเช่น กำหนดสิทธิ์การเข้าถึง
โฟร์เดอร์ที่อัฟโหลด ซึ่งต้องกำหนดที่ server และเป็นเรื่องยุ่งยากในการจัดการสิทธิ์ของแต่ละ user
แล้วผมเองก็รู้ปัญหาเกี่ยวกับการเอาไฟล์ลงฐานข้อมูลเช่นกัน แต่คิดว่ามันเป็นวิธีที่ง่ายที่จะจัดการเอกสาร
ที่ไม่ต้องการใช้ user ทั่วไปเข้าถึง และคิดว่า hardware ในสมัยนี้สามารถรองรับการทำแบบนั้นได้
อย่างสบายๆ แล้วจะสำคัญที่สุดคือผมขี้เกียจอธิบายอะไรยาวๆ
ปล. แล้วการรหัสไฟล์ที่ว่าเป็นอย่างไรหรือครับ ผมอยากรู้ รบกวนขอตัวอย่างเพื่อศึกษาด้วยครับ
เอาไว้เป็นแนวทางในการเลือกใช้งานอีกทางด้วย
|
|
|
|
|
Date :
2010-05-22 10:56:59 |
By :
tungman |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ถ้าเรา upload ไฟล์ไปเก็ยใน database เรื่องการเข้าถึงคงเป็นอย่างที่พี่ตึ๋งว่าแหละค่ะ
แต่ทุกอย่างมีข้อดีก็ต้องมีข้อเสีย ที่เคยได้ยินมานะคะ
เพราะไม่ค่อยได้ทำ network admin เท่าไหร่
ปกติอาจารย์จะให้เขียน storeprocedure ทำ report ไม่ก้อออกแบบ UI ค่ะ
ข้อเสียของการ upload file ลง database คือตัว database จะมีขนาดใหญ่มาก
ยิ่งเป็น MSSQL จะมีพื้นที่เผื่อเหลือที่ Database engine คำนวนไว้ด้วย
การบำรุงรักษาเช่น repair backup จะนานมาก เพราะมีกรณี server ของคณะ
ที่มี app ตัวนึง scan รูปแล้วเก็บไว้ใน database จะ backup ทีต่ำๆ ก็ครึ่งวันค่ะ
แต่ถ้า upload ไม่ค่อยเยอะ คงไม่เป็นอะไรมาก
ทีนี้มาเรื่อง code การจะเข้ารหัสอะไรสักอย่างก็แบ่งออกเป็นสองแบบคือ
เข้ารหัสทางเดียวคือเข้ารหัสไปแล้วจะถอดรหัสออกมาเหมือนเดิมไม่ได้
กับถอดเข้าถอดออกได้ ในกรณี request ของพี่ tum น่าจะเป็นกรณี 2
สำหรับ code ตัวอย่าง ขอเอา code จากที่อื่นมาแปะแล้วกันค่ะ
เพราะเขาอธิบายไว้ดีมาก นี่ค่ะ http://support.microsoft.com/kb/307010
|
|
|
|
|
Date :
2010-05-22 12:07:35 |
By :
blurEyes |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
รับทราบ ขอบคุณมากครับ
ขอรับไปใช้งานนะครับ
|
|
|
|
|
Date :
2010-05-22 12:24:36 |
By :
tungman |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
สร้าง class ชื่อ Security.cs ใน app_code แล้วก็อบ code นี้ไปใส่
Security.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// Summary description for Security
/// </summary>
public class Security
{
/// <summary>
/// สำหรับเข้ารหัส และถอดรหัส
/// </summary>
public Security()
{
//
// TODO: Add constructor logic here
//
}
/// <summary>
/// สร้าง Code สำหรับเปลี่ยนแปลงข้อมูลเพื่อความปลอดภัย
/// </summary>
/// <param name="EncryptString">ข้อความที่ต้องการเข้ารหัส</param>
/// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
/// <returns>ข้อความที่เข้ารหัสแล้ว</returns>
public static string EncryptString(string EncryptString, string SecretKey)
{
MemoryStream msEncrypt = new MemoryStream();
// System.Security.Cryptography
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
string secretKey = SafeKey(SecretKey);
// Key ที่ต้องใช้งานกันทั้งสองฝ่าย ข้อมูลลับ
DES.Key = ASCIIEncoding.ASCII.GetBytes(secretKey);
// กำหนด array vector ให้กับ RC2
DES.IV = ASCIIEncoding.ASCII.GetBytes(secretKey);
// ใช้ CreateEncryptor ในการเข้ารหัส
ICryptoTransform myEncryptor = DES.CreateEncryptor();
// ตัวแปร array สำหรับรับข้อความที่ต้องการเข้ารหัส ต้องแปลงเป็น ASCII
byte[] pwd = ASCIIEncoding.ASCII.GetBytes(EncryptString);
// เข้ารหัสข้อมูล ข้อมูลที่เข้ารหัสเรียบร้อยแล้วจะเก็บไว้ที่ msEncrypt
CryptoStream myCryptoStream = new CryptoStream(msEncrypt, myEncryptor, CryptoStreamMode.Write);
myCryptoStream.Write(pwd, 0, pwd.Length);
myCryptoStream.Close();
// ส่งค่าที่ encrypt แล้วกลับไป
return Convert.ToBase64String(msEncrypt.ToArray());
}
/// <summary>
/// ถอดรหัส
/// </summary>
/// <param name="DecryptString">ข้อความที่ต้องการถอดรหัส</param>
/// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
/// <returns>ข้อความที่ถอดรหัสแล้ว</returns>
public static string DecryptString(string DecryptString, string SecretKey)
{
MemoryStream msDecrypt = new MemoryStream();
// System.Security.Cryptography
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
string secretKey = SafeKey(SecretKey);
// Key ที่ต้องใช้งานกันทั้งสองฝ่าย ข้อมูลลับ
DES.Key = ASCIIEncoding.ASCII.GetBytes(secretKey);
// กำหนด array vector ให้กับ RC2
DES.IV = ASCIIEncoding.ASCII.GetBytes(secretKey);
// ใช้ CreateDecryptor ในการเข้าถอดรหัส
ICryptoTransform myDecryptor = DES.CreateDecryptor();
// ตัวแปร array สำหรับรับข้อความที่ต้องการถอดรหัส ไม่ต้องแปลงเป็น ASCII
byte[] pwd = Convert.FromBase64String(DecryptString);
// เข้ารหัสข้อมูล ข้อมูลที่เข้ารหัสเรียบร้อยแล้วจะเก็บไว้ที่ msDecrypt
CryptoStream cCryptoStream = new CryptoStream(msDecrypt, myDecryptor, CryptoStreamMode.Write);
cCryptoStream.Write(pwd, 0, pwd.Length);
cCryptoStream.Close();
// ส่งค่าที่ decrypt แล้วกลับไป ต้องแปลงจาก ASCII ให้กลับเป็น string ก่อน
return ASCIIEncoding.ASCII.GetString(msDecrypt.ToArray());
}
/// <summary>
/// เข้ารหัสเอกสาร
/// </summary>
/// <param name="InputFilePath">ชื่อเอกสารที่ต้องการเข้ารหัส</param>
/// <param name="OutputFilePath">ชื่อเอกสารที่เข้ารหัสแล้ว</param>
/// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
public static void EncryptFile(string InputFilePath, string OutputFilePath, string SecretKey)
{
FileStream fsInput = new FileStream(InputFilePath, FileMode.Open, FileAccess.Read);
FileStream fsEncrypted = new FileStream(OutputFilePath, FileMode.Create, FileAccess.Write);
string secretKey = SafeKey(SecretKey);
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(secretKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(secretKey);
ICryptoTransform desencrypt = DES.CreateEncryptor();
CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write);
byte[] bytearrayinput = new byte[fsInput.Length];
fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Close();
fsInput.Close();
fsEncrypted.Close();
}
/// <summary>
/// ถอดรหัสเอกสาร
/// </summary>
/// <param name="InputFilePath">ชื่อเอกสารที่ต้องการถอดรหัส</</param>
/// <param name="OutputFilePath">ชื่อเอกสารที่ถอดรหัสแล้ว</param>
/// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
public static void DecryptFile(string InputFilePath, string OutputFilePath, string SecretKey)
{
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
string secretKey = SafeKey(SecretKey);
//A 64 bit key and IV is required for this provider.
//Set secret key For DES algorithm.
DES.Key = ASCIIEncoding.ASCII.GetBytes(secretKey);
//Set initialization vector.
DES.IV = ASCIIEncoding.ASCII.GetBytes(secretKey);
//Create a file stream to read the encrypted file back.
FileStream fsread = new FileStream(InputFilePath, FileMode.Open, FileAccess.Read);
//Create a DES decryptor from the DES instance.
ICryptoTransform desdecrypt = DES.CreateDecryptor();
//Create crypto stream set to read and do a
//DES decryption transform on incoming bytes.
CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);
//Print the contents of the decrypted file.
StreamWriter fsDecrypted = new StreamWriter(OutputFilePath);
fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
fsDecrypted.Flush();
fsDecrypted.Close();
}
// Call this function to remove the key from memory after use for security
[DllImport("KERNEL32.DLL", EntryPoint = "RtlZeroMemory")]
private static extern bool ZeroMemory(IntPtr Destination, int Length);
/// <summary>
/// สร้าง 64 bits Key สำหรับเข้ารหัสและถอดรหัส
/// </summary>
/// <returns>Key สำหรับเข้ารหัสและถอดรหัส</returns>
public static string GenerateKey()
{
// Create an instance of Symetric Algorithm. Key and IV is generated automatically.
DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
// Use the Automatically generated key for Encryption.
return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
}
/// <summary>
/// ลบข้อมูล Key ออกจากหนวยความจำ
/// </summary>
/// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
public static void RemoveKey(string SecretKey)
{
// For additional security Pin the key.
GCHandle gch = GCHandle.Alloc(SecretKey, GCHandleType.Pinned);
// Remove the Key from memory.
ZeroMemory(gch.AddrOfPinnedObject(), SecretKey.Length * 2);
gch.Free();
}
/// <summary>
/// สร้าง Key สำหรับเข้ารหัสและถอดรหัส
/// </summary>
/// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
/// <returns>Key สำหรับเข้ารหัสและถอดรหัสที่ตรงกับ Algoritm</returns>
private static string SafeKey(string SecretKey)
{
string safeKey = string.Empty;
if (SecretKey.Length > 8)
{
safeKey = SecretKey.Substring(0, 8);
}
else if (SecretKey.Length < 8)
{
safeKey = SecretKey;
for (int i = SecretKey.Length; i < 8; i++)
safeKey += (i + 1).ToString();
}
else
{
safeKey = SecretKey;
}
return safeKey;
}
}
วิธีใช้
string sSecretKey = Security.GenerateKey();
// Encrypt the file.
Security.EncryptFile(@"C:\MyData.txt", @"C:\Encrypted.txt", sSecretKey);
// Decrypt the file.
Security.DecryptFile(@"C:\Encrypted.txt", @"C:\Decrypted.txt", sSecretKey);
// Remove the Key from memory.
Security.RemoveKey(sSecretKey);
|
|
|
|
|
Date :
2010-05-27 15:34:26 |
By :
tungman |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
คือไม่เกี่ยวกับหัวข้อนะครับ
แต่อยากทราบว่า
/// <summary>
/// สร้าง Key สำหรับเข้ารหัสและถอดรหัส
/// </summary>
/// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
/// <returns>Key สำหรับเข้ารหัสและถอดรหัสที่ตรงกับ Algoritm</returns>
คืออะไร
ถ้า // พอเข้าใจว่าเป็นคอเม้น
แต่ถ้า /// คือยังไง
ช่วยตอบหน่อยครับ
ไม่รู้จิงๆ
|
|
|
|
|
Date :
2010-05-30 19:27:40 |
By :
ไม่รู้เรื่องเลย |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
มันคือ สีเทาๆ
|
|
|
|
|
Date :
2010-05-30 20:53:26 |
By :
tungman |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
มันคือสีเทาๆ???
|
|
|
|
|
Date :
2010-05-30 23:17:55 |
By :
loofy |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Intellisense description ค่ะเวลาเราพิมพ์ใช้งานมันจะอรรถาธิบายว่า
method นี้ไว้ทำอะไร parameter คืออะไร ตามที่เราเขียน
และถ้าติด plug-in พวก document generator
ก็จะเป็นการอธิบาย method ใน class ใน diagram ค่ะ
|
|
|
|
|
Date :
2010-05-31 04:55:54 |
By :
blurEyes |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ใช้วิธีการเข้ารหัส แล้เอาไปตรวจสอบกับข้อมูลที่อยู่ใน database ว่าตรงกันหรือไม่
|
ประวัติการแก้ไข 2011-04-28 15:22:15
|
|
|
|
Date :
2011-04-28 14:40:53 |
By :
chon2008 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณมากครับ
|
ประวัติการแก้ไข 2011-04-28 15:22:59
|
|
|
|
Date :
2011-04-28 14:44:28 |
By :
chon2008 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ถอดรหัส ไม่ได้ครับ
SecretKey คือตัวที่ใช้ในการเข้ารหัส
Code (C#)
.....
/////
....
string strSQLSelected = "SELECT * FROM [Brand] WHERE [BrandID]= " + Session["BrandID"];
.....
/////
....
if (dt.Rows.Count > 0)
{
BrandID = dt.Rows[0]["BrandID"].ToString();
this.lblBrandName.Text = Security.DecryptString(dt.Rows[0]["BrandName"].ToString(), "SecretKey");////////////////Error เกิดบันทัดนี้
}
Error:
System.Security.Cryptography.CryptographicException: Bad Data. at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr) at System.Security.Cryptography.Utils._DecryptData(SafeKeyHandle hKey, Byte[] data, Int32 ib, Int32 cb, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode PaddingMode, Boolean fDone) at System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) at
System.Security.Cryptography.CryptoStream.FlushFinalBlock() at System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing) at
System.IO.Stream.Close() at .........Class.Security.DecryptString(String DecryptString, String SecretKey) in .....Part file\Class\Security.cs:line 81
ช่วยหาวิธีแก้ด้วยนะครับ
ขอบคุณครับ
|
ประวัติการแก้ไข 2011-04-28 15:49:51
|
|
|
|
Date :
2011-04-28 15:49:12 |
By :
chon2008 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 05
|