工作中会听到各种各样是是而非的词汇,base64,url,sha256,rsa,hash等等,你能很好的分清这些词语吗?

这次我想把它们统一的整理说明下:

一: 编码

编码是信息从一种形式或格式转换为另一种形式的过程,所以他们是可逆的,不能称之为加密。

下面列举几个常见的(参考编码那些事):

html实体编码(10进制与16进制):

如把尖括号编码[ < ]  -----> html十进制: <  html十六进制:<

javascript的八进制跟十六进制:

如把尖括号编码[ < ]  -----> js八进制:\74  js十六进制:\x3c

jsunicode编码:

如把尖括号编码[ < ]  ----->jsunicode:\u003c

url编码 base64编码:

如把尖括号编码[ < ]  -----> url: %3C  base64: PA==

你可以根据他们编码后的特征来快速分辨一个看上去毫无意义的字符是由什么编码转换过来的,并试试将其转换回去,百度有一个转化工具:xss编码转换工具

如下:

编码类型 特征(以什么特征字符开头) 以“<”字符为例
html实体编码10进制 &# &#60
html实体编码16进制 &#x &#x3c
javascript的八进制 \ \74
javascript的十六进制 \x \x3c
jsunicode编码 \u \u003c
url编码 % %3C
base64编码 PA==

base64编码的内容可以参考这边博客base64相关

二:加解密

加密的目的就是让密文是不可逆的,除非你掌握了相关密钥。

加解密的算法分为2种:对称加密算法和非对称加密算法

对称加密算法:

算法

类型

分组长度

密钥长度

DES

分组

64

64(56)

3DES

分组

64

64(56)*3

AES

分组

128

128\192\256

SM1

分组

128

128

SM4

分组

128

128

RC4

   

根据加密的目的不同可以选用不同的算法,如果是用于分组的话,建议使用AES256,这个是安全的

非对称加密算法:

RSA

1024/2048

加密/签名

ECC

128/256

加密/签名

SM2

256

加密/签名

非对称加密算法有公钥和私钥。使用时建议使用RSA2048,这个安全的(RSA1024目前是安全的,不过随着技术的发展,就不好说了)

如果用私钥对信息进行加密,是做为加密来使用的,也就是说让密文不可破解

如果用公钥对信息进行加密,就是为了做签名来使用的,签名的目的是使得这个过程不可篡改,不可抵赖,不可伪造,下面简单介绍一下签名:

签名:百度上的以sha编码加密为例

(1) 被发送文件用SHA编码加密产生128bit的数字摘要(见上节)。

数字摘要

(2) 发送方用自己的私用密钥对摘要再加密,这就形成了数字签名。

(3) 将原文和加密的摘要同时传给对方。
(4) 对方用发送方的公共密钥对摘要解密,同时对收到的文件用SHA编码加密产生又一摘要。
(5) 将解密后的摘要和收到的文件在接收方重新加密产生的摘要相互对比。如两者一致,则说明传送过程中信息没有被破坏或篡改过。否则不然。

三: hash

参考freebuf上的该文章:如何安全的存储用户的密码

什么是hash

hash("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hbllo") = 58756879c05c68dfac9866712fad6a93f8146f337a69afe7dd238f3364946366
hash("waltz") = c0e81794384491161f1777c232bc6bd9ec38f616560b120fda8e90f383853542

Hash 算法是一种单向的函数。它可以把任意数量的数据转换成固定长度的“指纹”,这个过程是不可逆的。而且只要输入发生改变,哪怕只有一个bit,输出的 hash值也会有很大不同。这种特性恰好合适用来用来保存密码。因为我们希望使用一种不可逆的算法来加密保存的密码,同时又需要在用户登陆的时候验证密码 是否正确。

还需要注意的是用来保护密码的hash函数跟数据结构课上见过的hash函数不完全一样。比如实现hash表的hash函数设计的目的是快速,但是不够安 全。只有加密hash函数(cryptographic hash functions)可以用来进行密码的hash。这样的函数有SHA256, SHA512, RipeMD, WHIRLPOOL等,推荐sha256。

我们平常最常听到的hash是指hash值,最常用的是md5的hash值,网上也有很多破解md5明文的网站。

如果你准备写认证系统,那么我参考freebuf上的文章做如下推荐:

存储一个密码:

1, 使用CSPRNG生成一个长的随机盐。 (盐的长度与hash值的长度相同,256位)

2, 将密码和盐拼接在一起,使用标准的加密hash函数比如SHA256进行hash

3, 将盐和hash记录在用户数据库中

验证一个密码:

1, 从数据库中取出用户的盐和hash

