質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Q&A

解決済

1回答

3339閲覧

画面に入力したパスワードを暗号化してDBに登録したい

mario11222

総合スコア4

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

0グッド

0クリップ

投稿2021/09/28 13:14

編集2021/09/29 13:15

前提・実現したいこと

起こっている事象
DAOにパスワードを暗号化する処理を追加し、画面にパスワードを入力後、登録ボタンを押下したが、登録が失敗する。デバックしたところ、SQLExceptionがcatchされている。

実現したいこと
画面にパスワードを入力し、登録ボタンを押下した場合に暗号化されたパスワードをDBに登録したい

ご教授いただけたら幸いです。

参考にしたURL
https://teratail.com/questions/230629
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12217713427

該当のソースコード

JavaBeans

1package model; 2 3import java.io.Serializable; 4 5public class User implements Serializable { //ログイン情報にメールアドレスを追加 6 private String name; //ユーザー名 7 private String mail; //メールアドレス 8 private String pass; //パスワード 9 10 public User() {} 11 12 public User(String name,String mail,String pass) { 13 this.name = name; 14 this.mail = mail; 15 this.pass = pass; 16 } 17 18 public String getName() { 19 return name; 20 } 21 22 23 public String getMail() { 24 return mail; 25 } 26 27 public String getPass() { 28 return pass; 29 } 30 31 public void setName(String name) { 32 this.name = name; 33 } 34 35 public void setMail(String mail) { 36 this.mail = mail; 37 } 38 39 public void setPass(String pass) { 40 this.pass = pass; 41 } 42}

Java

1暗号化のメソッド 2package model; 3 4public class Encryption { 5 6public String seacret(String password) { 7 String source = password; 8 9 Charset charset = StandardCharsets.UTF_8; 10 11 String algorithm = "MD5"; 12 13 byte[] bytes = null; 14 try { 15 bytes = MessageDigest.getInstance(algorithm).digest(source.getBytes(charset)); 16 }catch(NoSuchAlgorithmException e){ 17 e.printStackTrace(); 18 } 19 20 String result = DatatypeConverter.printHexBinary(bytes); 21 22 return result; 23} 24 25} 26

DAO

1package dao; 2 3public class RegisterDAO { 4 5 // データベース接続に使用する情報 6 private final String DRIVER_NAME = "com.mysql.cj.jdbc.Driver"; 7 private final String JDBC_URL ="jdbc:mysql://localhost:3306/docoTsubu"; 8 private final String DB_USER = "root"; 9 private final String DB_PASS = ""; 10 11 //ユーザー情報登録メソッド 12 public User AccountRegister(User ab) { 13 Connection conn = null; 14 try { 15 16 //JDBCドライバを読み込み 17 Class.forName("com.mysql.cj.jdbc.Driver"); 18 //データベースへ接続 19 conn = DriverManager.getConnection(JDBC_URL,DB_USER,DB_PASS); 20 21 //メールアドレスのDB存在チェック 22 String mailchecksql ="SELECT MAIL FROM ACCOUNT WHERE MAIL = ?"; 23 24 PreparedStatement pStmt0 = conn.prepareStatement(mailchecksql); 25 26 pStmt0.setString(1,ab.getMail()); 27 28 ResultSet rs = pStmt0.executeQuery(); 29 30 if(rs.next()) { 31 return null; 32 }else { 33 //登録処理 パスワード暗号化も実施 34 Encryption encryption = new Encryption(); 35 String sql = "INSERT INTO ACCOUNT(NAME,MAIL,PASS) VALUES(?,?,?)"; 36 PreparedStatement pStmt1 = conn.prepareStatement(sql); 37 pStmt1.setString(1,ab.getName()); 38 pStmt1.setString(2,ab.getMail()); 39 pStmt1.setString(3,encryption.seacret(ab.getPass())); 40 41 int result = pStmt1.executeUpdate(); 42 43 44 if(result != 1) { 45 return null; 46 } 47 } 48 49 50 51 }catch(SQLException e) { 52 e.printStackTrace(); 53 return null; 54 55 }catch(ClassNotFoundException e) { 56 e.printStackTrace(); 57 return null; 58 59 60 }finally { 61 //データベース切断 62 if(conn != null) { 63 try { 64 conn.close(); 65 }catch(SQLException e) { 66 e.printStackTrace(); 67 return null; 68 } 69 } 70 } 71 return ab; 72 73 74 75 76 } 77}
package servlet; /** * Servlet implementation class Register */ @WebServlet("/Register") public class Register extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Register() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/Register.jsp"); dispatcher.forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name"); String mail = request.getParameter("mail"); String pass = request.getParameter("pass"); User user = new User(); user.setName(name); user.setMail(mail); user.setPass(pass); RegisterDAO dao = new RegisterDAO(); User user1 =dao.AccountRegister(user); //登録成功時の処理 if(user1 != null) { HttpSession session = request.getSession(); session.setAttribute("RegisterUser", user); //登録完了画面にフォワード RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/Registercomplete.jsp"); dispatcher.forward(request, response); }else{ //登録失敗画面にフォワード RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/Registerfailure.jsp"); dispatcher.forward(request, response); } } }

jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4<html> 5 6<head> 7<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8<title>登録</title> 9</head> 10<body> 11<h1>ユーザー登録画面</h1> 12<div id = "message"> 13</div> 14<form action ="/docoTsubu/Register" method="post" > 15ユーザー名:<input type = "text" name = "name" id="inputName" maxlength="100" value="" placeholder="氏名を入力してください"><br> 16メールアドレス:<input type = "text" name = "mail" id="inputMail" maxlength="100" value="" placeholder="メールアドレス"><br> 17パスワード:<input type = "password" name = "pass"><br> 18<input type="submit" id="btnSubmit" value = "登録" > 19</form> 20</body> 21</html>

log

1com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'pass' at row 1 2 at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) 3 at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) 4 at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) 5 at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) 6 at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1347) 7 at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025) 8 at dao.RegisterDAO.AccountRegister(RegisterDAO.java:50) 9 at servlet.Register.doPost(Register.java:56) 10 at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 11 at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 12 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) 13 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 14 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 15 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 16 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 17 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 18 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94) 19 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 20 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 21 at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) 22 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 23 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502) 24 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132) 25 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) 26 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1539) 27 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1495) 28 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 29 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 30 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 31 at java.lang.Thread.run(Thread.java:748)

