awesome-fenix icon indicating copy to clipboard operation
awesome-fenix copied to clipboard

「Comment」https://icyfenix.cn/architect-perspective/general-architecture/system-security/confidentiality.html

Open fenixsoft opened this issue 4 years ago • 17 comments

https://icyfenix.cn/architect-perspective/general-architecture/system-security/confidentiality.html

fenixsoft avatar Apr 14 '20 13:04 fenixsoft

“客户端无轮是否动态加盐,都不可能代替HTTPS。” 无论写错了

UUNNFLY avatar Dec 18 '20 01:12 UUNNFLY

“10轮的意思是210次哈希”,应该是2^10,或者210

UUNNFLY avatar Dec 18 '20 01:12 UUNNFLY

@UUNNFLY

感谢,这两处已经修正了。

fenixsoft avatar Dec 18 '20 04:12 fenixsoft

密码存储和验证,第5步“生成一个长度与哈希值相等的随机字符串”,周大哥,是跟哈希值长度相等吧,不是跟哈希值相等?

dengchaoh avatar Dec 29 '20 12:12 dengchaoh

启用HTTPS可以防御链路上的恶意嗅探,也能在通讯层面解决了重放攻击的问题

请问https怎么解决重放攻击的问题,不需要加nonce之类的信息吗

UUNNFLY avatar Dec 30 '20 13:12 UUNNFLY

@UUNNFLY

请问https怎么解决重放攻击的问题,不需要加nonce之类的信息吗

完全不需要。nonce这种土办法对于防重放是不严谨的,它只能处理没有恶意中间人的情况。

HTTPS的通讯密钥是在连接握手时双方协商确定的,你即使拿到了通讯的完整内容,只要使用另一个TCP连接与服务端通讯,由于密钥变化,也将导致录制重放变得毫无意义。这节课的下一节“传输”中解释了HTTPS的密钥协商过程,以及通过PKI/CA解决恶意中间人的过程。

fenixsoft avatar Dec 31 '20 01:12 fenixsoft

"不过,如果你阅读了Fenix's Bookstore的源码,会发现这步依然采用了Spring Security 5中的BcryptPasswordEncoder,但是请注意它默认构造函数中的Cost参数值为-1,实际只进行了2-1=1次计算,所以不会对服务端造成额外的压力。"

周大哥你好,这段话是不是有误,因为我用的也是默认的构造函数,生成出来的密码中是$10的cost,且我看到源码中对-1最后的处理是使用了GENSALT_DEFAULT_LOG2_ROUNDS=10的默认值,所以默认的构造函数cost应该是10才对吧?

org.springframework.security.crypto.bcrypt.BCrypt public static String gensalt() { return gensalt(GENSALT_DEFAULT_LOG2_ROUNDS); }

findxyz avatar Jan 22 '21 06:01 findxyz

@github20120522 "不过,如果你阅读了Fenix's Bookstore的源码,会发现这步依然采用了Spring Security 5中的BcryptPasswordEncoder,但是请注意它默认构造函数中的Cost参数值为-1,实际只进行了2-1=1次计算,所以不会对服务端造成额外的压力。"

周大哥你好,这段话是不是有误,因为我用的也是默认的构造函数,生成出来的密码中是$10的cost,且我看到源码中对-1最后的处理是使用了GENSALT_DEFAULT_LOG2_ROUNDS=10的默认值,所以默认的构造函数cost应该是10才对吧?

org.springframework.security.crypto.bcrypt.BCrypt public static String gensalt() { return gensalt(GENSALT_DEFAULT_LOG2_ROUNDS); }

说的是BCryptPasswordEncoder的默认构造函数,如下:

	public BCryptPasswordEncoder() {
		this(-1);
	}

	/**
	 * @param strength the log rounds to use, between 4 and 31
	 */
	public BCryptPasswordEncoder(int strength) {
		this(strength, null);
	}

