2017-10-25 4 views
1

「パスワードを忘れた」活動のセキュリティソリューションをお探しの場合私が使用している現在のコードでは、パスワードをソースコードにハードコードして、誰かがコンパイルできないようにする必要があります。アンドロイドスタジオのGmail送信者のハードコードされたパスワードの偽装または暗号化方法

パブリッククラスForgotPassActivityはAppCompatActivity {

private Button sendRequest; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_forgot_pass); 

    sendRequest = (Button) findViewById(R.id.btn_send); 

    sendRequest.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      new Thread(new Runnable() { 
       public void run() { 
        try { 
         GMailSender sender = new GMailSender(
           "[email protected]", 
           "myPassword"); 
         sender.sendMail("Test mail", "This mail has been sent from android app", 
           "[email protected]", 
           "[email protected]"); 
        } catch (Exception e) { 
         Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show(); 
        } 
       } 
      }).start(); 
     } 
    }); 
} 

}

パブリッククラスGMailSenderがjavax.mail.Authenticator {

private String mailhost = "smtp.gmail.com"; 
private String user; 
private String password; 
private Session session; 

static { 
    Security.addProvider(new com.provider.JSSEProvider()); 
} 

public GMailSender(String user, String password) { 
    this.user = user; 
    this.password = password; 

    Properties props = new Properties(); 
    props.setProperty("mail.transport.protocol", "smtp"); 
    props.setProperty("mail.host", mailhost); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.port", "465"); 
    props.put("mail.smtp.socketFactory.port", "465"); 
    props.put("mail.smtp.socketFactory.class", 
      "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 
    props.setProperty("mail.smtp.quitwait", "false"); 

    session = Session.getDefaultInstance(props, this); 
} 

protected PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(user, password); 
} 

public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception { 
    try{ 
     MimeMessage message = new MimeMessage(session); 
     DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain")); 
     message.setSender(new InternetAddress(sender)); 
     message.setSubject(subject); 
     message.setDataHandler(handler); 
     if (recipients.indexOf(',') > 0) 
      message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients)); 
     else 
      message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients)); 
     Transport.send(message); 
    }catch(Exception e){ 
     Log.e("SendMail", e.getMessage(), e); 
    } 
} 

public class ByteArrayDataSource implements DataSource { 
    private byte[] data; 
    private String type; 

    public ByteArrayDataSource(byte[] data, String type) { 
     super(); 
     this.data = data; 
     this.type = type; 
    } 

    public ByteArrayDataSource(byte[] data) { 
     super(); 
     this.data = data; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public String getContentType() { 
     if (type == null) 
      return "application/octet-stream"; 
     else 
      return type; 
    } 

    public InputStream getInputStream() throws IOException { 
     return new ByteArrayInputStream(data); 
    } 

    public String getName() { 
     return "ByteArrayDataSource"; 
    } 

    public OutputStream getOutputStream() throws IOException { 
     throw new IOException("Not Supported"); 
    } 
} 

}

にライセンス

/* *を拡張を拡張しますApacheソフトウェア財団( ASF)を1つまたは複数のライセンス契約の下で使用することができます。著作権の所有権に関する追加情報については、 *と一緒に配布されているNOTICEファイルを参照してください。 * ASFはこのファイルをApache License、Version 2.0 *(以下「ライセンス」といいます。このファイルは、 *のライセンスに準拠する場合を除き、使用しないでください。適用される法律または書面での同意がない限りあなたは保証なし* BASIS、 「そのまま」で配布され、ライセンスの下で配布*、* * * http://www.apache.org/licenses/LICENSE-2.0 * でソフトウェア を許諾書のコピーを入手することができます明示的にも黙示的にも、いかなる種類の条件にも適用されます。 *ライセンスに関連する特定の言語についてはライセンスを、ライセンスには *制限を参照してください。 */

import java.security.AccessController; import java.security.Provider;

公共finalクラスJSSEProviderはあなたがAndroidアプリ内で秘密鍵を維持することはできませんプロバイダー{

public JSSEProvider() { 
    super("HarmonyJSSE", 1.0, "Harmony JSSE Provider"); 
    AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() { 
     public Void run() { 
      put("SSLContext.TLS", 
        "org.apache.harmony.xnet.provider.jsse.SSLContextImpl"); 
      put("Alg.Alias.SSLContext.TLSv1", "TLS"); 
      put("KeyManagerFactory.X509", 
        "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl"); 
      put("TrustManagerFactory.X509", 
        "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl"); 
      return null; 
     } 
    }); 
} 

}

答えて

0

を拡張します。

この機能をバックエンドサーバーに実装したい場合があります。サーバーに電子メールを送信するだけで、サーバーはそのアドレスで電子メールを送信します。

+0

私はあなたのソリューションが好きです!私はこの質問をした後、自分でそれをすることを考えていただけです。あなたの答えをありがとう。 –

+0

ようこそ。 :) –

関連する問題