我想生成SHA512散列密码,以便直接包含在/ etc/shadow文件中,以便与chef的用户资源一起使用.通常我会去stdlib的Digest库,但它不会以正确的格式生成哈希:
ruby-1.9.2-p136 :001 > require 'digest/sha2'
=> true
ruby-1.9.2-p136 :002 > Digest::SHA512.hexdigest('test')
=> "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff"
Run Code Online (Sandbox Code Playgroud)
shadow文件想要的格式是:
$6$/ShPQNXV$HJnibH9lw01qtYqyJQiBf81ggJB2BGUvKA7.kv39HGCeE.gD4C/SS9zAf5BrwOv3VJzvl99FpHYli9E8jykRC0
Run Code Online (Sandbox Code Playgroud)
我看过的事情:
为了比较,返回正确格式的东西是PHP的crypt,但我宁愿不必向PHP执行简单的操作.
我正在寻找一个Java函数来生成/验证密码哈希,crypt(3)如果sha512在"/etc/pam.d/common-password"中激活它们,就会将它们存储在Linux"/ etc/shadow"文件中. .
明文字符串"geheim"将转换为:
"$6$WoC532HB$LagBJ00vAGNGu8p9oeYDOSNZo9vTNTzOgPA.K0bJoiXfbcpj3jBuTkNwdzCrSNadRi8LanH1tH6tGGPPp/Lp3."
Run Code Online (Sandbox Code Playgroud)
来自http://www.akkadia.org/drepper/SHA-crypt.txt我明白,就像MD5一样,它不仅仅是一个类似SHA的哈希,DigestUtils或者是Java MessageDigest类产生的,而是一种更有魔力的算法.
例如,对于河豚,它会返回如下内容:
$2a$12$DEzG.CRsHpxpTOAHooQ.wuR6Xe9h6PxFPhOcOvf.lqDNw1TVYVnEO
它包含有关散列alg类型的信息,它包含salt.很多资源都说只是将这个值存储在数据库中,它将是安全的.但是,有人可能只是测试一个针对这些值的常用密码列表来破解它们中的一些吗?
我试图在java中实现以下代码:
var keyGenerator = new Rfc2898DeriveBytes(password, salt, 1000);
byte[] key = keyGenerator.GetBytes(32);
byte[] iv = keyGenerator.GetBytes(16);
using (AesManaged aes = new AesManaged())
{
using (ICryptoTransform encryptor = aes.CreateEncryptor(key, iv))
{
byte[] result = encryptor.TransformFinalBlock(content, 0, content.Length);
}
}
Run Code Online (Sandbox Code Playgroud)
使用以下一个:
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec keyspec = new PBEKeySpec(password, salt, 1000, 256);
Key key = factory.generateSecret(keyspec);
SecretKeySpec secret = new SecretKeySpec(key.getEncoded(), "AES");
byte[] iv = "how_to_generate_in_java_as_in_c".getBytes();
AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret, ivSpec);
byte[] result = …Run Code Online (Sandbox Code Playgroud) 根据crypt(3)手册,Blowfish(由$ 2a $前缀表示)是受支持的密码方法之一:
ID | Method
?????????????????????????????????????????????????????????
1 | MD5
2a | Blowfish (not in mainline glibc; added in some
| Linux distributions)
5 | SHA-256 (since glibc 2.7)
6 | SHA-512 (since glibc 2.7)
Run Code Online (Sandbox Code Playgroud)
然而,部分说Blowfish(不在主线glibc;在一些Linux发行版中添加)是令人困惑和未记录的,所以我有几个问题.
首先,如果"主线"glibc不支持Blowfish,那么哪个glibc呢?Ubuntu 14.04使用glibc 2.19,打包在libc6/libc6-dev软件包中.假设这是"主线"glibc,则不支持Blowfish.显然有一个叫做crypt_blowfish的补丁,为glibc增加了Blowfish支持.为什么Ubuntu默认没有启用它?最后但并非最不重要的是,在Ubuntu中使C crypt()函数了解Blowfish哈希的最简单方法是什么?
我正在将一些c代码从Linux迁移到Mac OSX(优胜美地).Mac OSX crypt()函数(在我已经确定的unistd.h中)与Linux中的gcc/gnu不同.我在Linux和Mac OSX上有测试程序,如果使用printf显示结果,crypt()c-library函数会显示34个字符的字符串.Mac OSX上的相同代码仅显示13个字符串.一些研究表明,差异显然是Linux crypt()库例程使用可能不同的加密算法从gnu/gcc Linux端的较长向量生成哈希.一些信息还表明Apple Mac OSX c-library crypt()函数仅使用DES来加密原始字符串加上salt.我想让我的测试代码在Linux和Mac OSX平台上产生相同的结果.
Apple Mac OSX是否有适当的crypt()函数,等同于gnu/gcc Linux版本,可能在某些开源加密库中?
或者在Mac OSX开发工具中的某个地方是否有适用于Apple Mac OSX的gnu/gcc等效crypt(3)功能?(我是Mac OSX的新手).我正在使用clang编译器,从Apple下载的Xcode东西的一部分,当前用于Yosemite 10.10.5,我猜我不是第一个遇到这种异常的人.Thanx任何信息.
啊.只是一点点编辑:Apple MacOSX的东西正在使用DES算法,因此在检查哈希值时会产生13个字符的结果.Gnu/gcc使用MD5算法,因此产生了34-char的哈希值.这在这里解释:http: //www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/crypt.html#crypt然后我提出了精炼的问题; 是否有使用MD5(或SHA512)代替DES的Mac OSX的crypt(3)等效函数?
(***第二次编辑注意:这很有趣.DES很差,但MD5可以在Kali Linux中使用"hashcat"破解?建议明显转到SHA512.学术测试/验证的详细信息.MD5破解是这里:https://uwnthesis.wordpress.com/2013/08/07/kali-how-to-crack-passwords-using-hashcat/ 不过,我的问题仍然存在.是否有适用于Mac OSX的MD5 crypt(3)功能?? 谢谢.)
(请原谅我对协议的无知.基于Mac OS X LLVM/gcc的crypt()函数是borked垃圾,仅限硬连线使用DES,一个经过验证的可破解散列,比MD5差.(用salt字符串调用$ 6 $,你会得到一个13字符的DES哈希.令人难以置信!)我发现了很多方法可以在Linux平台上正确创建密码哈希(即MD5和SHA512)(perl,python,它们通常使用"crypt"lib(在Linux上使用gcc中的"-lcrypt"选项),或者使用python的"passlib".但我的MacBook,刚更新到优胜美地10.10.5甚至没有"passlib"!(我的旧Fedora盒子运行Python 2.5.1,目前的CentOS盒子运行Python 2.6.6.讨厌的小Macbook表示Python 2.7.10,使用"python --version"命令.我在"ServerFault"网站上找到了这个优秀的帖子: https://serverfault.com/questions/330069/how-to-create-an-sha-512-hashed-password-for-shadow?newreg=df160746fbcd47878d600cbe76ec8b7f
第一个python和perl脚本在Linux上工作,因为他们正在使用glibc crypt(),我猜,但是没有"passlib.hash"似乎存在于任何地方,Linux或Mac OS X.
我怎么能在这台MacBook上创建一个像样的密码哈希呢?我是一个Mac OS X菜鸟,因为我已经确认Apple在其.plist文件中使用SHA512密码哈希,我确信这个功能必须存在于这个奇怪(但可爱)的外星硬件上.如果一个人好奇,你可以输入这个以在Yosemite上看到你的"ShadowHashData",从终端的cmd行:(对不起,忘了参考这个,发现它搜索的最后一点,真的很有帮助)
sudo defaults read /var/db/dslocal/nodes/Default/users/<yourusername>.plist ShadowHashData | tr -dc 0-9a-f | xxd -r -p | plutil -convert xml1 - -o - …Run Code Online (Sandbox Code Playgroud) PHP中的这行代码求值为true
echo '$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2' == crypt("enter-new-password",'$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2');
Run Code Online (Sandbox Code Playgroud)
我需要的是Golang中的crypt函数,它也将评估为true.
ATTEMPT 1
我尝试了这个,但它评估为false:
import "github.com/nyarla/go-crypt"
log.Println("$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2" == crypt.Crypt("enter-new-password","$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2"))
Run Code Online (Sandbox Code Playgroud)
ATTEMPT 2
我还尝试定义和使用我在其他地方找到的这个crypt函数,但它也返回false:
package main
import (
"fmt"
"unsafe"
)
// #cgo LDFLAGS: -lcrypt
// #define _GNU_SOURCE
// #include <crypt.h>
// #include <stdlib.h>
import "C"
// crypt wraps C library crypt_r
func crypt(key, salt string) string {
data := C.struct_crypt_data{}
ckey := C.CString(key)
csalt := C.CString(salt)
out := C.GoString(C.crypt_r(ckey, csalt, &data))
C.free(unsafe.Pointer(ckey))
C.free(unsafe.Pointer(csalt))
return out
}
Run Code Online (Sandbox Code Playgroud)
尝试3
我也试过这个,但它似乎没有支持CRYPT_BLOWFISH,这是旧的PHP5.3及更早版本所使用的:
所以我的问题是:
我如何获得一个golang地穴功能完全一样的琴弦的PHP crypt函数enter-new-password和$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2?
我有一个现有的数据库,我正试图把蛋糕应用程序放在上面.旧的应用程序在Perl中使用crypt()来散列密码.我需要在PHP应用程序中执行相同的操作.
在标准的cakephp应用程序中进行更改的正确位置在哪里?这样的改变会是什么样的?
我正在编写脚本并需要保存密码.出于开发目的,我一直在使用该crypt()功能,因为它简单易用.现在我已经完成了,我想用一些更好,更一致的东西来代替它.
我所担心的一些问题是:
我想要一些适用于PHP 4.3+的东西.
有什么可用的,还是我应该坚持crypt()?我想过要用md5(md5($password).$salt).感谢您的见解.
我只是想用来crypt()生成一个加密的密码,我写了一个调用该crypt()方法的demo .这是我的代码
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%s\n",crypt("abc","ab"));
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
我使用它编译它"gcc tem.c -lcrypt',当我运行它时,一切似乎都正确,但出现"段错误".请告诉我这个简单的程序有什么问题?