プログラム



import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

public class ImgName extends Frame implements ActionListener {//ActionLisntenerをimplement
// ■ フィールド変数

int flag = 1; //整数
TextField txt1, txt2; //Textfield
Label lb1, lb2; //Label
Button btn1,btn2,btn3; //Button
Serializ seri = new Serializ(); //パスワードを保存するため
PassChoise choise = new PassChoise(); //Coice画面を見せるため
Password pass = new Password(); //暗号化を行う
String hashPass = ""; //暗号化した文字
File file = new File("E:/pleiades/work_java/java2017/programData\\password0.bin");//fileを入れる
public static void main(String args) { //main文
ImgName stf = new ImgName(); //InNameを生成

}


// ■ コンストラクタ
ImgName() {
super("Widget Test"); //Widget Testにアクセス
this.setSize(400, 200); //sizeを指定

this.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 15)); //centerに設置

lb2 = new Label("USER ID(4文字以上)"); //USERID
add(lb2); //登録

txt2 = new TextField(25); //25文字幅設定
txt2.addActionListener(this); //txt1はイベント処理をする
txt2.setText(""); //空白にしておく
add(txt2); // 登録


lb1 = new Label("PASSWORD(8文字以上)"); //PASSWORD
add(lb1);

txt1 = new TextField(25); //25文字幅設定
txt1.addActionListener(this); //txt1はイベント処理をする
txt1.setEchoChar('*'); //パスワードのを米印で表す
txt1.setText(""); //空白にしておく
add(txt1); //登録

btn1 = new Button("完了"); // ボタンの設定
btn1.addActionListener(this); // ボタンのイベント処理
add(btn1); // ボタンの登録

btn3 = new Button("クリア"); // ボタンの設定
btn3.addActionListener(this); // ボタンのイベント処理
add(btn3); // ボタンの登録
if(file.exists()) hashPass = seri.getPass(0); // fileが存在したら設定したパスワードを入れる


this.setVisible(true); // 可視化
}
public void actionPerformed(ActionEvent e) { // ActinoEvent
String ss1 = ""; // 文字列ss1
String ss2 = ""; // 文字列ss2
if (e.getSource() == btn1 || e.getSource() == txt1) { // txt1、または、btn1でEnter入力あり
ss1 = txt1.getText(); // ss1にtxt1を入れる
ss2 = txt2.getText(); // ss2にtxt2を入れる

if(file.exists()){ //Fileが存在するなら
// パスワードとIDが8と4文字以上かつPassChoiceが可視化されずパスワードがあっていたとき、かつ、パスワードを登録したとき
if(ss1.length() >= 8 && ss2.length() >= 4 && flag == 1
&& hashPass.equals(pass.getStretchedPassword(ss1, ss2)) ){
hashPass = pass.getStretchedPassword(ss1, ss2); //hash化してストレッチングする
seri.setPass(hashPass, 0); //暗号化した文字列を保存
choise.setvisible(); //合っていたので保存されたものを開く
flag++;
}
else if(hashPass != pass.getStretchedPassword(txt1.getText(), txt2.getText())){ //間違ったPASS,IDのとき
txt2.setText("PASSWORD、または、USER__IDが間違っています"); //間違っていると警告
}
}
else{ //fileが存在しないなら
hashPass = pass.getStretchedPassword(ss1, ss2); //hash化してストレッチングする
seri.setPass(hashPass, 0); //暗号化した文字列を保存
choise.setvisible(); //合っていたので保存されたものを開く
flag++;
}

if(ss1.length() < 8){ //パスワードが8文字以下のとき
txt2.setText("PASSWORDは8文字以上入力してください"); //警告
}
if(ss2.length() < 4){ //IDが4文字以下のとき
txt2.setText("USERIDは4文字以上入力してください"); //警告
}
}
else if(e.getSource() == btn3){ //クリアボタンが押されたとき
txt2.setText(""); //txt2をクリア
txt1.setText(""); //txt1をクリア


}
}
}

 

 


import java.awt.Button;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Choice;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;

