移动APP如何保存用户密码

<span style="font-size:14px;">为了更好的用户体验,移动APP客户端一般都会将用户信息进行保存以便后续可以自动登录.</span>

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

解决的方法大概有一下几种:

1.首先,如果客户端和服务端都是你来设计开发,那么有两种比较可靠的方案

A.客户端将密码Hash加密,登录成功后将hash值保存到Sqlite.服务端得到用户名和hash值,采用同样的算法对密码进行Hash运算,然后和用户传来的hash值进行比较,一致则登录成功.更加可靠的是对密码加盐加密.例如可以采用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 salt
		SecureRandom random = new SecureRandom();
		byte[] salt = new byte[SALT_BYTE_SIZE];
		random.nextBytes(salt);

		// Hash the password
		byte[] 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值,然后采用同样的算法对数据库里面的密码进行计算

	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 parameters
		String[] 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 length
		byte[] 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一致,则登录成功.同时客户端将加密后的字符串保存到本地数据库,下次登录时直接从数据库读取.

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

  1. 客户端使用公钥加密密码,得到加密串,然后将其发送到服务端.
  2. 服务端使用私钥解密密码,进行验证,
  3. 登录成功后,客户端将加密串保存到本地,便于下次自动登录;

使用非对称加密比较可靠,即使加密串被泄露也无法得到密码.

2.如果你只是负责客户端,对服务端无能为力,那么你可能只能使用对称加密了.(如你正在为学校图书馆写个客户端,你还想设置自动登录,那么你本地只能使用对称加密了,将加密串保存到本地,然后下次自动登录时,从数据库取出加密串然后解密...服务端只识别原始的密码)

这种情况,你只能考虑如何生成加密密钥,以及如何保存密钥,如何混淆.

考虑了一种方法:

加解密函数 DES(passwd,key,encode);

str1 =  DES(passwd,key,encode);

str2 =  DES(key,str1,encode);

本地数据库中保存 str1:str2.

解密时,str2以str1解密得到key.

然后,str1以key解密得到passwd.

非对称加密只能以这种逻辑上的复杂度增加密码的强度.

另参考文章:http://blog.csdn.net/hengyunabc/article/details/34623957

时间: 2024-10-11 12:38:10

移动APP如何保存用户密码的相关文章

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

移动App该如何保存用户密码? 这个实际上和桌面程序是一样的. 先看下一些软件是如何保存用户密码的: 我们先来看下QQ是怎么保存密码的: 参考:http://bbs.pediy.com/archive/index.php?t-159045.html, 桌面QQ在2012的时候把密码md5计算之后,保存到本地加密的Sqlite数据库里. 再来看下手机淘宝是怎么做的: 参考:http://blog.csdn.net/androidsecurity/article/details/8666954 手机

移动App该如何保存用户密码(转)

原文地址:http://blog.csdn.net/hengyunabc/article/details/34623957 移动App该如何保存用户密码? 这个实际上和桌面程序是一样的. 先看下一些软件是如何保存用户密码的: 我们先来看下QQ是怎么保存密码的: 参考:http://bbs.pediy.com/archive/index.php?t-159045.html, 桌面QQ在2012的时候把密码md5计算之后,保存到本地加密的Sqlite数据库里. 再来看下手机淘宝是怎么做的: 参考:h

iOS中使用SFHFKeychainUtils保存用户密码

iOS中使用SFHFKeychainUtils保存用户密码,有需要的朋友可以参考下. 项目中需要保存用户密码,以实现自动登录的功能.于是,研究了下iOS保存密码的方法: 1.保存用户密码的安全方法 作为一名iPhone开发者,你需要对你的用户安全负责.请问,你是怎么保存用户的密码的?直接保存到plist文件里?加密?AES? DES?能保证你的代码不被反编译拿到你的加密Key? 这也未免太不苹果了吧.我Google了一下,国内的开发者根本没有注意到这个问题. 苹果系统中有个程序叫"钥匙串&quo

避免明文保存用户密码

最近在学习php,对于安全的一点点小心得. 用php做一个注册/登陆页面时,要记得用对密码进行加密(AES或者RSA). Mysql提供了方便使用的AES_ENCRYPT('$password', '$password')函数,可以保证我们在存储密码时至少不是明文状态.这个函数的第一个参数是,要保存的内容而第二个参数则是密钥.一般我们也用要加密的内容作为密钥,这样至少可以保证不会因为密钥泄露而导致用户的密码遭到破解. 同时要注意使用AES加密内容时,内容所在字段类型为二进制的原始内容比如varb

移动APP怎样保存用户password

<span style="font-size:14px;">为了更好的用户体验,移动APPclient一般都会将用户信息进行保存以便兴许能够自己主动登录.</span> 保存了用户信息便涉及到了安全问题. 解决办法大概有一下几种: 1.首先,假设client和服务端都是你来设计开发,那么有两种比較可靠的方案 A.client将passwordHash加密,登录成功后将hash值保存到Sqlite.服务端得到username和hash值,採用相同的算法对passw

利用钥匙串,在应用里保存用户密码的方法

https://github.com/ldandersen/scifihifi-iphone/tree/master/security ////  SFHFKeychainUtils.h////  Created by Buzz Andersen on 10/20/08.//  Based partly on code by Jonathan Wight, Jon Crosby, and Mike Malone.//  Copyright 2008 Sci-Fi Hi-Fi. All right

偏好设置保存用户信息

偏好设置保存用户信息. { <1>如果用户登陆成功,就保存用户信息.下次直接从偏好设置中读取用户信息,以此做到用户只需要输入一次账号和密码,以后登陆就可以不用再次输入. 1>.登陆成功,保存用户信息(偏好设置) 2>.再次进入,直接显示用户之前保存的信息.避免用户重复输入. // 偏好设置存储用户信息 -(void)savaUserInfo { // 实例化偏好设置对象(单例) NSUserDefaults *User = [NSUserDefaults standardUserD

用户密码加密存储十问十答,一文说透密码安全存储

我们数据库的权限管理十分严格,敏感信息开发工程师都看不到,密码明文存储不行吗? 不行.存储在数据库的数据面临很多威胁,有应用程序层面.数据库层面的.操作系统层面的.机房层面的.员工层面的,想做到百分百不被黑客窃取,非常困难. 如果密码是加密之后再存储,那么即便被拖库,黑客也难以获取用户的明文密码.可以说,密码加密存储是用户账户系统的底裤,它的重要性,相当于你独自出远门时缝在内衣里钱,虽然你用到他们的概率不大,但关键时刻他们能救命. 那用加密算法比如AES,把密码加密下再存,需要明文的时候我再解密

关于用户密码安全

没有做PC端,仅仅移动端,求鞭笞(我是小应用,社区类型的.) 总体思路:客户体验>服务器压力>客户端复杂度 移动客户端:保存用户密码,以便于下次token过期时使用. 保存加密方式:iOS:keychain android:目前AES (android理论上在手机被root+我的软件被完全破解后,密码也能被搞出来,keychain就难度很大很大了,userDefaulter其实也只有手机被越狱获取权限后才有危险) 服务端: md5(密码+盐)+密码错误尝试次数限制,因为本身身份验证请求,不会频