Я нашел свои решения здесь: link: Eloquent create говорит, что столбец не имеет значения по умолчанию
Ответ внизу, я просто процитировал ответ также
imbhavin95 ответил 8 месяцев назад
Причина, по которой сейчас происходит, заключается в том, что Laravel 5.1 по умолчанию использует строгий режим для MySQL.
Если вы например, вернуться к предыдущему поведению, обновить файл config / database.php и установить «strict» => false для вашего соединения.
blockquote>кредиты этому человеку https: // laravel .io / пользователь / imbhavin95
UPDATE Вы можете использовать Apache Commons Codec (версия 1.7+), чтобы выполнить это задание для вас.
DigestUtils.sha1Hex(stringToConvertToSHexRepresentation)
Благодаря @ Jon Onstott для этого предложения.
Старый ответ Преобразуйте байт-массив в шестнадцатеричную строку. Real How How сообщает вам, как .
return byteArrayToHexString(md.digest(convertme))
и (скопирован из Real's How To)
public static String byteArrayToHexString(byte[] b) {
String result = "";
for (int i=0; i < b.length; i++) {
result +=
Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
}
return result;
}
Кстати, вы можете получить более компактное представление с использованием Base64. Apache Commons Codec API 1.4, имеет эту приятную утилиту, чтобы убрать всю боль. см. здесь
Просто используйте библиотеку кодеков apache commons. У них есть класс утилиты под названием DigestUtils
Не нужно вдаваться в подробности.
String result = DigestUtils.sha1Hex("An input string")
; o)
– Jon Onstott
23 June 2015 в 05:58
Преобразовать байтовый массив в шестнадцатеричную строку.
public static String toSHA1(byte[] convertme) {
final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA-1");
}
catch(NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] buf = md.digest(convertme);
char[] chars = new char[2 * buf.length];
for (int i = 0; i < buf.length; ++i) {
chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
}
return new String(chars);
}
Это неправильно печатается, потому что вам нужно использовать кодировку Base64. С помощью Java 8 вы можете кодировать с помощью Base64 класса энкодера.
public static String toSHA1(byte[] convertme) {
md = MessageDigest.getInstance("SHA-1");
return Base64.getEncoder().encodeToString((md.digest(convertme));
}
Результат
Это даст вам ожидаемый результат работы 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
SHA-1 (и все остальные алгоритмы хэширования) возвращают двоичные данные. Это означает, что (на Java) они создают byte[]
. Этот массив byte
не представляет никаких конкретных символов, а это означает, что вы не можете просто превратить его в String
, как и вы.
Если вам нужен String
, тогда вы должны отформатировать этот byte[]
таким образом, который может быть представлен как String
(в противном случае просто сохраните byte[]
).
Два общих способа представления произвольных byte[]
, поскольку печатными символами являются BASE64 или простые шестнадцатеричные строки (т.е. представляющие каждый byte
на две шестнадцатеричные цифры). Похоже, вы пытаетесь создать шестнадцатеричную строку.
Там также есть еще одна ошибка: если вы хотите получить SHA-1 Java String
, вам нужно преобразовать это String
до byte[]
в первую очередь (поскольку вход SHA-1 также является byte[]
). Если вы просто используете myString.getBytes()
, как вы показали, то он будет использовать кодировку по умолчанию для платформы и, как таковая, будет зависеть от среды, в которой вы ее запускаете (например, он может возвращать разные данные на основе языкового / языкового значения вашей ОС ).
Лучшее решение - указать кодировку, используемую для преобразования String
-to- byte[]
следующим образом: myString.getBytes("UTF-8")
. Выбор UTF-8 (или другого кодирования, который может представлять каждый символ Юникода) является самым безопасным выбором здесь.
Как упоминалось ранее, используйте кодек apache commons. Рекомендуется также ребятам весны (см. DigestUtils in spring doc). Например ::
DigestUtils.sha1Hex(b);
Определенно не использовали бы здесь наивысший рейтинг.
Это простое решение, которое можно использовать при преобразовании строки в шестнадцатеричный формат:
private static String encryptPassword(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(password.getBytes("UTF-8"));
return new BigInteger(1, crypt.digest()).toString(16);
}
Это мое решение преобразования строки в sha1. Он отлично работает в моем приложении для Android:
private static String encryptPassword(String password)
{
String sha1 = "";
try
{
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(password.getBytes("UTF-8"));
sha1 = byteToHex(crypt.digest());
}
catch(NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch(UnsupportedEncodingException e)
{
e.printStackTrace();
}
return sha1;
}
private static String byteToHex(final byte[] hash)
{
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
encryptPassword("test")
и echo test|sha1sum
в терминале linux получить тот же результат? Они этого не делают.
– Tulains Córdova
17 December 2014 в 14:14
echo test
, вывод, включающий разрыв строки, будет передан по каналу на sha1sum
. Если вы хотите хэшировать простую строку без прерывания строки, вы можете использовать echo -n test | sha1sum
. Параметр -n
делает echo
без разрыва строки.
– MrSnrub
27 July 2018 в 00:04
База 64 Представление SHA1
Хэш:
String hashedVal = Base64.getEncoder().encodeToString(DigestUtils.sha1(stringValue.getBytes(Charset.forName("UTF-8"))));
Использование Класс Hava Hashing :
Hashing.sha1().hashString( "password", Charsets.UTF_8 ).toString()
Причина, по которой это не работает, заключается в том, что когда вы вызываете String(md.digest(convertme))
, вы говорите Java, чтобы интерпретировать последовательность зашифрованных байтов как строку. Вы хотите преобразовать байты в шестнадцатеричные символы.
DigestUtils.sha1Hex("my string")
, а не изобретать колесо (хотя интересно знать, как конвертировать в шестнадцатеричный)? – Jon Onstott 23 June 2015 в 15:34