我得到了C#代码,我正在尝试使用Perl生成等效的SHA1.
public string GetHashedPassword(string passkey)
{
// Add a timestamp to the passkey and encrypt it using SHA1.
string passkey = passkey + DateTime.UtcNow.ToString("yyyyMMddHH0000");
using (SHA1 sha1 = new SHA1CryptoServiceProvider())
{
byte[] hashedPasskey =
sha1.ComputeHash(Encoding.UTF8.GetBytes(passkey));
return ConvertToHex(hashedPasskey);
}
}
private string ConvertToHex(byte[] bytes)
{
StringBuilder hex = new StringBuilder();
foreach (byte b in bytes)
{
if (b < 16)
{
hex.AppendFormat("0{0:X}", b);
}
else
{
hex.AppendFormat("{0:X}", b);
}
}
return hex.ToString();
}
Run Code Online (Sandbox Code Playgroud)
同样如下:
use Digest::SHA1 qw( sha1_hex );
my $pass …
Run Code Online (Sandbox Code Playgroud) 我想创建一个任意长度String的唯一散列(16个字符长).有没有一个很好的库可以为C++实现MD5或SHA-1,我可以用它实现这个目标?(可能还有一个如何使用它的例子)
我希望有人可以帮助我在C#中读取exe文件并从中创建一个SHA1哈希.我试图使用StreamReader和BinaryReader从可执行文件中读取.然后使用内置的SHA1算法我试图创建一个哈希但没有成功.StreamReader的算法结果是"AEUj + Ppo5QdHoeboidah3P65N3s =",而BinaryReader的算法结果是"rWXzn/CoLLPBWqMCE4qcE3XmUKw =".谁能帮助我从exe文件中获取SHA1哈希?谢谢.
BTW对不起我的英文;)
我正在尝试在ASP.NET应用程序和另一个基于UNIX的应用程序之间共享身份验证,其中散列密码存储在数据库中.我需要确保两个平台上的哈希算法匹配.
这是我在C#中散列的方式:
var sha1 = new SHA1CryptoServiceProvider(); var passwordBytes = Encoding.UTF8.GetBytes(password); var passwordHash = sha1.ComputeHash(passwordBytes); var base64 = Convert.ToBase64String(passwordHash); return base64;
如果我使用密码,p@ssw0rd
那么散列是该散列57B2AD99044D337197C0C39FD3823568FF81E48A
的base64 V7KtmQRNM3GXwMOf04I1aP+B5Io=
.base64哈希是存储在db中的内容.
如果我在UNIX上做同样的事情,我得到一个完全不同的哈希:
echo p@ssw0rd | iconv -f ISO-8859-1 -t UTF-8 | shasum -a 1 | base64 -e
产生
ZTU3NmQwNmUzMTAwNmRkNzFhNTFjZTg5ZjViMGI4NWM2NTMyNzg3OCAgLQo=
如果您使用OpenSSL进行尝试,请使用此方法echo "p@ssw0rd" | openssl dgst -sha1 | openssl enc -base64
,您将获得相同的哈希值.
导致不同哈希计算的两个SHA1算法有什么不同?我也不腌这些.
UPDATE
秘诀如下:
echo -n "p@ssw0rd" | openssl dgst -sha1 -binary | openssl enc -base64
echo -n
剥离换行符,-binary
是必不可少的.
希望这可以帮助别人.
谢谢,马克
如何让Java的MessageDigest.digest()结果与Perl的sha1-> digest相匹配?MessageDigest.digest()接受string.getBytes(),其中Perl我只是将一个字符串传递给sha1对象.这就是失败的原因吗?
JAVA:
String mystring ="zWh9YZX3";
MessageDigest.getInstance("SHA-1").digest(mysrting.getBytes())
Run Code Online (Sandbox Code Playgroud)
Perl的:
$mystring ="zWh9YZX3";
$sha1 = Digest::SHA1->new;
$sha1->add($mystring);
$digest = $sha1->digest;
Run Code Online (Sandbox Code Playgroud) 在这里,我附上我的代码,基于"SHA-1"算法的Java代码,手动给出相同的输入值:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import sun.misc.BASE64Encoder;
public class NewClass {
public static void main(String args[]) throws NoSuchAlgorithmException
{
MessageDigest digest = MessageDigest.getInstance("SHA-1");
System.out.println("Algorithm :"+digest.getAlgorithm());
digest.update("welcome".getBytes());
byte[] result = digest.digest();
hash = (new BASE64Encoder()).encode(result);
MessageDigest digest1 = MessageDigest.getInstance("SHA-1");
digest1.update("welcome".getBytes());
byte[] result1 = digest1.digest();
System.out.println(result);
System.out.println(result1);
String hash1 = (new BASE64Encoder()).encode(result);
System.out.println("Digest value"+hash);
System.out.println("Digest value"+hash1);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Algorithm :SHA-1
[B@42e816
[B@9304b1
Digest value wLE3/i15JFnyb/djzORFdKW1qwM=
Digest value wLE3/i15JFnyb/djzORFdKW1qwM=
Run Code Online (Sandbox Code Playgroud)
上述算法产生相同的哈希码,但中间值不相同.这是为什么?
我用的是什么:
Java的:
public String sha1(String s) {
try {
// Create MD5 Hash
MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
digest.update(s.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < messageDigest.length; i++)
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
Run Code Online (Sandbox Code Playgroud)
结果:
java: System.out.println(sha1("foobar123dsadn23u1wdqqwdyxdasd"));
php: echo sha1('foobar123dsadn23u1wdqqwdyxdasd');
php: d8033103e9aaf67af13a4b45534b2d0f6d8dfded
java: d83313e9aaf67af13a4b45534b2df6d8dfded
Run Code Online (Sandbox Code Playgroud)
为什么两个哈希不一样?
我试图用公钥解密字符串以与哈希进行比较.代码是关注的
byte[] dectyptedText = null;
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
dectyptedText = cipher.doFinal(text);
return dectyptedText;
Run Code Online (Sandbox Code Playgroud)
上面的代码生成一个这样的字符串(base64encode)
MCEwCQYFKw4DAhoFAAQUy3qkZYgfRVo2Sv1F9bHa3pDs044 =
哈希由以下代码生成
byte[] key = stringToHash.getBytes();
MessageDigest md = MessageDigest.getInstance("SHA-1");
hash = md.digest(key);
Run Code Online (Sandbox Code Playgroud)
上面的代码生成如下所示的示例哈希
y3qkZYgfRVo2Sv1F9bHa3pDs044 =
如果你注意到两者都有正确的哈希值,即y3qkZYgfRVo2Sv1F9bHa3pDs044 =但解密代码会产生并预先添加额外的MCEwCQYFKw4DAhoFAAQU
不明白这个额外的东西是如何添加的以及为什么.
请问有人对此有所了解吗?
谢谢
炳
这是一个非常简单的程序,它接受一个整数并将其转换为字符串.从那里我使用SHA1散列字符串并将哈希打印到控制台.但是当我重新运行程序时,我得到了一个不同的哈希值,用于我程序中定义的相同整数.知道为什么会这样,我该怎么办呢?
这是我的计划.要编译我使用:gcc -o myhash myhash.c -lcrypto
int main (int argc, char* argv[]){
//sha1 returns 20 byte hash
unsigned char myHash[SHA_DIGEST_LENGTH];
//my integer that I want to hash
int myInt = -1613543;
//convert to char string
char input[50];
snprintf(input,50,"%d",myInt);
//compute hash
SHA1(input,sizeof(input),myHash);
//print hash
int i;
for(i=0;i<SHA_DIGEST_LENGTH;i++){
printf("%02x", myHash[i]);
}
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我在使用标准Google SignIn时遇到问题:在构建我的Android应用程序版本后,Google SignIn无效.我按照这里解释的指南来构建一个版本:https: //developer.android.com/studio/publish/app-signing.html
然后,我转到谷歌API控制台,我使用私钥创建一个新的客户端OAuth 2.0:生成SHA1
keytool -exportcert -keystore MY_PATH_TO_PRIVATE_KEY -list -v
Run Code Online (Sandbox Code Playgroud)
我的密钥库的密码是请求的,然后我看到SHA1.我认为这个程序是正确的,因为我使用相同的Facebook登录,它的工作原理.我正在使用最新版本的Android Studio.
我是否要在Gradle配置或Android Manifest中添加一些?