2, 将用户输入的密码和盐按相同方式拼接在一起,使用相同的hash函数进行hash

3, 比较计算出的hash跟存储的hash是否相同。如果相同则密码正确。反之则密码错误。

编码,加解密,签名,Hash的更多相关文章

  1. RSA 加解密 签名 示例

    import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStrea ...

  2. iOS RSA加解密签名和验证

    转自:http://www.jianshu.com/p/81b0b54436b8 Pre:在公司负责了一个项目,需要用到iOS RSA验证签名的功能.后台给我的仅仅是一个公钥的字符串.经过起初的一段时 ...

  3. Python rsa公私钥生成 rsa公钥加解密(分段加解密)-私钥加签验签实战

    一般现在的SAAS服务提供现在的sdk或api对接服务都涉及到一个身份验证和数据加密的问题.一般现在普遍的做法就是配置使用非对称加密的方式来解决这个问题,你持有SAAS公司的公钥,SAAS公司持有你的 ...

  4. python实现RSA加密和签名以及分段加解密的方案

    1.前言 很多朋友在工作中,会遇到一些接口使用RSA加密和签名来处理的请求参数,那么遇到这个问题的时候,第一时间当然是找开发要加解密的方法,但是开发给加解密代码,大多数情况都是java,c++,js等 ...

  5. C#微信公众号开发系列教程三(消息体签名及加解密)

    http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...

  6. 使用非对称算法RSA实现加解密和使用签名算法SHA1WithRSA、MD5withRSA生成签名以及验签

    不啰嗦,直接上源码 package com.hudai.platform.manager.util; import java.io.ByteArrayOutputStream; import java ...

  7. curses-键盘编码-openssl加解密【转】

    本文转载自;https://zhuanlan.zhihu.com/p/26164115 1.1 键盘编码 按键过程:当用户按下某个键时, 1.键盘会检测到这个动作,并通过键盘控制器把扫描码(scan ...

  8. RSA签名,加解密处理核心文件

    import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; import java.secur ...

  9. [Python3] RSA的加解密和签名/验签实现 -- 使用pycrytodome

    Crypto 包介绍: pycrypto,pycrytodome 和 crypto 是一个东西,crypto 在 python 上面的名字是 pycrypto 它是一个第三方库,但是已经停止更新,所以 ...

随机推荐

  1. mysql死锁示例

    MySQL有三种锁的级别:页级.表级.行级. MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking):BDB存储引擎采用的是页面锁(page-level locki ...

  2. Linux学习之路--启动VNC服务

    我的Linux是Fedora 13,安装方法如下: 1.打开终端,执行 # yum install -y tigervnc tigervnc-server 2.编辑/etc/sysconfi/vncs ...

  3. Team Homework #2 Decide the roles of each team member ——IloveSE

    大家好,我们是IloveSEers! 徐姗,我是一个性格开朗,但却认为计算机比较枯燥的女生.经过两年的学习,自己的编程能力,并不是很强,在这方便还需多多练习.对于软件工程这门课,我充满期待,因为我不仅 ...

  4. 主元分析PCA理论分析及应用

    首先,必须说明的是,这篇文章是完完全全复制百度文库当中的一篇文章.本人之前对PCA比较好奇,在看到这篇文章之后发现其对PCA的描述非常详细,因此迫不及待要跟大家分享一下,希望同样对PCA比较困惑的朋友 ...

  5. 【String to Integer (atoi) 】cpp

    题目: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input ca ...

  6. 《Soft Skill》一书中的好句子

    The biggest mistake that you can make is to believe that you are working for somebody else. Job secu ...

  7. ASP.NET MVC学习之视图篇(1)

    一.前言 不知道还有多少读者从第一篇开始一直学习到如今,笔者也会一直坚持将ASP.NET MVC的学习完美的结束掉,然后开始写如何配合其他框架使用ASP.NET MVC的随笔.当然笔者后面的随笔如果没 ...

  8. Bootstrap的宽度和分辨率的差别

    首先在bootstrap里面所有的样式并在pc上是根据px的单位来判断的,就是我们说的分辨率, @media(min-width:1200px){ ......里面的样式 } 那么就是说当你的屏幕放大 ...

  9. 【BZOJ】【3166】【HEOI2013】Alo

    可持久化Trie+set Orz zyf…… 搞区间中次大值不好搞,那么我们就反过来,找一个数,然后看它在哪些区间里是次大值…… (然而事实上我们并不用真的把这个区间具体是什么找见,只要知道它可以跟哪 ...

  10. 版本控制 - SVN/TortoiseSVN

    研读了blog: 1. http://www.open-open.com/lib/view/open1346982569725.html  2. http://www.360doc.com/conte ...