fenixsoft avatar Jan 22 '21 07:01 fenixsoft

	public BCryptPasswordEncoder() {
		this(-1);
	}

	/**
	 * @param strength the log rounds to use, between 4 and 31
	 */
	public BCryptPasswordEncoder(int strength) {
		this(strength, null);
	}

	/**
	 * @param strength the log rounds to use, between 4 and 31
	 * @param random the secure random instance to use
	 *
	 */
	public BCryptPasswordEncoder(int strength, SecureRandom random) {
		if (strength != -1 && (strength < BCrypt.MIN_LOG_ROUNDS || strength > BCrypt.MAX_LOG_ROUNDS)) {
			throw new IllegalArgumentException("Bad strength");
		}
		this.strength = strength;
		this.random = random;
	}

	public String encode(CharSequence rawPassword) {
		String salt;
		if (strength > 0) {
			if (random != null) {
				salt = BCrypt.gensalt(strength, random);
			}
			else {
				salt = BCrypt.gensalt(strength);
			}
		}
		else {
			salt = BCrypt.gensalt();
		}
		return BCrypt.hashpw(rawPassword.toString(), salt);
	}

BCryptPasswordEncoder的代码我看到了,后面它在做encode时候因为strength = -1所以最后会走到BCrypt.gensalt()这里吧 然后BCrypt.gensalt()里面默认是cost = 10

	private static final int GENSALT_DEFAULT_LOG2_ROUNDS = 10;

	/**
	 * Generate a salt for use with the BCrypt.hashpw() method, selecting a reasonable
	 * default for the number of hashing rounds to apply
	 * @return an encoded salt value
	 */
	public static String gensalt() {
		return gensalt(GENSALT_DEFAULT_LOG2_ROUNDS);
	}

findxyz avatar Jan 22 '21 09:01 findxyz

@github20120522

感谢指正,已经更新:)

fenixsoft avatar Jan 23 '21 04:01 fenixsoft

Spring Security BcryptPasswordEncoder不是服务端加密么?文中貌似就是客户端Bcrypt加密到服务端做了个SHA256?

futurexiong avatar Aug 17 '21 04:08 futurexiong

如果我们控制 BCrypt 的执行时间大概是 0.1 秒完成一次哈希计算的话,按照 1 秒生成 10 个哈希值的速度,算完所有的 10 位大小写字母和数字组成的弱密码大概需要 P(62,10)/(3600×24×365)/0.1=1,237,204,169 年时间。

算式是不是有点问题 P(62,10)/((3600×24×365)/0.1) 或者 P(62,10)*0.1/(3600×24×365)

holiday12138 avatar Sep 13 '21 07:09 holiday12138

这一节只介绍了无法回推原文的加密(hash),但实际应用场景里会需要至少在服务端配置文件或者数据库里保存能回推原文的加密信息,比如数据库密码,信用卡号等等。希望能增加对这些信息进行保密的手段的介绍,谢谢

heq99 avatar Nov 07 '21 00:11 heq99

盐值那里说了几个盐值啊,感觉好几个,是这个意思吗:客户端的盐值肯定是服务端给的,注册时给的,登录时才能再传给服务端,服务端才能验证

yaoyuanyy avatar Nov 28 '21 15:11 yaoyuanyy

CSPRNG产生的salt和使用用户唯一属性(像uid、手机号之类的)作为salt,有什么区别吗?被拖库后,无论是那种salt,不都能被获取到么?志明大佬,能否解释一下呢?

katlog avatar Mar 31 '22 03:03 katlog

@yaoyuanyy 盐值那里说了几个盐值啊,感觉好几个,是这个意思吗:客户端的盐值肯定是服务端给的,注册时给的,登录时才能再传给服务端,服务端才能验证

客户端用的是自己的盐吧,服务端不关心客户端加盐前的登录信息。

yingang avatar Aug 13 '22 15:08 yingang

@katlog CSPRNG产生的salt和使用用户唯一属性(像uid、手机号之类的)作为salt,有什么区别吗?被拖库后,无论是那种salt,不都能被获取到么?志明大佬,能否解释一下呢?

目的不是为了保护盐,而是加盐前的信息吧?

yingang avatar Aug 13 '22 15:08 yingang