Commit 1a069c51 authored by DESKTOP-NFGF3PG\zxa01's avatar DESKTOP-NFGF3PG\zxa01

1. simulate the generate key

2. add encrypt and decrypt
3. add content provider to store the key
parent 9db1b605
...@@ -51,4 +51,8 @@ dependencies { ...@@ -51,4 +51,8 @@ dependencies {
exclude group: 'com.android.support', module: 'recyclerview-v7' exclude group: 'com.android.support', module: 'recyclerview-v7'
} }
// web3j
implementation "org.web3j:crypto:4.0.4"
implementation 'org.jetbrains:annotations:15.0'
} }
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application <application
android:allowBackup="false" android:allowBackup="false"
...@@ -33,8 +33,7 @@ ...@@ -33,8 +33,7 @@
android:name=".component.home.HomeActivity" android:name=".component.home.HomeActivity"
android:label="@string/title_home" android:label="@string/title_home"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan" android:windowSoftInputMode="adjustPan" />
/>
<activity <activity
android:name=".component.detail.DetailActivity" android:name=".component.detail.DetailActivity"
...@@ -45,6 +44,10 @@ ...@@ -45,6 +44,10 @@
android:name=".component.privacy.PrivacyActivity" android:name=".component.privacy.PrivacyActivity"
android:label="@string/title_privacy" android:label="@string/title_privacy"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<provider
android:name=".common.tools.UsersProvider"
android:authorities="com.example.zxa01.iotclient.common.tools.UserProvider"></provider>
</application> </application>
</manifest> </manifest>
\ No newline at end of file
package com.example.zxa01.iotclient.common.singleton; package com.example.zxa01.iotclient.common;
import com.example.zxa01.iotclient.common.pojo.Setting; import com.example.zxa01.iotclient.common.pojo.Setting;
import com.example.zxa01.iotclient.common.pojo.auth.LoginMessage; import com.example.zxa01.iotclient.common.pojo.auth.LoginMessage;
...@@ -15,6 +15,7 @@ public class Config { ...@@ -15,6 +15,7 @@ public class Config {
private static Config config = new Config(); private static Config config = new Config();
private List<Setting> settings; private List<Setting> settings;
private LoginMessage message; private LoginMessage message;
private String key;
private Config() { private Config() {
this.reset(); this.reset();
...@@ -49,4 +50,11 @@ public class Config { ...@@ -49,4 +50,11 @@ public class Config {
this.settings.add(setting); this.settings.add(setting);
} }
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
} }
package com.example.zxa01.iotclient.common.singleton; package com.example.zxa01.iotclient.common;
import com.example.zxa01.iotclient.common.pojo.auth.LoginMessage; import com.example.zxa01.iotclient.common.pojo.auth.LoginMessage;
......
...@@ -4,7 +4,7 @@ import com.example.zxa01.iotclient.common.pojo.device.Device; ...@@ -4,7 +4,7 @@ import com.example.zxa01.iotclient.common.pojo.device.Device;
import com.example.zxa01.iotclient.common.pojo.index.PrivacyChoiceResponse; import com.example.zxa01.iotclient.common.pojo.index.PrivacyChoiceResponse;
import com.example.zxa01.iotclient.common.pojo.index.PrivacyPolicyReportResponse; import com.example.zxa01.iotclient.common.pojo.index.PrivacyPolicyReportResponse;
import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyChoice; import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyChoice;
import com.example.zxa01.iotclient.common.singleton.Config; import com.example.zxa01.iotclient.common.Config;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import java.util.List; import java.util.List;
......
...@@ -151,17 +151,14 @@ public class DownloadFile { ...@@ -151,17 +151,14 @@ public class DownloadFile {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (context.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) if (context.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) { == PackageManager.PERMISSION_GRANTED) {
Log.v(TAG,"Permission is granted");
return true; return true;
} else { } else {
Log.v(TAG,"Permission is revoked");
requestPermissions((Activity)context, requestPermissions((Activity)context,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false; return false;
} }
} }
else { else {
Log.v(TAG,"Permission is granted");
return true; return true;
} }
} }
......
package com.example.zxa01.iotclient.common.tools;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class ECCGenerate {
private static final String ALGORITHM = "AES";
public ECCGenerate() {
}
public String generate() throws NoSuchAlgorithmException {
KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);
keyGen.init(new SecureRandom());
return encodeKey(keyGen.generateKey());
}
public String encrypt(String message, String secretKey) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(cipher.ENCRYPT_MODE, decodeKey(secretKey));
return Base64.getEncoder().encodeToString(cipher.doFinal(message.getBytes()));
}
public String decrypt(String message, String secretKey) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, decodeKey(secretKey));
byte[] decryptedText = cipher.doFinal(Base64.getDecoder().decode(message));
return new String(decryptedText);
}
private SecretKey decodeKey(String key) {
byte[] decodedKey = Base64.getDecoder().decode(key);
return new SecretKeySpec(decodedKey, 0, decodedKey.length, ALGORITHM);
}
private String encodeKey(SecretKey secretKey) {
return Base64.getEncoder().encodeToString(secretKey.getEncoded());
}
}
package com.example.zxa01.iotclient.common.tools;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import java.util.HashMap;
public class UsersProvider extends ContentProvider {
public static final String PROVIDER_NAME = "com.example.zxa01.iotclient.common.tools.UserProvider";
public static final String URL = "content://" + PROVIDER_NAME + "/users";
public static final Uri CONTENT_URI = Uri.parse(URL);
public static final String id = "id";
public static final String name = "name";
public static final String secret_key = "secret_key";
public static final int uriCode = 1;
static final UriMatcher uriMatcher;
static final String DATABASE_NAME = "iotclient.db";
static final String TABLE_NAME = "user";
static final int DATABASE_VERSION = 1;
static final String CREATE_DB_TABLE = " CREATE TABLE " + TABLE_NAME
+ " (id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ " name TEXT NOT NULL,"
+ " secret_key TEXT )";
private static HashMap<String, String> values;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "users", uriCode);
uriMatcher.addURI(PROVIDER_NAME, "users/*", uriCode);
}
private SQLiteDatabase db;
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) {
case uriCode:
return "vnd.android.cursor.dir/users";
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
@Override
public boolean onCreate() {
Context context = getContext();
DatabaseHelper dbHelper = new DatabaseHelper(context);
db = dbHelper.getWritableDatabase();
if (db != null) {
return true;
}
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE_NAME);
switch (uriMatcher.match(uri)) {
case uriCode:
qb.setProjectionMap(values);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (sortOrder == null || sortOrder == "") {
sortOrder = id;
}
Cursor c = qb.query(db, projection, selection, selectionArgs, null,
null, sortOrder);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
long rowID = db.insert(TABLE_NAME, "", values);
if (rowID > 0) {
Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
getContext().getContentResolver().notifyChange(_uri, null);
return _uri;
}
throw new SQLiteException("Failed to add a record into " + uri);
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int count = 0;
switch (uriMatcher.match(uri)) {
case uriCode:
count = db.update(TABLE_NAME, values, selection, selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = 0;
switch (uriMatcher.match(uri)) {
case uriCode:
count = db.delete(TABLE_NAME, selection, selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_DB_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
}
...@@ -6,10 +6,9 @@ import android.support.annotation.NonNull; ...@@ -6,10 +6,9 @@ import android.support.annotation.NonNull;
import android.util.Log; import android.util.Log;
import com.example.zxa01.iotclient.common.pojo.index.PrivacyPolicyReportResponse; import com.example.zxa01.iotclient.common.pojo.index.PrivacyPolicyReportResponse;
import com.example.zxa01.iotclient.common.singleton.Config; import com.example.zxa01.iotclient.common.Config;
import com.example.zxa01.iotclient.common.tools.Api; import com.example.zxa01.iotclient.common.tools.Api;
import com.example.zxa01.iotclient.common.pojo.device.Device; import com.example.zxa01.iotclient.common.pojo.device.Device;
import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyPolicyReport;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
......
package com.example.zxa01.iotclient.component.detail; package com.example.zxa01.iotclient.component.detail;
import com.example.zxa01.iotclient.common.pojo.device.Device; import com.example.zxa01.iotclient.common.pojo.device.Device;
import com.example.zxa01.iotclient.common.singleton.Config; import com.example.zxa01.iotclient.common.Config;
import com.example.zxa01.iotclient.common.tools.DownloadFile; import com.example.zxa01.iotclient.common.tools.DownloadFile;
import com.example.zxa01.iotclient.component.privacy.PrivacyActivity; import com.example.zxa01.iotclient.component.privacy.PrivacyActivity;
import android.arch.lifecycle.MutableLiveData; import android.arch.lifecycle.MutableLiveData;
......
...@@ -5,7 +5,7 @@ import android.databinding.BaseObservable; ...@@ -5,7 +5,7 @@ import android.databinding.BaseObservable;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.util.Log; import android.util.Log;
import com.example.zxa01.iotclient.common.singleton.Config; import com.example.zxa01.iotclient.common.Config;
import com.example.zxa01.iotclient.common.tools.Api; import com.example.zxa01.iotclient.common.tools.Api;
import com.example.zxa01.iotclient.common.pojo.index.PrivacyChoiceResponse; import com.example.zxa01.iotclient.common.pojo.index.PrivacyChoiceResponse;
......
...@@ -4,7 +4,7 @@ import android.arch.lifecycle.MutableLiveData; ...@@ -4,7 +4,7 @@ import android.arch.lifecycle.MutableLiveData;
import android.databinding.BaseObservable; import android.databinding.BaseObservable;
import com.example.zxa01.iotclient.common.pojo.Setting; import com.example.zxa01.iotclient.common.pojo.Setting;
import com.example.zxa01.iotclient.common.singleton.Config; import com.example.zxa01.iotclient.common.Config;
import java.util.List; import java.util.List;
......
...@@ -8,7 +8,7 @@ import android.databinding.ObservableBoolean; ...@@ -8,7 +8,7 @@ import android.databinding.ObservableBoolean;
import com.example.zxa01.iotclient.R; import com.example.zxa01.iotclient.R;
import com.example.zxa01.iotclient.common.pojo.Setting; import com.example.zxa01.iotclient.common.pojo.Setting;
import com.example.zxa01.iotclient.common.singleton.Config; import com.example.zxa01.iotclient.common.Config;
import com.example.zxa01.iotclient.component.login.LoginActivity; import com.example.zxa01.iotclient.component.login.LoginActivity;
import java.util.List; import java.util.List;
......
package com.example.zxa01.iotclient.component.login; package com.example.zxa01.iotclient.component.login;
import com.example.zxa01.iotclient.common.pojo.Setting; import com.example.zxa01.iotclient.common.pojo.Setting;
import com.example.zxa01.iotclient.common.pojo.auth.User; import com.example.zxa01.iotclient.common.Config;
import com.example.zxa01.iotclient.common.singleton.Config;
import com.example.zxa01.iotclient.common.pojo.auth.LoginMessage; import com.example.zxa01.iotclient.common.pojo.auth.LoginMessage;
import com.example.zxa01.iotclient.common.singleton.DefaultData; import com.example.zxa01.iotclient.common.DefaultData;
import com.example.zxa01.iotclient.component.home.device.DeviceFragment; import com.example.zxa01.iotclient.common.tools.ECCGenerate;
import com.example.zxa01.iotclient.common.tools.UsersProvider;
import android.arch.lifecycle.MutableLiveData; import android.arch.lifecycle.MutableLiveData;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.databinding.BaseObservable; import android.databinding.BaseObservable;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import java.security.NoSuchAlgorithmException;
public class LoginModel extends BaseObservable { public class LoginModel extends BaseObservable {
private MutableLiveData<Boolean> isAuthorized; private MutableLiveData<Boolean> isAuthorized;
private Context context;
public LoginModel() { public LoginModel(Context context) {
this.context = context;
isAuthorized = new MutableLiveData<>(); isAuthorized = new MutableLiveData<>();
isAuthorized.setValue(false); isAuthorized.setValue(false);
} }
...@@ -28,10 +36,45 @@ public class LoginModel extends BaseObservable { ...@@ -28,10 +36,45 @@ public class LoginModel extends BaseObservable {
if (verification(message)) { if (verification(message)) {
settingConfig(message); settingConfig(message);
isAuthorized.setValue(true); isAuthorized.setValue(true);
checkKey();
}
}
private void checkKey() {
Cursor cursor = context.getContentResolver().query(
UsersProvider.CONTENT_URI, null, null, null, null);
if(cursor.moveToFirst()) {
boolean found = false;
while (!cursor.isAfterLast()) {
if(cursor.getString(cursor.getColumnIndex(UsersProvider.name)).equals(Config.getConfig().getMessage().getAccount())){
Config.getConfig().setKey(cursor.getString(cursor.getColumnIndex(UsersProvider.secret_key)));
found = true;
break;
}
cursor.moveToNext();
}
if (!found) {
generateKey();
}
} else{
generateKey();
} }
} }
private void generateKey() {
try {
Config.getConfig().setKey(new ECCGenerate().generate());
ContentValues values = new ContentValues();
values.put(UsersProvider.name,Config.getConfig().getMessage().getAccount());
values.put(UsersProvider.secret_key,Config.getConfig().getKey());
context.getContentResolver().insert(UsersProvider.CONTENT_URI, values);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
private boolean verification(@NonNull LoginMessage message) { private boolean verification(@NonNull LoginMessage message) {
return message.getAccount() != null && return message.getAccount() != null &&
message.getPassword() != null && message.getPassword() != null &&
......
package com.example.zxa01.iotclient.component.login; package com.example.zxa01.iotclient.component.login;
import com.example.zxa01.iotclient.common.singleton.DefaultData; import com.example.zxa01.iotclient.common.DefaultData;
import com.example.zxa01.iotclient.component.home.HomeActivity; import com.example.zxa01.iotclient.component.home.HomeActivity;
import com.example.zxa01.iotclient.common.pojo.auth.LoginMessage; import com.example.zxa01.iotclient.common.pojo.auth.LoginMessage;
import android.arch.lifecycle.MutableLiveData; import android.arch.lifecycle.MutableLiveData;
...@@ -12,13 +12,14 @@ import android.databinding.ObservableField; ...@@ -12,13 +12,14 @@ import android.databinding.ObservableField;
public class LoginViewModel extends ViewModel { public class LoginViewModel extends ViewModel {
public ObservableField<LoginMessage> loginMessage = new ObservableField<>(); public ObservableField<LoginMessage> loginMessage = new ObservableField<>();
private LoginModel loginModel = new LoginModel(); private LoginModel loginModel;
private Context context; private Context context;
public LoginViewModel(Context context) { public LoginViewModel(Context context) {
this.context = context;
// default // default
loginMessage.set(DefaultData.getDefaultData().getLoginMessage()); this.loginMessage.set(DefaultData.getDefaultData().getLoginMessage());
this.context = context;
loginModel = new LoginModel(context);
} }
public void login() { public void login() {
......
...@@ -12,7 +12,7 @@ import com.example.zxa01.iotclient.common.tools.Api; ...@@ -12,7 +12,7 @@ import com.example.zxa01.iotclient.common.tools.Api;
import com.example.zxa01.iotclient.common.pojo.index.PrivacyChoiceResponse; import com.example.zxa01.iotclient.common.pojo.index.PrivacyChoiceResponse;
import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyChoice; import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyChoice;
import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyContent; import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyContent;
import com.example.zxa01.iotclient.common.singleton.Config; import com.example.zxa01.iotclient.common.Config;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
......
...@@ -6,7 +6,7 @@ import com.example.zxa01.iotclient.common.pojo.index.PrivacyPolicyReportResponse ...@@ -6,7 +6,7 @@ import com.example.zxa01.iotclient.common.pojo.index.PrivacyPolicyReportResponse
import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyContent; import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyContent;
import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyPolicy; import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyPolicy;
import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyPolicyReport; import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyPolicyReport;
import com.example.zxa01.iotclient.common.singleton.Config; import com.example.zxa01.iotclient.common.Config;
import android.arch.lifecycle.MutableLiveData; import android.arch.lifecycle.MutableLiveData;
import android.arch.lifecycle.ViewModel; import android.arch.lifecycle.ViewModel;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment