2017-07-27 8 views
1

私は誰かが私の問題を手伝ってくれることを期待しています。私は人事部で使用されるプログラムを作成する任務を受けています。このプログラムはイントラネットのサブセットであり、ユーザーの部門に基づいてさらに制限されます。このプログラムには、社会保障番号などの機密情報を保存する従業員プロファイルが含まれます。私はSSNを暗号化する最善の方法を見つけようとしています。そのため、SSNはデータベースのプレーンテキストとしては読み込めません。VB.NETを使用してweb.configに格納されたキーを使用してフィールドを暗号化するにはどうすればよいですか?

hereのように、System.Security.Cryptography名前空間を使用してVB.NETの組み込み関数を使用するコードが見つかりました。

コードは、フィールドが暗号化されているデータベースにデータが挿入されたときのように機能します。私が直面している問題は、従業員を元に戻したいとき、私はそれを解読することができないということです。

Dim rsa As New RSACryptoServiceProvider 

基本的に代わりに私が最初の場所でデータを暗号化するために使用されるものの新しい暗号化サービスプロバイダを定義します:私は復号化された値を必要とするページ上でこれを行うので、私の推測ではあります。新しいRSACryptoServiceProviderを実行するときに新しい公開鍵/秘密鍵のペアが生成されるかどうかは疑問です。

次に私は、web.configに暗号化キーと復号化キーを格納して、ユーザーがどのページにいてもデータを解読できるようにすることを考えました。実際にアプリケーションで使用するのではなく、web.config内のフィールドを暗号化/復号化する方法(パスワードやデータベースへの接続など)を示しているので、これを使用する良い例は見つかりませんでした。これはデータを暗号化する良い方法でしょうか?このように、イントラネットのサブセットになるので、アプリケーションは外部に公開されずにローカルに開催されます。私はSSNをデータベースで読めるようにすることに非常に不快です。

これは私の最初の暗号化への進出であり、これは簡単な質問であれば謝ります。

SQL Server 2008 R2に接続されたVisual Studio 2015でVB.NETを使用しています。誰もが持っている提案に私は開いています。

+0

あなたはイントラネットアクセスを制御プロファイルにSSNが必要なのはなぜ?情報がまったく必要ないように思える。私はその目的のために私のSSNを与えたくないことを知っています。 –

+0

ありがとうございます。 SSNは、イントラネットアクセスを制御するプロファイルとは関係ありません。 SSNは、HRだけが使用する従業員プロファイルで使用されます。 HRのみがActive Directoryのアクセス許可に基づいてこのページにアクセスできます。 HRが必要な場合、従業員に関するすべての情報を再作成できるという考えから、従業員プロファイルにSSNが必要です。 SSNは、そのフィールドが暗号化されている従業員データベースに存在します。うまくいけば、これは理にかなっている。 – msdev23

答えて

0

私が探していることをやり遂げる方法を考え出しました。 Alexのソリューションが動作する間に、VB.NETコード内で暗号化が行われると、異なるキーを渡すことができ、データの異なるセクションを別々に暗号化することができます。本質的に、誰かがキーの1つを取得した場合、データの一部しか持たず、すべてではありません。これは完璧な解決策ではありませんが、フィールドをデータベースの平文として表示するよりも優れています。

クラスファイルを作成してApp_Codeフォルダに配置し、Simple3Desという名前を付けました。クラスは次のようになります。

Imports System.Security.Cryptography 

