2016-12-10 5 views
2

パスワードをリセットするにはサイト/アカウント/ {ハッシュ}へのリンクをユーザーに送信します。{ハッシュ}はユーザーのパスワードとタイムスタンプのハッシュです。
私は電子メールのみをハッシュして読めるリンクを持っているために、次のコードを持っている:ダイナミックパスワードリセットリンクの生成

String check = info.mail; 
    MessageDigest md = MessageDigest.getInstance("SHA-1"); 
    String checkHash = Base64.encodeBase64String(md.digest(check.getBytes())); 

    if(checkHash.equals(hash)){ 
     return ResponseEntity.ok("Password reset to: " + info.password); 
    }else{ 
     return ResponseEntity.ok("Hash didn't equal to: " + checkHash); 
    } 

問題は、私はBase64でこれを変換するとき、それは/何意志台無しに私のリンクをしてのチェック印を含むことができることですハッシュ。 ハッシュの後に不要な記号を置き換えることはできますが、ハッシュにコードの特定の部分のみを含める方法がありますか?

また、返品はまだ安全ではないことがわかりましたが、これはテストとデバッグのためのものです。

答えて

2

RFC 3548 specifies a variantは、しばしばその目的のために設計された「base64url」と呼ばれます。この変形例では、+および/は、-および_で置き換えられています。

Java 8には、新しいBase64 classの組み込みサポートが組み込まれています。古いバージョンの場合は、new Base64(true)コンストラクタを使用してURLを安全にするようにBase64 class of Apache Commonsを設定することができます。

その他のオプションは次のようになります。

  • のBase64を使用していますが、進 表現(特殊文字を含まないであろう)としてバイトを転送しないでください。

    String checkHash = toHex(md.digest(check.getBytes())); 
    

    private static String toHex(byte[] bytes) { 
        StringBuilder sb = new StringBuilder(); 
        for (byte b : bytes) { 
         sb.append(String.format("%02X", b)); 
        } 
        return sb.toString(); 
    } 
    
  • gのURLエンコード/デコードを使用するあなたがすでに知っているものです。