試したこと

DAOに暗号化の処理を入れてダメだったのでサーブレットのuser.setPass(pass);に暗号化の処理を施したが、うまくいきませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/09/28 14:20 編集

コードは"マークダウン"という記法でファイル毎にご提示願います。 "マークダウン"に付きましてはヘルプを御覧ください。 > SQLExceptionがcatchされている 発生している例外を(解釈された結果で無く)表示されている文をそのまま(何10行にもなるかもしれませんが出来るだけ全部を、コードと同じようにマークダウンで)ご提示ください。
momon-ga

2021/09/28 15:04

デバッグ実行で見ている”NOT SPECIFIED”は、単純にsetStringが実行前だからだと思います。 SQLExceptionの中身を確認したほうがよいです。 想像だと、暗号化した文字列がカラム長を超えたんじゃないかと思います。
退会済みユーザー

退会済みユーザー

2021/09/29 03:17

seacret これ間違ってない?
mario11222

2021/09/29 13:17

色々ご回答ありがとうございます。指摘内容は修正して反映させました。よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2021/09/29 13:27

passのデータ長が短いってエラー出てますよ テーブル見直してください
shiketa

2021/09/29 13:29

`MysqlDataTruncation: Data truncation: Data too long for column 'pass' at row 1` momon-gaさんの指摘通りではありませんか? > 想像だと、暗号化した文字列がカラム長を超えたんじゃないかと思います。 テーブル定義のDDLも提示されてみてはいかがかと。
mario11222

2021/09/29 13:48 編集

分かりました。確認してみます。確認した結果はお知らせします。 →確認した結果、ご指摘の通りデータ長が短かったのが原因でした。皆様のおかげで解決できました。ありがとうございます。今後はログの内容も詳細に確認することを心掛けたいと思います。
guest

回答1

0

自己解決

質問への追記・修正の依頼の欄にて解決できました。ご協力ありがとうございました。

投稿2021/09/29 13:50

mario11222

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問