public class PassChoise extends Frame implements ItemListener, ActionListener{

// ■ フィールド変数
int i = 1,num = 4; //vは自動生成の文字数
TextField txt1,txt2; //テキストフィールド
Choice cho0 ; //チョイス
Button btn1,btn2,btn3; //ボタン
Serializ seri = new Serializ(); //パスワードを保存するため
Password pass = new Password(); //暗号化
String s = ""; //文字列
String ss = ""; //文字列
String sss = new String[10]; //文字列の配列
CreatePass createp = new CreatePass(); //パスワード自動生成
CheckboxGroup grp1 = new CheckboxGroup();// チェックボックスのグループのクラス
Checkbox cbx1, cbx2, cbx3,cbx7; //チェックボックス
Label lb1; //ラベル

//コンストラクタ
PassChoise(){
super("Widget Test"); //Widget Testにアクセス
this.setSize(350, 200); //sizeを指定
this.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 15));//Leftに設定

txt2 = new TextField(20); // テキストフィールド
txt2.setText("TITLE"); // 表示
add(txt2);

btn1 = new Button("追加"); // ボタンの設定
btn1.addActionListener(this); // ボタンのイベント処理
add(btn1); // 登録

btn2 = new Button("完了"); // ボタンの設定
btn2.addActionListener(this); // ボタンのイベント処理
add(btn2); // 登録

txt1 = new TextField(20); // テキストフィールド
txt1.setText("PASSWORD"); // 表示
add(txt1); // 登録

btn3 = new Button("自動生成"); // ボタンの設定
btn3.addActionListener(this); // ボタンのイベント処理
add(btn3); // 登録

cho0 = new Choice(); // チョイスを生成
cho0.add(" "); // 登録
cho0.addItemListener(this); // リスナ設定
File file = new File("E:/pleiades/work_java/java2017/programData\\password-1.bin");//fileの存在を確認
if(file.exists()){ //Fileが存在とき
int count = Integer.parseInt(seri.getPass(-1)); //前に保存したパスワードの個数を取得
System.out.println(count); //確認
for(int num = 1; num <= count-1; num++){ //パスワードをchoiceに登録
s = seri.getPass(num); //タイトルを取得
cho0.add(s); //登録
num++; //タイトルのパスワードのFiLE
ss = seri.getPass(num); //パスワードを取得
sss[num] = ss; //文字列を配列に保存
}
i = count; //iにパスワードの数を代入
}
else{

i = 1;
}
add(cho0); //登録

lb1 = new Label("文字数を選択:"); //表示
add(lb1); //登録

// cbx1 を grp1 のメンバーとして、押された状態 (true) で作成
cbx1 = new Checkbox("4", true, grp1);
cbx1.addItemListener(this); add(cbx1); //リスナ設定
// cbx2 を grp1 のメンバーとして、押されていない状態 (false) で作成
cbx2 = new Checkbox("8", false, grp1);
cbx2.addItemListener(this); add(cbx2); //リスナ設定
// cbx3 を grp1 のメンバーとして、押されていない状態 (false) で作成
cbx3 = new Checkbox("12", false, grp1);
cbx3.addItemListener(this); add(cbx3); //リスナ設定
// cbx7 を grp1 のメンバーとして、押されていない状態 (false) で作成
cbx7 = new Checkbox("16", false, grp1);
cbx7.addItemListener(this); add(cbx7); //リスナ設定






}

// ■ メソッド

public void setChoice(String s,String ss){

cho0.add(s); //チョイス名を追加
seri.setPass(s, i); //IDを保存
i++; //つぎのFile番号
seri.setPass(ss, i); //パスワードを保存
sss[i] = ss; //配列に保存
i++; //次のFile番号
add(cho0); //登録
cho0.addItemListener(this); //リスナ設定
String p = String.valueOf(i); //数値を文字に変換
seri.setPass(p, -1); //保存

}
public void setvisible(){ //setvisible
this.setVisible(true); //可視化
}

//Choiceの選択
public void itemStateChanged(ItemEvent e) {
if (e.getItemSelectable() == cho0) { //選択されたとき
txt2.setText(cho0.getSelectedItem()); //txt2にタイトルを表示
txt1.setText(sss[2*cho0.getSelectedIndex()]); //txt1にタイトルのパスワードを表示
}
//パスワードの自動生成の文字数
if (cbx1.getState() == true) num=4; //4文字
if (cbx2.getState() == true) num=8; //8文字
if (cbx3.getState() == true) num=12; //12文字
if (cbx7.getState() == true) num=16; //16文字
}



