0×00 前言
首先如果你对密码学的概念以及使用并不熟悉,或者你正需要进行一些密码学的引导,那么我推荐你阅读一下这篇内容。
此前我们就曾明确的表示,即使是安全建议也应该有个保质期。因此和我们过去发布的大多数博客文章不同,上面那篇内容实际上是处在一种“随时更新”的状态:当对安全的需求变化以及新的攻击形式被发现时,我们都会做出相应的变更。
这里我们提出一个密码安全观点: 不要存储明文密码,而是存储密码的哈希值。
事实上现在,生成安全的密码哈希值非常简单。
但这里有个问题就是,你可能希望别人可以设置一个带密码的帐号,通过这个帐号和密码,别人可以登录到你的程序中,那么这一功能要怎样才能安全的实现?
而解决这个问题也很简单——使用libsodium。它可以为大多数语言提供一个安全的密码哈希API。在1.0.8版本之前它使用的是scrypt算法,但从1.0.9版本开始,它还会提供Argon2,这是从最近的哈希密码对比中精心挑选出来的一个算法。Libsodium会提供对大多数编程语言的绑定。
Libsodium文件
Libsodium源码
注意:这里公布了一个对Argon2i的攻击——Argon2通用密码哈希的变种表示。实际上它的影响并不严重,但它可能会导致一个新的变种(也许是Argon2x,因为它可能会使用XOR而不是覆盖内存来缓解这些攻击)。
如果你因为种种原因无法在安装libsodium和你的要求之间进行调和的话,你还有其他的选择。在准备这篇博客时,我们的团队已经研究了多种编程语言的几个密码哈希库,下面就为大家利用示例代码介绍下。
目前可接受的密码哈希算法主要有:
Argon2 密码哈希比赛的冠军
bcrypt
scrypt
以及密码哈希比赛的其他参赛算法 (Catena, Lyra2, Makwa, and yescrypt)
PBKDF2 最糟糕的一种选择
0×01 PHP
PHP第一种方案
首先确认你使用的版本是否支持PHP。如果支持,那么PHP密码API将能够使用。如果不支持,那么可以尝试进行升级,如果还是不行,检查一下password_compat。
$hash = password_hash($userPassword, PASSWORD_DEFAULT);
显然 password_hash() 使用的是加盐计算的哈希值。根据自己实际情况进行调整,如果硬件支持的话,使用最小绝对值10.12是很好的,其默认的10。
$hash = password_hash($userPassword, PASSWORD_DEFAULT, ['cost' => 12]);
事实上验证一个密码的哈希存储是很简单的:
if (password_verify($userPassword, $hash)) { // Login successful. if (password_needs_rehash($userPassword, PASSWORD_DEFAULT, ['cost' => 12])) { // Recalculate a new password_hash() and overwrite the one we stored previously }}
在PHP7中,PASSWORD_DEFAULT仍然使用bcrypt。在未来的版本中,它可能会逐渐变为Argon2.
PHP第二种方案
如果你没办法使用libsodium(当然我们强烈建议你使用),你仍然可以用PHP中加密哈希,只需要通过来自PECL 的Dominic Black的Scrypt PHP 扩展即可。
#If you don't have PECL installed, get that first.pecl install scryptecho "extension=scrypt.so" > /etc/php5/mods-available/scrypt.iniphp5enmod scrypt
接下来,把一个PHP包装捆绑在你的工程中。
# Hashing$hash = \Password::hash($userProvidedPassword);# Validationif (\Password::check($userProvidedPassword, $hash)) { // Logged in successfully.}
0×02 JAVA
JAVA第一种方案
在Java程序中进行安全的密码哈希,除了 libsodium还有jBCrypt,能够提供bcrypt密码哈希算法。
String hash = BCrypt.hashpw(userProvidedPassword, BCrypt.gensalt());
验证一个在Java中的bcrypt hash:
if (BCrypt.checkpw(userProvidedPassword, hash)) { // Login successful.}
JAVA第二种方案
有一个java实现的scrypt,但它需要你指定参数,而不会提供一个默认值给你。
# Calculating a hashint N = 16384;int r = 8;int p = 1;String hashed = SCryptUtil.scrypt(passwd, N, r, p);# Validating a hashif (SCryptUtil.check(passwd, hashed)) { // Login successful}
0×03 C# .NET
C#(.NET)第一种方案
我们推荐Martin Steel的BCrypt.NET fork而不是 System.Security.Cryptography.Rfc2898DeriveBytes ,它是 PBKDF2-SHA1 (我们不是说 PBKDF2-SHA1 不安全,但相对来说bcrypt更好一些。
// Calculating a hashstring hash = BCrypt.HashPassword(usersPassword, BCrypt.GenerateSalt());// Validating a hashif (BCrypt.Verify(usersPassword, hash)) { // Login successful}
C#(.NET)第二种方案
这里同样有一个Scrypt 包 在NuGET中。
// This is necessary:ScryptEncoder encoder = new ScryptEncoder();// Calculating a hashSecureString hashedPassword = encoder.Encode(usersPassword);// Validating a hashif (encoder.Compare(usersPassword, hashedPassword)) { // Login successful}
0×04 Ruby
Ruby 第一种方案
按照笔者一如既往的规律,这里是一个对 bcrypt密码哈希的 Ruby gem 。
require "bcrypt"# Calculating a hashmy_password = BCrypt::Password.create(usersPassword)# Validating a hashif my_password == usersPassword # Login successful
要注意的是截止本文发布,该库仍然没有遵循加密编码的最佳实践。因此在他们抽出时间打补丁前都需要考虑到这一点。
Ruby 第二种方案
在Ruby中进行Scrpyt哈希
这也是一个对 bcrypt密码哈希的 Ruby gem 。
require "scrypt"# Calculating a hashpassword = SCrypt::Password.create(usersPassword)# Validating a hashif password == usersPassword # Login successful
0×05 Python
Python 第一种方案
好了你猜的没错还是使用 bcrypt python 包 ( GitHub )
import bcryptimport hmac# Calculating a hashpassword = b"correct horse battery staple"hashed = bcrypt.hashpw(password, bcrypt.gensalt())# Validating a hash (don't use ==)if (hmac.compare_digest(bcrypt.hashpw(password, hashed), hashed)): # Login successful
Python开发人员通常更喜欢passlib (Bitbucket),尽管它的API命名并不正确。(”加密” 而不是 “hash”):
from passlib.hash import bcrypt# Calculating a hashhash = bcrypt.encrypt(usersPassword, rounds=12)# Validating a hashif bcrypt.verify(usersPassword, hash): # Login successful
Python 第二种方案
目前我们发现除了libsodium以外只有 django-scrypt package .可以较为健全的实现。其他的我们还在寻找中。
0×06 Node.js
Node.js 第一种方案
在Node.js上bcrypt( https://www.npmjs.com/package/bcrypt)有两种安全的实现方式,尽管bcrypt看起来是首选。
在下面的例子中,我们大量的使用了Promises来简化错误处理:
var Promise = require("bluebird");var bcrypt = Promise.promisifyAll(require("bcrypt"));function addBcryptType(err) { // Compensate for `bcrypt` not using identifiable error types err.type = "bcryptError"; throw err;}// Calculating a hash:Promise.try(function() { return bcrypt.hashAsync(usersPassword, 10).catch(addBcryptType);}).then(function(hash) { // Store hash in your password DB.});// Validating a hash:// Load hash from your password DB.Promise.try(function() { return bcrypt.compareAsync(usersPassword, hash).catch(addBcryptType);}).then(function(valid) { if (valid) { // Login successful } else { // Login wrong }});// You would handle errors something like this, but only at the top-most point where it makes sense to do so:Promise.try(function() { // Generate or compare a hash here}).then(function(result) { // ... some other stuff ...}).catch({type: "bcryptError"}, function(err) { // Something went wrong with bcrypt});
Node.js 第二种方案
我们推荐 scrypt for humans,这是一个对开发人员很友好的 node-scrypt 包装器,非常容易使用。
var Promise = require("bluebird");var scrypt = require("scrypt-for-humans");// Calculating a hash:Promise.try(function() { return scrypt.hash(usersPassword);}).then(function(hash) { // Store hash for long term use});// Validating a hash:Promise.try(function() { return scrypt.verifyHash(usersPassword, hash);}).then(function() { // Login successful}).catch(scrypt.PasswordError, function(err) { // Login failed});
*原文地址: paragonie ,东二门陈冠希/编译 0xroot后期整理,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

Le type PHP invite à améliorer la qualité et la lisibilité du code. 1) Conseils de type scalaire: Depuis PHP7.0, les types de données de base sont autorisés à être spécifiés dans les paramètres de fonction, tels que INT, Float, etc. 2) Invite de type de retour: Assurez la cohérence du type de valeur de retour de fonction. 3) Invite de type d'union: Depuis PHP8.0, plusieurs types peuvent être spécifiés dans les paramètres de fonction ou les valeurs de retour. 4) Invite de type nullable: permet d'inclure des valeurs nulles et de gérer les fonctions qui peuvent renvoyer les valeurs nulles.

Dans PHP, utilisez le mot-clé Clone pour créer une copie de l'objet et personnalisez le comportement de clonage via la méthode de magie du clone \ _ \ _. 1. Utilisez le mot-clé Clone pour faire une copie peu profonde, en clonant les propriétés de l'objet mais pas aux propriétés de l'objet. 2. La méthode du clone \ _ \ _ peut copier profondément les objets imbriqués pour éviter les problèmes de copie superficiels. 3. Faites attention pour éviter les références circulaires et les problèmes de performance dans le clonage et optimiser les opérations de clonage pour améliorer l'efficacité.

PHP convient aux systèmes de développement Web et de gestion de contenu, et Python convient aux scripts de science des données, d'apprentissage automatique et d'automatisation. 1.Php fonctionne bien dans la création de sites Web et d'applications rapides et évolutifs et est couramment utilisé dans CMS tel que WordPress. 2. Python a permis de manière remarquable dans les domaines de la science des données et de l'apprentissage automatique, avec des bibliothèques riches telles que Numpy et Tensorflow.

Les acteurs clés des en-têtes de cache HTTP incluent le contrôle du cache, l'ETAG et la dernière modification. 1.CACHE-Control est utilisé pour contrôler les politiques de mise en cache. Exemple: Cache-Control: Max-Age = 3600, public. 2. Etag vérifie les changements de ressources par le biais d'identifiants uniques, exemple: ETAG: "686897696A7C876B7E". 3.Last-modifié indique le dernier temps de modification de la ressource, exemple: dernier modifié: mer, 21oct201507: 28: 00gmt.

Dans PHP, Password_Hash et Password_verify Les fonctions doivent être utilisées pour implémenter le hachage de mot de passe sécurisé, et MD5 ou SHA1 ne doit pas être utilisé. 1) Password_hash génère un hachage contenant des valeurs de sel pour améliorer la sécurité. 2) Password_verify Vérifiez le mot de passe et assurez-vous la sécurité en comparant les valeurs de hachage. 3) MD5 et SHA1 sont vulnérables et manquent de valeurs de sel, et ne conviennent pas à la sécurité de mot de passe moderne.

