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 {
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 @@
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_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.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="false"
......@@ -33,8 +33,7 @@
android:name=".component.home.HomeActivity"
android:label="@string/title_home"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan"
/>
android:windowSoftInputMode="adjustPan" />
<activity
android:name=".component.detail.DetailActivity"
......@@ -45,6 +44,10 @@
android:name=".component.privacy.PrivacyActivity"
android:label="@string/title_privacy"
android:screenOrientation="portrait" />
<provider
android:name=".common.tools.UsersProvider"
android:authorities="com.example.zxa01.iotclient.common.tools.UserProvider"></provider>
</application>
</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.auth.LoginMessage;
......@@ -15,6 +15,7 @@ public class Config {
private static Config config = new Config();
private List<Setting> settings;
private LoginMessage message;
private String key;
private Config() {
this.reset();
......@@ -49,4 +50,11 @@ public class Config {
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;
......
......@@ -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.PrivacyPolicyReportResponse;
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 java.util.List;
......
......@@ -151,17 +151,14 @@ public class DownloadFile {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (context.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Log.v(TAG,"Permission is granted");
return true;
} else {
Log.v(TAG,"Permission is revoked");
requestPermissions((Activity)context,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false;
}
}
else {
Log.v(TAG,"Permission is granted");
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;
import android.util.Log;
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.pojo.device.Device;
import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyPolicyReport;
import retrofit2.Call;
import retrofit2.Callback;
......
package com.example.zxa01.iotclient.component.detail;
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.component.privacy.PrivacyActivity;
import android.arch.lifecycle.MutableLiveData;
......
......@@ -5,7 +5,7 @@ import android.databinding.BaseObservable;
import android.support.annotation.NonNull;
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.pojo.index.PrivacyChoiceResponse;
......
......@@ -4,7 +4,7 @@ import android.arch.lifecycle.MutableLiveData;
import android.databinding.BaseObservable;
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;
......
......@@ -8,7 +8,7 @@ import android.databinding.ObservableBoolean;
import com.example.zxa01.iotclient.R;
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 java.util.List;
......
package com.example.zxa01.iotclient.component.login;
import com.example.zxa01.iotclient.common.pojo.Setting;
import com.example.zxa01.iotclient.common.pojo.auth.User;
import com.example.zxa01.iotclient.common.singleton.Config;
import com.example.zxa01.iotclient.common.Config;
import com.example.zxa01.iotclient.common.pojo.auth.LoginMessage;
import com.example.zxa01.iotclient.common.singleton.DefaultData;
import com.example.zxa01.iotclient.component.home.device.DeviceFragment;
import com.example.zxa01.iotclient.common.DefaultData;
import com.example.zxa01.iotclient.common.tools.ECCGenerate;
import com.example.zxa01.iotclient.common.tools.UsersProvider;
import android.arch.lifecycle.MutableLiveData;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.databinding.BaseObservable;
import android.support.annotation.NonNull;
import java.security.NoSuchAlgorithmException;
public class LoginModel extends BaseObservable {
private MutableLiveData<Boolean> isAuthorized;
private Context context;
public LoginModel() {
public LoginModel(Context context) {
this.context = context;
isAuthorized = new MutableLiveData<>();
isAuthorized.setValue(false);
}
......@@ -28,10 +36,45 @@ public class LoginModel extends BaseObservable {
if (verification(message)) {
settingConfig(message);
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) {
return message.getAccount() != null &&
message.getPassword() != null &&
......
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.common.pojo.auth.LoginMessage;
import android.arch.lifecycle.MutableLiveData;
......@@ -12,13 +12,14 @@ import android.databinding.ObservableField;
public class LoginViewModel extends ViewModel {
public ObservableField<LoginMessage> loginMessage = new ObservableField<>();
private LoginModel loginModel = new LoginModel();
private LoginModel loginModel;
private Context context;
public LoginViewModel(Context context) {
this.context = context;
// default
loginMessage.set(DefaultData.getDefaultData().getLoginMessage());
this.loginMessage.set(DefaultData.getDefaultData().getLoginMessage());
this.context = context;
loginModel = new LoginModel(context);
}
public void login() {
......
......@@ -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.privacy.PrivacyChoice;
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.Callback;
......
......@@ -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.PrivacyPolicy;
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.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