//Buttonの選択
public void actionPerformed(ActionEvent a) {
if (a.getSource() == btn1){ //btn1が選択されたとき
txt2.setText("タイトルを設定してください"); //表示
txt1.setText("パスワードを設定してください"); //表示
}
else if(a.getSource() == btn2){ //btn2が選択されたとき
setChoice(txt2.getText(),txt1.getText()); //txt1,txt2の文字を取得
txt2.setText(""); //表示
txt1.setText("追加されました"); //表示
}
else if(a.getSource() == btn3){ //btn3が選択されたとき
txt1.setText(createp.createPass(num)); //自動生成されたパスワードを表示
}
}
}

 

 


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Serializ {

Serializ(){

}

public void setPass(String s, int i){
try {
ObjectOutputStream objOutStream = new ObjectOutputStream( //オブジェクトストリーム
new FileOutputStream(
"E:/pleiades/work_java/java2017/programData\\password"+i+".bin"));//ファイルを作る
Data data = new Data(); //データ
data.setData(s); //文字をセット

objOutStream.writeObject(data); //データを保存
objOutStream.close(); //オブジェクトストリームを閉じる

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//
public String getPass(int num){
String ss = ""; //文字列
try {
ObjectInputStream objInStream = new ObjectInputStream(
new FileInputStream("E:/pleiades/work_java/java2017/programData\\password"+num+".bin"));
Data data = (Data) objInStream.readObject();//保存した文字をデータに

objInStream.close(); //オブジェクトストリームを閉じる

ss = data.getData(); //データを取得

//例外処理
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return ss; //保存された文字を返す
}

}

 

 

 

 


import java.io.Serializable;

public class Data implements Serializable{
String p = new String[2];//文字列の配列

Data(){
}

//
public void setData(String p){
this.p[1] = p; //データを代入
}
//
public void setData2(String p ,String pp){
this.p[1] = p; //データを代入
this.p[2] = pp; //データを代入
}
//
public String getData(){
return p[1]; //デートを返す
}
//
public String
getData2(){
return p; //データを返す
}
}

 

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Password {

private static int STRETCH_COUNT = 1000; //ストレッチング回数が一万回は重いので千回とする

Password(){

}

/*
* salt + ストレッチングしたパスワードを取得
*/
public String getStretchedPassword(String password, String userId) {
String salt = getSha256(userId); //IDを元にsaltを取得
String hash = ""; //hash
for (int i = 0; i < STRETCH_COUNT; i++) { //ストレッチング1000回
hash = getSha256(hash + salt + password); //ハッシュ化
}

return hash; //ハッシュ化した文字を返す
}

/*
* 文字列から SHA256 のハッシュ値を取得
*/
private static String getSha256(String target) {
MessageDigest md = null; //MessageDigest

StringBuffer buf = new StringBuffer(); //StringBuffer

try {
md = MessageDigest.getInstance("SHA-256"); //SHA-256のアルゴリズムを使用
md.update(target.getBytes()); //tarをgetをbyte型に変換しダイジェストを更新
byte digest = md.digest(); //ハッシュのbyteの配列

for (int i = 0; i < digest.length; i++) { //byteの配列の数、繰り返す
buf.append(String.format("%02x", digest[i])); //シーケンスに追加
}

//例外処理
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}

return buf.toString(); //String型にして返す

}
}

 

import java.util.Random;

public class CreatePass {
Random rnd = new Random(); //ランダム
int num = 0; //整数
int i = 0; //整数
char c = new char[62] ; //文字

CreatePass(){

//文字と数字を配列に入れる
for(int i=0; i < 10; i++) //0-9
c[i] = (char)('0' + i); //代入
for(int i=10; i < 36; i++) //a-z
c[i] = (char)( 'a' + i -10) ; //代入
for(int i=36; i< 62; i++) //A-Z
c[i] = (char)( 'A' + i - 36) ; //代入


}

public String createPass(int a){
String ss = ""; //文字列
for(i=0; i< a; ++i){ //指定された文字数を生成
num = rnd.nextInt(62); //0-62でランダム
System.out.println(num); //確認
System.out.println(c[num]); //確認
ss = ss + String.valueOf(c[num]); //ランダムな値から文字を得て文字列にする
}
System.out.println(ss); //確認
return ss; //生成されたパスワードを返す

}

}