PHP est un langage de script côté serveur utilisé pour le développement Web dynamique et les applications côté serveur. 1.Php est un langage interprété qui ne nécessite pas de compilation et convient au développement rapide. 2. Le code PHP est intégré à HTML, ce qui facilite le développement de pages Web. 3. PHP traite la logique côté serveur, génère une sortie HTML et prend en charge l'interaction utilisateur et le traitement des données. 4. PHP peut interagir avec la base de données, traiter la soumission du formulaire et exécuter les tâches côté serveur.

PHP a façonné le réseau au cours des dernières décennies et continuera de jouer un rôle important dans le développement Web. 1) PHP est originaire de 1994 et est devenu le premier choix pour les développeurs en raison de sa facilité d'utilisation et de son intégration transparente avec MySQL. 2) Ses fonctions principales incluent la génération de contenu dynamique et l'intégration à la base de données, ce qui permet au site Web d'être mis à jour en temps réel et affiché de manière personnalisée. 3) La large application et l'écosystème de PHP ont motivé son impact à long terme, mais il fait également face à des mises à jour de version et à des défis de sécurité. 4) Les améliorations des performances ces dernières années, telles que la sortie de PHP7, lui permettent de rivaliser avec les langues modernes. 5) À l'avenir, PHP doit faire face à de nouveaux défis tels que la conteneurisation et les microservices, mais sa flexibilité et sa communauté active le rendent adaptable.

