精华内容
下载资源
问答
  • 今天这篇文章,讲通过对话的形式,让你由浅入深着知道,为什么 Https 是安全的。 、对称加密 禅:在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端。之后服务器给客户端发送真实...

    今天这篇文章,讲通过对话的形式,让你由浅入深着知道,为什么 Https 是安全的。

    一、对称加密

    一禅:在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端。之后服务器给客户端发送真实数据的时候,会用这把密钥对数据进行加密,客户端收到加密数据之后,用刚才收到的密钥进行解密。如图:

    当然,如果客户端要给服务器发送数据,也是采用这把密钥来加密,这里为了方便,我采用单方向传输的形式

    小白:那万一密钥在传输的过程中被别人截取了怎么吧?

    例如:

    假如服务器用明文的方式传输密钥给客户端,然后密钥被中间人给捕获了,那么在之后服务器和客户端的加密传输过程中,中间人也可以用他捕获的密钥进行解密。这样的话,加密的数据在中间人看来和明文没啥两样

    二、非对称加密

    一禅:这种方法就是,让客户端和服务器都拥有两把钥匙,一把钥匙是公开的(全世界知道都没关系),我们称之为公钥;另一把钥匙则是保密的(只有自己本人才知道),我们称之为私钥。这且,用公钥加密的数据,只有对应的私钥才能解密;用私钥加密的数据,只有对应的公钥才能解密

    这样,服务器在给客户端传输数据的过程中,可以用客户端明文给他的公钥进行加密,然后客户端收到后,再用自己的私钥进行解密。客户端给服务器发送数据的时候也一样采取这样的方式。这样就能保持数据的安全传输了。画个图理解一下:



    一禅:处理方式就是结合 对称加密+非对称加密这两种方式,我们可以用非对称加密的方式来传输对称加密过程中的密钥,之后我们就可以采取对称加密的方式来传输数据了。具体是这样子的:

    服务器用明文的方式给客户端发送自己的公钥,客户端收到公钥之后,会生成一把密钥(对称加密用的),然后用服务器的公钥对这把密钥进行加密,之后再把密钥传输给服务器,服务器收到之后进行解密,最后服务器就可以安全着得到这把密钥了,而客户端也有同样一把密钥,他们就可以进行对称加密了。

    小白:例如:

    服务器以明文的方式给客户端传输公钥的时候,中间人截取了这把属于服务器的公钥,并且把中间人自己的公钥冒充服务器的公钥传输给了客户端。

    之后客户端就会用中间人的公钥来加密自己生成的密钥。然后把被加密的密钥传输给服务器,这个时候中间人又把密钥给截取了,中间人用自己的私钥对这把被加密的密钥进行解密,解密后中间人就可以获得这把密钥了。

    最后中间人再对这把密钥用刚才服务器的公钥进行加密,再发给服务器。如图:

    毫无疑问,在这个过程中,中间人获取了对称加密中的密钥,在之后服务器和客户端的对称加密传输中,这些加密的数据对中间人来说,和明文没啥区别。

    数字证书登场

    在刚才的讲解中,我们知道,之所以非对称加密会不安全,是因为客户端不知道这把公钥是否是服务器的,因此,我们需要找到一种策略来证明这把公钥就是服务器的,而不是别人冒充的。

    解决这个问题的方式就是使用数字证书,具体是这样的:

    我们需要找到一个拥有公信力、大家都认可的认证中心(CA)

    服务器在给客户端传输公钥的过程中,会把公钥以及服务器的个人信息通过Hash算法生成信息摘要。如图

    为了防止信息摘要被人调换,服务器还会用CA提供的私钥对信息摘要进行加密来形成数字签名。如图:

    并且,最后还会把原来没Hash算法之前的个人信息以及公钥 和 数字签名合并在一起,形成数字证书。如图

    当客户端拿到这份数字证书之后,就会用CA提供的公钥来对数字证书里面的数字签名进行解密来得到信息摘要,然后对数字证书里服务器的公钥以及个人信息进行Hash得到另外一份信息摘要。最后把两份信息摘要进行对比,如果一样,则证明这个人是服务器,否则就不是。如图:

    这样,就可以保证服务器的公钥安全着交给客户端了。

    其实,(有些)服务器一开始就向认证中心申请了这些证书了(有没有看过没有证书的网站在地址栏会被标出警告?),而客户端是,也会内置这些证书。如图:

    当客户端收到服务器传输过来的数据数字证书时,就会在内置的证书列表里,查看是否有解开该数字证书的公钥,如果有则…,如果没有则…

    兄dei,如果觉得我写的不错,不妨帮个忙

    1、关注我的原创微信公众号「帅地玩编程」,每天准时推送干货技术文章,专注于写算法 + 计算机基础知识(计算机网络+ 操作系统+数据库+Linux),听说关注了的不优秀也会变得优秀哦。

    2、给俺点个赞呗,可以让更多的人看到这篇文章,顺便激励下我,嘻嘻。

    作者简洁

    作者:大家好,我是帅地,从大学、自学一路走来,深知算法计算机基础知识的重要性,所以申请了一个微星公众号『帅地玩编程』,专业于写这些底层知识,提升我们的内功,帅地期待你的关注,和我一起学习。 转载说明:未获得授权,禁止转载

    展开全文
  • 不过由于这个取得下一条和取得上一条的记录其实在日常的开发当中还是会经常遇到,最常见的场景可能就是取得一篇文章的上一篇文章和下一篇文章了。其实这个在Laravel的Eloquent中实现还是挺容易的,不过由于Laravel并...

    很多框架都可以完成,同理。

    Laravel的Eloquent ORM 获取当前记录的上一篇下一篇

    然后,当时在答案里面简单写了一下解决方案。不过由于这个取得下一条和取得上一条的记录其实在日常的开发当中还是会经常遇到,最常见的场景可能就是取得一篇文章的上一篇文章和下一篇文章了。其实这个在Laravel的Eloquent中实现还是挺容易的,不过由于Laravel并没有直接提供给我们相应的方法,我们得使用一个小小的技巧:

    取得上一篇的文章id

    protected function getPrevArticleId($id)
    {
       return Article::where('id', '<', $id)->max('id');
    }


    取得上一篇的文章id$id就是当前文章的id,我们通过max()来取得比当前id小的最大值,也就是当前id的前一篇文章的id。

    protected function getNextArticleId($id)
    {
       return Article::where('id', '>', $id)->min('id');
    }

    基本上可以说是:同理可得。这个取得下一篇文章的id其实就是一个相反的过程,理解万岁


    通过上面的方法,可以很轻松的实现上一篇下一篇的功能。

    文章已迁移:https://juejin.im/post/5d0c4598e51d45109725fe97

    展开全文
  • 实现文章一篇和下一篇的两种方式: 1.获取数据列表,通过程序判定当前文章的上一篇和下一篇; 注意:数据量少的话用以上方式解决,但是如果数据量较大则效率低下,请参考第二种实现方式; @RequestMapping(value...

    实现文章上一篇和下一篇的两种方式:

    1.获取数据列表,通过程序判定当前文章的上一篇和下一篇;

    注意:数据量少的话用以上方式解决,但是如果数据量较大则效率低下,请参考第二种实现方式;

    
    	@RequestMapping(value="detail${urlSuffix}")
    	public String detail(ConfigGovernmentMessage configGovernmentMessage, HttpServletRequest request, HttpServletResponse response, Model model) {
    		ConfigGovernmentMessage governmentMessage = configGovernmentMessageService.get(configGovernmentMessage);
    		model.addAttribute("governmentMessage", governmentMessage);
    		ConfigGovernmentMessage messages = new ConfigGovernmentMessage();
    		messages.setStatus(DictUtils.getDictValue("上架", "on_off_show", "1"));
    		List<ConfigGovernmentMessage> list = configGovernmentMessageService.findList(messages);
    		ConfigGovernmentMessage beforeMessage = null;
    		ConfigGovernmentMessage afterMessage = null;
    		int idx = 0;
    		for (ConfigGovernmentMessage message : list) {
    			if(governmentMessage.getId().equals(message.getId())){
    				break;
    			}
    			idx++;
    		}
    		if(list.size() >1) {
    			if(idx==0){
    				afterMessage = list.get(idx+1);
    			}else if(idx==list.size()-1){
    				beforeMessage = list.get(idx-1);
    			}else{
    				beforeMessage = list.get(idx-1);
    				afterMessage = list.get(idx+1);
    			}
    		}
    		model.addAttribute("beforeMessage", beforeMessage);
    		model.addAttribute("afterMessage", afterMessage);
    		ConfigSystemClassify configSystemClassify = new ConfigSystemClassify();
    		List<ConfigSystemClassify> classifyList = configSystemClassifyService.findList(configSystemClassify);
    		model.addAttribute("classifyList", classifyList);
    		return "front/app/government/governmentMessageDetail";
    	}
    

    2.通过sql的行号(rownum)实现上一篇和下一篇

    mysql实现:
    mysql本身没有行号,可以通过@rownum1 := 0定义变量实现,如下:

    SELECT
    	m.*
    FROM
    	(
    		SELECT
    			a.id,
    			(@rownum1 := @rownum1 + 1) AS rownum
    		FROM
    			cms_article a,
    			(SELECT @rownum1 := 0) b
    	) m -- 1.查询文章列表以及行号(rownum)
    	,
    	(
    		SELECT
    			c.rownum
    		FROM
    			(
    				SELECT
    					a.id,
    					(@rownum2 := @rownum2 + 1) AS rownum
    				FROM
    					cms_article a,
    					(SELECT @rownum2 := 0) b
    			) c
    		WHERE
    			c.id = '1000000957611871'
    	) n -- 2.查询当前文章在文章列表中的行号
    WHERE
    	m.rownum > n.rownum -- 3.通过比较行号来寻找上一篇和下一篇,大于号(>)代表下一篇,小于号(<)代表上一篇
    LIMIT 1
    

    oracle实现:
    oracle本身自带伪列行号,不用像mysql那样操作,如下:

    SELECT
    	m.*
    FROM
    	(
    		SELECT
    			a.id,
    			rownum
    		FROM
    			cms_article a
    	) m -- 1.查询文章列表以及行号(rownum)
    	,
    	(
    		SELECT
    			c.rownum
    		FROM
    			(
    				SELECT
    					a.id,
    					rownum
    				FROM
    					cms_article a
    			) c
    		WHERE
    			c.id = '1000000957611871'
    	) n -- 2.查询当前文章在文章列表中的行号
    WHERE
    	m.rownum > n.rownum -- 3.通过比较行号来寻找上一篇和下一篇,大于号(>)代表下一篇,小于号(<)代表上一篇
    LIMIT 1
    
    展开全文
  • 自我介绍与博客规划-第一篇文章

    千次阅读 2017-09-05 17:08:37
    写下着第一篇文章的时候,正是我大二开学的时间,在老师讲课期间说起我们在学习的时候应当写写博客,记录一下自己开发或学习中遇到的问题,也是方便我们深入的理解,在未来的日子,坚持写下去,一定会有更多的收获!...

     

    自我介绍:

    我是来自天朝下重庆大学的一名程序猿,或者叫我程序羊(因为我的名字叫东阳),哈哈,其实我自己也有博客,同时也运维着几个网站,但为啥还要来CSDN呐?

    写下着第一篇文章的时候,正是我大二开学的时间,在老师讲课期间说起我们在学习的时候应当写写博客,记录一下自己开发或学习中遇到的问题,也是方便我们深入的理解,在未来的日子,坚持写下去,一定会有更多的收获!

    为此,今天开通了CSDN的博客,以前只是看人家的文章,现在自己也要尝试着多写写,记录问题,也为有志同道合者提供便利!

    在此之前,自己已经写下很多技术的文章,可以参看《DYBOY's Blog》,里面很多的技术文章都是我自己的原创的文章!

     

    博客规划:

    1.记录自己开发或学习中遇到的问题,并提供解决之道;

    2.以前的文章我也不打算转载过来了,先以python作为开端,我们一起学习爬虫,以及利用python进行更深入的学习和开发!

    3.由此,目前博客的主题会主打围绕着数据结、构算法分析和python爬虫,祝愿志同道合者一起逐渐丰富经验吧!

    4.以后会逐渐使用markdown来写博客,这个编辑器,确实哈哈~

    展开全文
  • 一篇文章、下一篇文章实现

    千次阅读 2013-11-13 13:31:36
    一篇、下一篇的实现
  • ThinkPHP实现文章一篇和下一篇

    千次阅读 2016-12-03 10:24:31
    控制器代码: (可以根据自己文章排序不同而修改)$id= $_GET['id']; //上一篇 $front=M('article')->where("id>".$id)->order('id asc')->limit('1')->find(); $this->assign('front',$front); //下一篇 $after...
  • 学习C基础这一篇就够了

    万次阅读 多人点赞 2020-08-28 14:54:07
    注意问题:由于这篇文章我是用WORD编辑的,写完以后,发现没办法转换为MD格式,所以我只能用截图的形式上传了,写这篇文章的主要目的是对C语言基础知识的个简单梳理。 ...
  • sql查询文章一篇一篇

    千次阅读 2018-03-29 11:18:27
    遇到显示文章时显示上一篇、下一篇的id、title提示需求,经常就是取到当前文章,然后再根据发布时间分别取到上一篇、下一篇文章,然是这样要交互三次数据库,想写一个sql一次执行出来,原来写的是 SELECT *, ...
  • @Autowired private RedisTemplate redisTemplate;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,124,447
精华内容 849,778
关键字:

介绍自己的一篇作文