Public Class Simple3Des 

    Private TripleDes As New TripleDESCryptoServiceProvider 

    Private Shared Function TruncateHash(ByVal key As String, ByVal length As Integer) As Byte() 
     Dim sha1 As New SHA1CryptoServiceProvider 
     //hash the key 
     Dim keyBytes() As Byte = System.Text.Encoding.Unicode.GetBytes(key) 
     Dim hash() As Byte = sha1.ComputeHash(keyBytes) 
     //truncate or pad the hash 
     ReDim Preserve hash(length - 1) 
     Return hash 
    End Function 

    Public Shared Function EncryptData(ByVal plaintext As String, ByVal key As String) As String 
     //convert the plaintext string to a byte array 
     Dim threeDes As New TripleDESCryptoServiceProvider 
     threeDes.Key = TruncateHash(key, threeDes.KeySize \ 8) 
     threeDes.IV = TruncateHash("", threeDes.BlockSize \ 8) 
     Dim plaintextBytes() As Byte = System.Text.Encoding.Unicode.GetBytes(plaintext) 
     //create the stream 
     Dim ms As New System.IO.MemoryStream 
     //create the encoder to write the byte array to the stream 
     Dim encStream As New CryptoStream(ms, threeDes.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write) 
     encStream.Write(plaintextBytes, 0, plaintextBytes.Length) 
     encStream.FlushFinalBlock() 
     //convert the encrypted stream to a printable string 
     Return Convert.ToBase64String(ms.ToArray) 
    End Function 

    Public Shared Function DecryptData(ByVal encryptedtext As String, ByVal key As String) As String 
     //convert the encrypted text string to a byte array 
     Dim threeDes As New TripleDESCryptoServiceProvider 
     threeDes.Key = TruncateHash(key, threeDes.KeySize \ 8) 
     threeDes.IV = TruncateHash("", threeDes.BlockSize \ 8) 
     Dim encryptedBytes() As Byte = Convert.FromBase64String(encryptedtext) 
     //create the stream 
     Dim ms As New System.IO.MemoryStream 
     //create the decoder to write to the stream 
     Dim decStream As New CryptoStream(ms, threedes.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Write) 
     //use the crypt stream to write the byte array to the stream 
     decStream.Write(encryptedBytes, 0, encryptedBytes.Length) 
     decStream.FlushFinalBlock() 
     //convert the plaintext stream to a string 
     Return System.Text.Encoding.Unicode.GetString(ms.ToArray) 
    End Function 

End Class 

その後、クラスを呼び出すには、以下を使用します。

//to encrypt 
Simple3Des.EncryptData("Data to encrypt", "key") 
//to decrypt 
Simple3Des.DecryptData("Data to decrypt", "key") 
0

暗号化されたデータは、暗号化キーと同じように保護されています。 Web.configやその他のファイルに暗号鍵を保存するのは便利ですが、それほど安全ではありません。データベースツールのみを使用して何をしたいことの

一つの方法は次のとおりです。

データベースのキーを使用してSSN列を暗号化するには、これはあなたがデータを復号化できるキーので、へのアクセス権を持つユーザーを制御することができます。 オプションで、データの復号化を試みるビューを作成したり、ユーザーが解読キーにアクセスできない場合はNULLを返すことができます。

KEY_SOURCE文字列を使用してキーを作成することをお勧めします。災害時に再作成したり、データベースマスターキーをバックアップしたりすることはできません。また、復旧テストを行わないと、回復不能に失われたデータ。

さらに詳しい情報は、この偉大な記事にあります。 https://www.mssqltips.com/sqlservertip/3081/using-views-to-expose-encrypted-data-in-sql-server/

+0

ありがとう、私はこれが動作すると思います。私は何かが欠落しているかどうかわからない、暗号化/復号化のパスワードはどこから来るのだろうか?それは私のvb.netアプリケーションからのパラメータとしてビューに渡すものですか?そうでなければ、ビューに入っていれば誰もデータベースにアクセスできず、パスワードを見たり、その情報にアクセスすることができますか? – msdev23

+0

復号化のパスワードは、SQL Serverのユーザー権限、つまりユーザーAがデータベースに接続し、ユーザーAが復号キーを使用する権限を持っているかどうかをチェックします。データがない場合はNULLが返されます。 – Alex

+0

[SQL Server暗号化](https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/sql-server-japan/)暗号化)を実行してから変更を行います。私はまた、自分自身を発明するのではなく、既存のアプローチの1つに従うことを強くお勧めします。全体的なセキュリティを大幅に損なう可能性のある設計/実装を少しでも省略するのは簡単です。 – Alex

関連する問題