zoukankan      html  css  js  c++  java
  • 如何安全的存储用户密码?

      原文链接:请猛击

    本文我只截取了一小部分知识,请看原文。

    一:基础知识:加盐哈希( Hashing with Salt)

    我们已经知道,恶意攻击者使用查询表和彩虹表,破解普通哈希加密有多么快。我们也已经

    了解到,使用随机加盐哈希可以解决这个问题。但是,我们使用什么样的盐值,又如何将其

    混入密码中?

    盐值应该使用加密的安全伪随机数生成器( Cryptographically Secure Pseudo-Random

    Number Generator,CSPRNG )产生。CSPRNG和普通的伪随机数生成器有很大不同,

    如“ C ”语言的rand()函数。顾名思义, CSPRNG 被设计成用于加密安全,这意味着它能提

    供高度随机、完全不可预测的随机数。我们不希望盐值能够被预测到,所以必须使用 CSPRNG 。

    下表列出了一些当前主流编程平台的 CSPRNG 方法。 

    PlatformCSPRNG
    PHP mcrypt_create_iv, openssl_random_pseudo_bytes
    Java java.security.SecureRandom
    Dot NET (C#, VB) System.Security.Cryptography.RNGCryptoServiceProvider
    Ruby SecureRandom
    Python os.urandom
    Perl Math::Random::Secure
    C/C++ (Windows API) CryptGenRandom
    Any language on GNU/Linux or Unix Read from /dev/random or /dev/urandom

    每个用户的每一个密码都要使用独一无二的盐值。用户每次创建帐号或更改密码时,密码应采用一个新的随机盐值。

    永远不要重复使用某个盐值。这个盐值也应该足够长,以使有足够多的盐值能用于哈希加密。一个经验规则是,盐

    值至少要跟哈希函数的输出一样长。该盐应和密码哈希一起存储在用户帐号表中。

    存储密码的步骤:

    1. 使用 CSPRNG 生成足够长的随机盐值。

    2. 将盐值混入密码,并使用标准的密码哈希函数进行加密,如Argon2、 bcrypt 、 scrypt 或 PBKDF2 。

    3. 将盐值和对应的哈希值一起存入用户数据库。

    校验密码的步骤:

    1. 从数据库检索出用户的盐值和对应的哈希值。

    2. 将盐值混入用户输入的密码,并且使用通用的哈希函数进行加密。

    3. 比较上一步的结果,是否和数据库存储的哈希值相同。如果它们相同,则表明密码是正确的;否则,该密码错误。

  • 相关阅读:
    [ Algorithm ] N次方算法 N Square 动态规划解决
    [ Algorithm ] LCS 算法 动态规划解决
    sql server全文索引使用中的小坑
    关于join时显示no join predicate的那点事
    使用scvmm 2012的动态优化管理群集资源
    附加数据库后无法创建发布,error 2812 解决
    浅谈Virtual Machine Manager(SCVMM 2012) cluster 过载状态检测算法
    windows 2012 r2下安装sharepoint 2013错误解决
    sql server 2012 数据引擎任务调度算法解析(下)
    sql server 2012 数据引擎任务调度算法解析(上)
  • 原文地址:https://www.cnblogs.com/zhangxiaoliu/p/6965213.html
Copyright © 2011-2022 走看看