<span style="font-size:14px;">为了更好的用户体验,移动APPclient一般都会将用户信息进行保存以便兴许能够自己主动登录.</span>

保存了用户信息便涉及到了安全问题.

解决办法大概有一下几种:

1.首先,假设client和服务端都是你来设计开发,那么有两种比較可靠的方案

A.client将passwordHash加密,登录成功后将hash值保存到Sqlite.服务端得到username和hash值,採用相同的算法对password进行Hash运算,然后和用户传来的hash值进行比較,一致则登录成功.更加可靠的是对password加盐加密.比如能够採用PBKDF2加盐加密.

<span style="font-size:14px;">public static String createHash(String password)throws NoSuchAlgorithmException, InvalidKeySpecException {return createHash(password.toCharArray());}/*** Returns a salted PBKDF2 hash of the password.* * @param password*            the password to hash* @return a salted PBKDF2 hash of the password*/public static String createHash(char[] password)throws NoSuchAlgorithmException, InvalidKeySpecException {// Generate a random saltSecureRandom random = new SecureRandom();byte[] salt = new byte[SALT_BYTE_SIZE];random.nextBytes(salt);// Hash the passwordbyte[] hash = pbkdf2(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);return PBKDF2_ITERATIONS + ":" + toHex(salt) + ":" + toHex(hash);}</span>

加密后的字符串为1000:1507039de0a3c2c88ddf896233278e37d05fd8a0fadc570d:99222374678d4afe5d7d9bf9be4786e17f045ac217c6a2ca,

1000为迭代的次数,后面各自是salt和hash值.

服务端得到这个字符串后,从中解析出迭代次数,salt,hash1值,然后採用相同的算法对数据库里面的password进行计算

    public static boolean validatePassword(String password, String correctHash)throws NoSuchAlgorithmException, InvalidKeySpecException {return validatePassword(password.toCharArray(), correctHash);}/*** Validates a password using a hash.* * @param password*            the password to check* @param correctHash*            the hash of the valid password* @return true if the password is correct, false if not*/public static boolean validatePassword(char[] password, String correctHash)throws NoSuchAlgorithmException, InvalidKeySpecException {// Decode the hash into its parametersString[] params = correctHash.split(":");int iterations = Integer.parseInt(params[ITERATION_INDEX]);byte[] salt = fromHex(params[SALT_INDEX]);byte[] hash = fromHex(params[PBKDF2_INDEX]);// Compute the hash of the provided password, using the same salt,// iteration count, and hash lengthbyte[] testHash = pbkdf2(password, salt, iterations, hash.length);// Compare the hashes in constant time. The password is correct if// both hashes match.return slowEquals(hash, testHash);}

假设hash2和hash1一致,则登录成功.同一时候client将加密后的字符串保存到本地数据库,下次登录时直接从数据库读取.

B.使用非对称加密算法对password进行加密.

  1. client使用公钥加密password,得到加密串,然后将其发送到服务端.
  2. 服务端使用私钥解密password。进行验证,
  3. 登录成功后,client将加密串保存到本地,便于下次自己主动登录;
使用非对称加密比較可靠。即使加密串被泄露也无法得到password.
2.假设你仅仅是负责client。对服务端无能为力,那么你可能仅仅能使用对称加密了.(如你正在为学校图书馆写个client。你还想设置自己主动登录。那么你本地仅仅能使用对称加密了,将加密串保存到本地。然后下次自己主动登录时。从数据库取出加密串然后解密...服务端仅仅识别原始的password)
这样的情况。你仅仅能考虑怎样生成加密密钥,以及怎样保存密钥,怎样混淆.
考虑了一种方法:
加解密函数 DES(passwd,key,encode);
str1 =  DES(passwd,key,encode);
str2 =  DES(key,str1,encode);
本地数据库中保存 str1:str2.
解密时,str2以str1解密得到key.
然后。str1以key解密得到passwd.
非对称加密仅仅能以这样的逻辑上的复杂度添加password的强度.
3. 使用JNI加解密。
另參考文章:
http://blog.csdn.net/hengyunabc/article/details/34623957

android中使用jni对字符串加解密实现分析

加盐password哈希:怎样正确使用

转载于:https://www.cnblogs.com/jhcelue/p/7190220.html

移动APP怎样保存用户password相关推荐

  1. 移动App该怎样保存用户password

    版权声明:本文为横云断岭原创文章,未经博主同意不得转载.微信公众号:横云断岭的专栏 https://blog.csdn.net/hengyunabc/article/details/34623957 ...

  2. 魔方APP项目-07-客户端提交登录信息、在APICloud中集成防水墙验证码,前端获取显示并校验验证码、服务端校验验证码、保存用户登录状态,APICloud提供的数据存储、客户端保存用户登陆数据

    用户登录 一.客户端提交登录信息 html/login.html,代码: <!DOCTYPE html> <html> <head><title>登录& ...

  3. 移动App该如何保存用户密码

    这个实际上和桌面程序是一样的. 先看下一些软件是如何保存用户密码的: 我们先来看下QQ是怎么保存密码的: 参考:http://bbs.pediy.com/archive/index.php?t-159 ...

  4. 基于服务器端保存用户的查询参数

    基于服务器端保存用户的查询参数 最近公司项目有一个新的需求, 希望用户在PC查询的参数能够同步更新到APP端, 避免让用户在PC和APP端重复输入查询条件, 基于项目是前后端分离, APP和PC的请求 ...

  5. html 存储登录状态,Vue中保存用户登录状态实例代码

    首先我们假设,这里的登录组件(register.vue)是App.vue组件的子组件,是通过路由进入登录组件的. 登录组件中用户点击登录后,后台会传过来一个用户名,我的App.vue组件中需要拿到这个 ...

  6. UWP 保存用户设置

    一:需求 需要保存用户设置,用户下一次再打开app时,加载默认的设置.比如用户设置的主题颜色,用户自定义的文件保存路径等. 一般应用的的数据存储分为两种,一种是云存储(将数据保存在云端,下次打开的时候 ...

  7. Android 自定义ToggleButton+用SharedPreferences保存用户配置

    布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:i ...

  8. 登录页面设置cookie,用户登录后,创建cookie保存用户信息

    代码要求: 用户登录后,创建cookie保存用户信息 设置cookie的有效期为5分钟 在登录页循环遍历cookie数组,判断是否存在指定名称的cookie,若存在则直接跳转至欢迎页面 代码实现过程: ...

  9. Ubuntu:PHP语言实现网页登录并保存用户cookie,使用mysql数据库

    Ubuntu:PHP语言实现网页登录并保存用户cookie,使用mysql数据库 网页主要实现功能 建立网页mysql数据库信息 网页登录及反馈页面代码 登录页面 登录反馈界面 输入URL在地址栏登录 ...

最新文章

  1. 解决JS在url中传递参数时参数包含中文乱码的问题
  2. 【性能优化实战】java嵌入式开发pos
  3. java中Freemarker list指令详解
  4. 以下哪个选项不是单例模式的优点_深度解密Python单例模式
  5. 现代数学和理论物理已经发展到多么令人震惊的水平了?
  6. Linux命令find查询suid和sgid
  7. swift基础之_swift调用OC/OC调用swift
  8. 剑指offer-数值的整数次方
  9. c#如何取得事件注册的方法
  10. 基于tushare和python的证券市场价格分析
  11. 我对onselect和onchange事件的误解
  12. android 圆角 水波纹_Android实现水波纹点击效果
  13. phpword模板替换并插入表格
  14. 携程旅行网的盈利模式
  15. Latex 中如何使插图的位置不跑到开头而紧跟插入的文字后
  16. 一物一码(7): 【一物一码营销场景之促销】
  17. 计算球的体积-java
  18. elementui的el-select、el-date-picker的宽度比el-input宽度短
  19. 数据库关系代数运算之连接
  20. 摘自迅雷视频网站基于CSS+HTML实现大气清新的蓝色导航

热门文章

  1. 【机器学习】 - import cv2 opencv安装python
  2. 【PAT - 甲级1034】Head of a Gang (30分)(并查集)
  3. 【CodeForces - 208C 】Police Station(单源最短路条数,起点终点建图,枚举顶点)
  4. 【POJ - 1698】Alice's Chance(网络流最大流,建图)
  5. 【HDU - 6186】CS Course(按位与,按位或,按位异或的区间统计,二进制拆位)
  6. Apollo进阶课程⑪ | Apollo地图生产技术
  7. 吴恩达机器学习作业(五):支持向量机
  8. 计算机测试怎么提交,Win7电脑怎么测试上传速度?
  9. wamp php启动不成功,wamp的mysql 启动失败解决
  10. vue 断开正在发送的请求_vue 发送请求频繁时取消上一次请求