移动APP怎样保存用户password

<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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

extjs2.0 文件上传_extjs数据存储与传输

本章内容qExt.data简介qExt.data.ConnectionqExt.data.RecordqExt.data.Storeq常用proxyq常用readerq高级storeqEXT中的Ajaxq关于scope和createDelegate()qDWR与EXT整合10.1Ext.data简介Ext.data在命名空间中定义了一系列store、reader和proxy。Grid和ComboxBox都是以Ext.data为…

盘点key value在各个编程语言中的类型

个人博客点这里 起步 在编程语言中,有这么一种数据类型,我们经常会使用到,他就是类似于json的键值对类型 那么今天我们就对比一下,在各大编程语言中的key value类型的特点 main python key value 叫做字典 dict类型 声明 字典操作 以键值对方式存在的无序数据的组合就是…

音频格式详解 CD WAV MP3 WMA MIDI RM RA OGG VOF AAC M4A APE FLAC TAK TTA MV RealAudio AIFF AU

以下是常见音频文件格式的特点。 要在计算机内播放或是处理音频文件&#xff0c;也就是要对声音文件进行数、模转换&#xff0c;这个过程同样由采样和量化构成&#xff0c;人耳所能听到的声音&#xff0c;最低的频率是从20Hz起一直到最高频率20KHZ&#xff0c;20KHz以上人耳是听…

Spring MVC-表单(Form)标签-下拉框(Dropdown)示例(转载实践)

以下内容翻译自&#xff1a;https://www.tutorialspoint.com/springmvc/springmvc_dropdown.htm 说明&#xff1a;示例基于Spring MVC 4.1.6。 以下示例显示如何使用Spring Web MVC框架在表单中使用Dropdown。首先&#xff0c;让我们使用Eclipse IDE&#xff0c;并按照以下步骤…

vuex的命名空间有哪些_Vuex在vue路由器中访问命名空间模块的getter

我试图通过检查用户是否经过身份验证来保护我的路由&#xff0c;这是示例路由&#xff1a;{path: /intranet,component: search,meta: { requiresAuth: true },props: {tax: type,term: intranet-post,name: Intranet}},我正在这样设置警卫&#xff1a;router.beforeEach((to, …

阿里巴巴中文站架构设计实践(何崚)图书

阿里巴巴中文站架构实践 何崚阿里巴巴 全文地址:阿里巴巴中文站架构设计实践(何崚).pdf 更多课件可到:这里查看 后续内容还在更新…

使用sqlite3创建数据库表的时候须要注意

使用sqlite3创建数据库表的时候须要注意&#xff1a; 1. 不能使用纯数字 2. 不能带有"-",""等字符。也不能以数字打头。一、以下是log打出来的信息&#xff1a; DB Error: 1 "unrecognized token: "47464636265757265763393573649"" D…

物联网世界的承诺与挑战

最初参与到与物联网&#xff08;Internet of Things / IoT&#xff09;相关的行业对话时&#xff0c;我对整个行业的发展充满疑问。“ 物联网”和 “万联网”&#xff08;Internet of Everything&#xff09;有什么区别&#xff1f;这场变革现今是处于启蒙阶段&#xff0c;亦或…

音乐文件基本格式,wave,mod,midi,mp3,wma,flac

经典的WAVE WAVE文件作为最经典的Windows多媒体音频格式&#xff0c;应用非常广泛&#xff0c;它使用三个参数来表示声音&#xff1a;采样位数、采样频率和声道数。 声道有单声道和立体声之分&#xff0c;采样频率一般有11025Hz&#xff08;11kHz&#xff09;、22050Hz&#xf…

bilibili go框架_最好的开发语言一定是那位吗?Go语言有话说

鲁迅先生说过&#xff0c;所有能用 JS 写的前端项目最终都会被用 JS 重写一遍&#xff0c;所有能用 Go 写的后端项目最终也都会被用 Go 重写一遍。作为一名开发者&#xff0c;周六的我们能做什么呢&#xff1f;是因为产品经理的各种需求在加班吗&#xff1f;给你说了实现不了实…

关于虚拟机栈的理解

虚拟机栈 虚拟机栈出现的背景 由于跨平台性的设计,Java的指令都是根据栈来设计的. 不同平台CPU架构不同,所以不能设置为基于寄存器的 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令. 有不少Java开发人员一提到Java内存结构,就会非常粗…

抓取各个浏览器引擎关键字,,百度学术关键字

百度学术 $list_arr getbaiduxueshu($row[name]); $list_arr explode((,$list_arr); $list_arr explode(),$list_arr[1]); $list_arr json_decode($list_arr[0]); $list_arr $list_arr->s; //百度学术平台热词地址function getbaiduxueshu($keyname 100){ $url http:…

wave格式分析,wave音频文件格式分析配程序

wav文件格式分析详解 程序如上一篇博文 一、综述 WAVE文件作为多媒体中使用的声波文件格式之一&#xff0c;它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写&#xff0c;每个WAVE文件的头四个字节便是“RIFF”。 WAVE文件是由若干个Chunk组成…

poi设置word表格单元格宽度_java poi如何设置word的页面的大小和水平方向?

展开全部你好&#xff0c;试试以下代码行不行。packagecom.sample;importjava.awt.color;importjava.io.fileoutputstream;importjava.io.ioexception;importcom.lowagie.text.cell;importcom.lowagie.text.document;importcom.lowagie.text.documentexception;importcom.lowag…

时间通用方法

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;import org.apache.commons.lang3.time.DateFormatUtils;/** * 日期工具类, 继承org.apache.commons.lang.time.DateUtils类 */ public class DateUtils extends org.apache.commo…

Python-MongoDB的驱动安装、升级

安装pip&#xff0c;并通过此来安装pymongo–Python mongodb驱动 1、下载pip安装包&#xff0c;下载地址&#xff1a;http://pypi.python.org/packages/source/p/pip/pip-1.0.2.tar.gz#md547ec6ff3f6d962696fe08d4c8264ad49 2、解压安装&#xff1a; tar -zxf pip.1.0.2.tar.gz…

python5_python5

python2&python31.python2中print可加括号可不加括号&#xff0c;python3中print一定要加括号。2.python2中有range(),也有xrange(),python中只有range()。生成器。3.Python2中raw_input(),python3中input()。,,is赋值比较是否相等is 比较内存地址&#xff0c;id(内容)li1[…

单例设计模式1

单例 所谓单例设计模式,即时采取一定的方法保证在整个软件系统当中,对于某个类只能存在一个对象实例,并且该类只提供一个其对象实例的方法(静态方法) 恶汉式 优缺点说明: 优点:这种写法比较简单,就是在类装载的时候就完成实例化.避免了线程同步问题 缺点: 在类装载的时候就…

SJXXX串口扩展芯片 4串口芯片 UART串口芯片

SJXX串口扩展芯片1 概述SJ000是一款具备I2C总线/SPI总线/UART接口的四通道异步收发器件&#xff0c;通过模式选择使得该器件工作于以上任何一种主接口模式下。器件的四个通道UART可提供高达2Mbps的数据率&#xff0c;低功耗模式和睡眠电流。每个通道含有一个接收器和一个发送器…

MPLS服务合同到期了,是否该续签?

当考虑是否要更新现有MPLS服务合同以及续签多久时&#xff0c;你需要着眼于从价格到部署速度的方方面面。简而言之&#xff0c;如果你还没有获取一些与软件定义广域网有关技术的经验&#xff0c;即使用宽带或取代MPLS服务&#xff0c;那么你就没办法在未来几个月之内弃用MPLS。…