Les principaux avantages du PHP comprennent la facilité d'apprentissage, un soutien solide sur le développement Web, les bibliothèques et les cadres riches, les performances élevées et l'évolutivité, la compatibilité multiplateforme et la rentabilité. 1) Facile à apprendre et à utiliser, adapté aux débutants; 2) une bonne intégration avec les serveurs Web et prend en charge plusieurs bases de données; 3) ont des cadres puissants tels que Laravel; 4) Des performances élevées peuvent être obtenues grâce à l'optimisation; 5) prendre en charge plusieurs systèmes d'exploitation; 6) Open source pour réduire les coûts de développement.


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Adaptateur de serveur SAP NetWeaver pour Eclipse
Intégrez Eclipse au serveur d'applications SAP NetWeaver.

Navigateur d'examen sécurisé
Safe Exam Browser est un environnement de navigation sécurisé permettant de passer des examens en ligne en toute sécurité. Ce logiciel transforme n'importe quel ordinateur en poste de travail sécurisé. Il contrôle l'accès à n'importe quel utilitaire et empêche les étudiants d'utiliser des ressources non autorisées.

Télécharger la version Mac de l'éditeur Atom
L'éditeur open source le plus populaire

Dreamweaver CS6
Outils de développement Web visuel

Dreamweaver Mac
Outils de développement Web visuel