2016-10-18 4 views
-2

優れたSpring Security Pluginを使用するGrailsアプリケーションで作業しています。認証はOracle Access Managerを介して行われ、アプリケーションURLを保護します。ですからPreAuthフィルタを使うだけで、パスワードについて心配する必要はありません。今まで。Spring Securityセッションのプレーン・テキスト・パスワード

私たちが(冷凍サンプルを管理し、ユーザが誰かのサンプルを見ないようにユーザアクセス管理を必要とする)統合し、LDAPを使用する別のアプリケーションがあります。前記アプリケーションは、ユーザ名パスワードを取り込み、そのユーザのアクセスに基づいてデータを返すAPIを公開する(ユーザ機能の代わりにはない)。

問題は、私は自分のパスワードをユーザーに尋ねると、そのサービスにプレーンテキストのパスワードを送信する必要がです。だから、ハッシュとエンコーディングは可逆でなければならず、ハッシュコードを比較することはできません。可能な限り最良の方法でこれを管理する方法に関する提案はありますか?

私はサーバー上で作成されたランダムな塩を使って(そして6時間ごとにサイクルを繰り返す)、パスワードをエンコードして短命のクッキーに設定し、外部の呼び出し時にサーバー上でデコードすることを考えていましたサービス。この方法では、潜在的な攻撃者はサーバーのメモリとユーザーのシステムからのCookieからのデータを必要とし、プレーンテキストのパスワードはどこにも保存しません。ただの素朴な試み。非常に提案に開放されています。

+0

"問題は、ユーザーにパスワードを尋ねてプレーンテキストのパスワードをそのサービスに送る必要があることです。 - **これはまさに問題です。ある時点でプレーンテキストパスワードが必要な場合は、問題を難読化するのではなく解決してください。 – Krease

+0

@あなたがプレゼンテーションで迷惑をかけるかどうかはわかりません。私は大胆な文字を使用して、ユーザーが背景を読んでみたくない場合、私の質問に答えさせました。私はあなたが何を意味するか分かりません。パスワードが必要な外部APIを解決できません。それを最善に管理するための提案が必要です。そして私はどのように問題を難読化しましたか? –

+0

混乱の謝罪。ここで迷惑や理解の問題はありません。あなたはAPIを変更しないソリューションを探しています。私はこれが[XY問題](http://xyproblem.info/)だと思う - あなたの実際の問題ではなくあなたの試行された解決策を尋ねる。実際の問題は、プレーンテキストのパスワードを解読する必要があることです。理想的には、その要件を元に戻すことができます。私はこれが可能ではないかもしれないと認識しています。それは私が答えではなくコメントとして置く理由です。 「問題を難読化する」という私の声明は、塩/エンコーディング/ etcへの応答でプレーンテキストの問題を隠すことでした – Krease

答えて

0

だから私はこのように動作するように私のアプリケーションのいずれかをハッキング:Userクラスで

:(春のセキュリティUser.groovy)

static transients = ['springSecurityService', 'rawPassword'] 

//To bypass facebook users who log in via facebook 
//we will back up original hashed password string 
//log them in then save old password has by calling user.rawPassword=oldHash 
//this will update underlying password with string hash value 
void setRawPassword(String p) { 
    password=p 
} 

次に、関連するサービスに

//Get old password hash 
def oldPassword=user?.password 
     String authPassword 
     if (oldPassword) { 
      def uid = user.password + new UID().toString() + prng.nextLong() + System.currentTimeMillis() 
      MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
      byte[] hash = digest.digest(uid.getBytes("UTF-8")); 
      def token1 = hash.encodeBase64() 
      user.password = token1 
      //Generate a random password 
      authPassword = token1 
      //Update user Password to be random Password 
      UsernamePasswordAuthenticationToken uat1 = new UsernamePasswordAuthenticationToken(user.username, authPassword, null) 
      uat1.setDetails(user) 
      SecurityContext context = SecurityContextHolder.getContext() 
      //Re-setAuthentication of springSecurity using new Password 
      context.setAuthentication(uat1) 
      if (oldPassword) { 
       //Now we are authenticated let's set back the original Hash as the hash we collected in oldPassword 
       //just before doing the hack 
       user.rawPassword = oldPassword 
       user.save(flush: true) 
      } 
      springSecurityService.reauthenticate user.username 
     } 

これは、プロセスの変更中に(最後に)設定されたパスワードを変更せずにユーザーとして認証するという面倒なハックです。

私はそれを推奨していませんが、あなたが概説したものより簡単な選択肢かもしれません。

関連する問題