2011-03-31 13 views
0

もう少し背景情報を提案しました: 私はイントラネットCMS Webアプリケーションのどこに製品API(ASP.NETベース)を使用しなければならないのですか。時間の制約とWindows認証の問題のために、私はスタッフがパーソナライズされたコンテンツを表示するためにサイトにアクセスするたびに再度ログインする必要がないようにする別の方法が必要です。それが動作する方法は、ユーザがログインすると(ユーザ名/パスワード)、パーソナライズされたコンテンツを表示するために使用される新たな異なるセキュリティコンテキスト値を格納するセッションIDが生成されることである。呼び出されるAPIログインメソッドは、ユーザー名とパスワードをパラメーターとして使用します。スタッフが次回にサイトにアクセスする際に自動的にログインする方法は、パスワードを暗号化されたCookieに保存し、サイトが訪問されたときに既存のものを確認してから、ユーザー名とパスワードを使用してAPIログインメソッドを呼び出しますクッキー値。解読時にC#の暗号化コードでエラーが発生しました!

代替案として、他のアイデアを歓迎します。

のMo

こんにちは、 私は、パスワード文字列の暗号化と復号化にウェブ上で発見いくつかのコードを使用しています。それはうまく暗号化されますが、文字列を解読するために以下のコードを呼び出すと、エラー "をデコードするデータの長さが無効です"どうすれば解決できますか?

ありがとうございます。

のMo

System.Text.Encoding enc = System.Text.Encoding.ASCII; 
      byte[] myByteArray = enc.GetBytes(_pword); 


      SymmetricAlgorithm sa = DES.Create(); 
      MemoryStream msDecrypt = new MemoryStream(myByteArray); 
      CryptoStream csDecrypt = new CryptoStream(msDecrypt, sa.CreateDecryptor(), CryptoStreamMode.Read); 
      byte[] decryptedTextBytes = new Byte[myByteArray.Length]; 
      csDecrypt.Read(decryptedTextBytes, 0, myByteArray.Length); 
      csDecrypt.Close(); 
      msDecrypt.Close(); 

      string decryptedTextString = (new UnicodeEncoding()).GetString(decryptedTextBytes); 

答えて

0

私は実際に前にこのエラーを持っていたし、それが解決策を把握するために3日かかりました。この問題は、暗号化に必要なマシンキーをマシン自体に登録する必要があるという事実になります。

DES暗号化を完全に読み、それはアプリケーションキーとマシンレベルのキーで動作します。機械キーがないために発生したエラーが考えられます。

0

(暗号化方式で)_pword文字列を作成するために使用されたバイトとGetBytesで取得されたバイトを比較します。おそらくあなたはそこにデータの変化に気付くでしょう。

暗号化されたバイトを格納するには、Convert.ToBase64Stringを使用し、Convert.FromBase64Stringを使用して暗号化されたパスワードを文字列に/から変換する必要があると思います。

キーとIVを設定したコードも表示されません。パスワードを暗号化して解読するために別のキーを使用していると思います。

現在のKeyプロパティがnullの場合、 GenerateKey方法は、新しいランダムキーを作成 に呼ばれています。 現在のIVプロパティがnullの場合、 GenerateIVメソッドが呼び出され、 新しいランダムIVが作成されます。

3

ここでは物事のカップル...

  1. 通常はパスワードを暗号化してはいけません。 hashとする必要があります。

暗号化の道を続けると決めたら...

  1. あなたはDESアルゴリズムを使用しています。これは安全でないとみなされています。私はAESアルゴリズムを調べることをお勧めします。
  2. どのくらいのデータを扱っているかによって、CryptoStreamは過度の可能性があります。
  3. ASCIIコードを使用すると、キリル文字のようなASCII以外のデータが失われる可能性があります。推奨される修正は、UTF8のような他のものを使用することです。

ここでは一例です:

string text = "Hello"; 
using (var aes = new AesManaged()) 
{ 
    var bytes = System.Text.Encoding.UTF8.GetBytes(text); 
    byte[] encryptedBytes; 
    using (var encrypt = aes.CreateEncryptor()) 
    { 
     encryptedBytes = encrypt.TransformFinalBlock(bytes, 0, bytes.Length); 
    } 
    byte[] decryptedBytes; 
    using (var decrypt = aes.CreateDecryptor()) 
    { 
     decryptedBytes = decrypt.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length); 
    } 
    var decryptedText = System.Text.Encoding.UTF8.GetString(decryptedBytes); 
    Console.Out.WriteLine("decryptedText = {0}", decryptedText); 
} 

これは、ランダムキーを毎回使用します。いくつかのデータを暗号化し、後で復号化する必要がある可能性があります。 AesManagedオブジェクトを作成するときは、KeyIVプロパティを格納できます。必要に応じて同じキーを再利用できますが、異なるデータは常に異なるIV(初期化ベクトル)で暗号化する必要があります。あなたがその鍵を保管する場所はあなた次第です。そのため、ハッシュがより良い選択肢になる可能性があります。キーがなく、安全にキーを保管することを心配する必要はありません。

あなたはハッシュルートを下に移動したい場合は、ここで小さな例です。

var textToHash = "hello"; 
using (SHA1 sha = new SHA1Managed()) 
{ 
    var bytesToHash = System.Text.Encoding.UTF8.GetBytes(textToHash); 
    var hash = sha.ComputeHash(bytesToHash); 
    string base64hash = Convert.ToBase64String(hash); 
} 

これは、パスワードに正常に動作する必要がありSHA1アルゴリズムを使用し、しかし、あなたはSHA256を検討する必要があります。

コンセプトは単純です:ハッシュは、入力のための(主に)独自の出力を生成します、しかし、出力が入力に戻すことはできません - それは破壊的です。ユーザーを認証する必要があるかどうかを確認する場合は、パスワードをハッシュして、正しいパスワードのハッシュと照合してください。そうすれば、あなたは何か重要なものを保管していません。

+0

パスワードは、内部Webアプリケーションに使用されます。私は代わりにハッシュルートを下るかもしれないと思う。私がどこで例を見つけることができるのか? – mjakda

+0

@mjakda:回答が更新されました。 – vcsjones

+0

しかし、ユーザーが新しい訪問の比較のためにパスワードを入力しないシナリオでは、ハッシングは効果がありますか? – mjakda

0

DESは、ブロックベースの暗号化である - バッファのみ特定の長さが有効です。正しく覚えていれば、DESのブロックサイズは64ビットなので、バイト配列が8バイトの倍数になるようにする必要があります。

(これはあなたの直ぐの問題を解決するはずですが、私はここで他の人々の助言を参考にしています - 新しいコードにはDESを使用しないでください、そしてパスワードは暗号化するよりもハッシュする方が適切です。

関連する問題